Ответы пользователя по тегу Алгоритмы
  • Как можно заполнить одну из 2 коробок по максимум?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Если вес является единственным параметром, то это "Задача линейного раскроя".

    Ну и нехватает критерия максимума. Например, критерием может быть минимальный остаток допустимого веса, а может быть и максимальный процент заполнения...
    Ответ написан
    Комментировать
  • Нечетное число в шахматном турнире?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Я считаю, что оптимальным является проведение квалификационного тура. Который отсеет "лишних".

    Применительно к показанному - из 17 участников выбираются случайным образом двое, которые играют между собой квалификацию за право выхода на турнир. После чего остаётся 16 участников, играющих 5 туров на выбывание. Будь участников, скажем, 19, квалификацию играли бы три пары.

    Если же среди участников имеется некоторое количество, подтверждённая квалификация которых достаточна, они могут быть исключены из числа участников квалификации. Например, если заявились 19 игроков, но пятеро из них КМС и лучше, то они сразу проходят в турнир, а три пары участников квалификации выбираются случайным образом из остальных 14 участников.
    Ответ написан
    Комментировать
  • Как найти начальную точку для определения маршрутов в двумерном массиве?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Всё бы ничего и мой код работал бы (чуть ниже), если бы был известен начальный маршрут от которого нужно отталкиваться.

    Ну так найдите начало (если оно гарантированно есть) или кандидата (если таковых несколько или может не быть).
    То есть просто ищите значение(я), которое присутствует в первом элементе пары, но отсутствует во втором по всему массиву.

    Применительно к показанному массиву - только значение USA соответствует описанному условию.

    А ещё - обязательно проверяйтесь на цикл. Например, исходные (А,Б),(Б,В),(В,Б) отправят вашу программу в нирвану... Как вариант, можно просто исключать уже использованные элементы из дальнейших итераций.
    Ответ написан
  • Как определить игрока быстрее всех нажавшего кнопку (web)?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Я вижу решение, близкое к желаемому.

    Сначала, при старте клиентского интерфейса, выполняется несколько (навскидку - может, и 10 достаточно, а, может, и 100 потребуется, следует определить экспериментально) передач с клиента на сервер, причём используется тот же протокол, который будет впоследствии использован для передачи информации о нажатии, и в каждой передаче в том числе передаётся точное время клиента (с максимально доступной точностью). Приходящие пакеты маркируются точным штампом времени получения (серверное время), с максимально доступной точностью. Полученный массив обрабатывается статистически, и определяется разница точного времени часов клиента и сервера и погрешность этого определения. Если статистическая ошибка велика, процесс повторяется.

    Далее, уже в момент нажатия, по той же технологии передаётся пакет с точным клиентским временем нажатия, и по подсчитанной ранее разности определяется точное время нажатия по времени сервера. Для всех клиентов это время сравнивается, и победителем объявляется тот, у кого время нажатия по серверу минимальное.

    Такой алгоритм (практически) не зависит от колебания времени доставки пакета от клиента серверу.

    Калибровка разности времени при необходимости может повторяться. Частота рекалибровки зависит достижимой точности определения локального и серверного времени и от требуемой точности вычисления разности. По моим очень приблизительным прикидкам, если требуемая точность составляет 100 мс, то рекалибровку следует проводить ежечасно.

    Если после 2-3 повторений калибровки установить точное значение разности не удалось - клиенту следует отказать в участии.
    Ответ написан
    6 комментариев
  • Как распределить число равномерно?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Обычный подход - тупо:

    Количество(Склад Номер Х) = ВсегоТовара * НомерСклада / ВсегоСкладов - Количество(Склады Номер 1 .. Х-1)


    Т.е. если, как в вопросе, три склада и 5 товаров:

    Склад 1: количество = 5 * 1 / 3 - 0 = 1,666 = 2 штуки
    Склад 2: количество = 5 * 2 / 3 - 2 = 1,333 = 1 штука
    Склад 3: количество = 5 * 3 / 3 - (2 + 1) = 1,666 = 2 штуки


    $amount = 5;
    $num = 3;
    
    for($used = 0, $i = 1; $i <= $num; $i++) {
      $used += ($current = round($amount * $i / $num - $used));
      echo("$i: $current\n");
    }


    https://phpize.online/sql/mysql57/undefined/php/ph...
    Ответ написан
  • Какими соседями будут граничные клетки на замкнутой поверхности?

    @Akina
    Сетевой и системный админ, SQL-программист.
    В матрице Z(0..m, 0..n) элемент X(a,b) является соседом элемента Y(c,d), если выполняются условия
    ((a-b) MOD (m+1)) входит в {0, 1, m}
    ((c-d) MOD (n+1)) входит в {0, 1, n}

    В случае, если соседи определяются только по вертикали/горизонтали, но не по диагонали, то одно из выражений должно быть нулём. Если только по диагонали - нуля быть не должно. Если оба выражения нулевые.. догадайся сам.

    PS. MOD - оператор получения остатка от целочисленного деления.
    Ответ написан
    Комментировать
  • Какая сложность под капотом у сравнения строка?

    @Akina
    Сетевой и системный админ, SQL-программист.
    o(n) и O(m*n), где m - длина строки.
    Ответ написан
    Комментировать
  • Доказано ли, и можно ли сжать произвольные данные до 20 байтов к примеру?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Допустим, существует некий алгоритм, который преобразует последовательность X длины M в последовательность Y, причём существует обратное преобразование. Неважно, что это за алгоритм конкретно - сжатие, создание "зерна" и пр. Но очевидно, что:

    1. Количество вариантов последовательности X составляет K в степени M, где K - размер словаря, т.е. количество возможных различимых значений одного элемента последовательности X. В случае байтовой последовательности это байт, т.е. K=256.

    2. Каждая последовательность X после преобразования даёт последовательность Y, причём две разные последовательности X дают разные последовательности Y.

    Соответственно количество возможных последовательностей Y равно количеству возможных последовательностей X. И соответственно если существует хотя бы одна последовательность Y короче последовательности X, то существует хотя бы одна последовательность Y длиннее последовательности X.

    Что, собственно, и наблюдается на абсолютно любом алгоритме компрессии - существуют входные данные, для которых результат попытки сжатия имеет бОльший размер, чем исходные данные.

    Что же до "зерна", которое разворачивается в гигабайты - во-первых, количество финальных миров определяется количеством значений "зерна", то есть вовсе даже не такое бесконечно большое, как кажется, во-вторых, созданный образ мира содержит значительное число повторяющихся элементов, а создание копий - это немножко не декомпрессия.
    Ответ написан
    Комментировать
  • Как реализовать алгоритм экспайринга элементов в базе данных?

    @Akina
    Сетевой и системный админ, SQL-программист.
    По-моему, ты накрутил сверх меры. Всё решается куда проще.

    Структура таблицы, максимально упрощённая:
    CREATE TABLE tasks (
        id PRIMARY KEY,
        definition,
        performer_id REFERENCES performer (id)
        expired_at DATETIME
    );

    Взятие (параметры - id обработчика и id задачи):
    UPDATE tasks
    SET performer_id = @performer_idб
        expired_at  = NOW() + INTERVAL 'performing time'
    WHERE ( expired_at IS NULL or expired_at < NOW() )
      AND ( id = @task_id )

    То есть, задачу можно взять, если её ещё никто не брал, или если время ожидания ответа на задачу истекло. И в качестве бонуса - видно, что либо задачу никто не брал, либо кто-то брал (только последний, если таких было несколько) и прогавал сроки.

    performing time может либо поставляться снаружи как параметр, либо быть свойством задачи (с соотв. полем в структуре таблицы).
    Ответ написан
    8 комментариев
  • Как вернуть первые N максимальных элементов из массива без сортировки массива?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Да собсно создаёшь итоговый массив размером N и перебираешь элементы исходного массива, помещая их в итоговый массив с поддержанием сортированности последнего. Соответственно первые N элементов исходного просто помещаются туда с сортировкой, а все последующие либо не помещаются, если они меньше наименьшего, либо помещаются в правильное место, чтобы сохранялась сортированность, выдавливая при этом наименьший из элементов. По завершении перебора в итоговом массиве находится требуемое число максимальных элементов.
    Ответ написан
    Комментировать
  • «Новый» подход к рекурсии?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Что-то уж больно на бред воспалённого сознания похоже.

    В любом, абсолютно любом рекурсивном алгоритме есть условия завершения рекурсии, при которых алгоритм возвращает специальное заранее статически заданное значение.

    Но можно начать и с обычных чисел Фибоначчи.


    В случае рекурсивной реализации ряда Фибоначчи это условие n<2 и специальное значение 1. Смешно, но совершенно такие же и условие, и спецзначение у Хофштадтера.
    Ответ написан
    Комментировать
  • Какой алгоритм используется при возможности 2 неудачных попыток?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Для бОльшей понятности условия будем считать что у нас есть 2 предмета. Оба разбились - эксперименты кончились. И будем считать, что задача - получить ответ за минимальное количество бросков.

    Рассмотрим, что у нас есть только один предмет. Очевидно, что придётся его кидать с 1 метра, с 2, с 3... пока не разобьётся. Максимум будет 5000 бросков.

    Но у нас есть 2 предмета.

    Тогда мы можем бросить первый не с 1 метра, а сразу с какого-то N. Если он разобьётся, то придётся второй кидать с 1, 2, ... и по максимуму второй кинем N-1 раз. а всего будет N бросков.

    Но если он не разбился, то мы можем бросить первый уже с бОльшей высоты. Какой? Допустим, он разобьётся. Чтобы получить по максимуму те же N бросков, второй предмет мы уже может бросить N-2 раз, а, значит, первый предмет надо сбрасывать с высоты N+(N-1).

    Если первый снова не разбился, на следующем шаге его можно сбросить с высоты N+(N-1)+(N-2)... и так далее.

    Лишнего нам тоже не надо. А, значит, надо подобрать такое наименьшее N, при котором N-й бросок первого предмета будет с 5000 метров или выше.

    Итого - имеем N+(N-1)+(N-2)+...+1 >= 5000. Сумму арифметической прогрессии знаем, квадратные уравнения решать умеем. Получаем N=100.
    Ответ написан
    Комментировать
  • Как найти количество простых чисел в массиве?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Задача явно требует расчёта этих самых простых чисел и переиспользования списка.

    Так что сначала генерим список простых чисел во вменяемом диапазоне, скажем, до тысячи. Берём очередное число. Если оно меньше квадрата самого большого из простых чисел списка, проверяем, что оно делится или не делится на какое-то из них. А если больше - просто перед проверкой догенерируем в список простые числа до нужного порога. При этом используем повторно ту же самую процедуру проверки числа на простоту.

    Нет, конечно, можно и сразу нагенерить простых до миллиона, но смысл?
    Ответ написан
    Комментировать
  • Пользователи и рабочий график: как хранить?

    @Akina
    Сетевой и системный админ, SQL-программист.
    в каком виде лучше хранить этот массив в бд..

    Налицо тривиальная связь типа "много-ко-много". И соответственно хранение - две таблицы связываемых сущностей и связующая таблица. Т.е.

    1) User (user_id, name, ...);
    2) Dates (date, type, ...);
    3) UsersDates (user_id references User (user_id), date references Dates (date));
    Ответ написан
  • Алгоритм поиска минимального количества ходов, требуемых для приведения всех элементов к одному числу (Python)?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Если количество элементов массива нечётно, то тем значением, к которому надо привести элементы, равно значению строго среднего элемента (медианы массива).

    Если количество элементов массива чётно, то в качестве конечного значения подходит любое значение между двумя средними элементами, включительно.

    Для того, чтобы убедиться в этом - просто подумай, как изменяется требуемое количество шагов выравнивания, если двигать конечное значение на 1 вправо или влево, в зависимости от того, сколько элементов справа и сколько слева.
    Ответ написан
    Комментировать
  • Как проверить матрицу смежности неориентированного графа на верность?

    @Akina
    Сетевой и системный админ, SQL-программист.
    rastr, как понимать Ваше
    написать не выходит
    , если Вы тут же приводите код - который, кстати, способен решить задачу. Ну разве что:
    1. Итерация идёт по отдельному столбцу либо строке - так что ставить верхнюю границу для i по всей матрице несколько неправильно
    2. По i надо итерировать до предпоследнего значения, а по j - от значения на 1 больше текущего i до последнего. Ибо если проверена какая-то пара, то нет смысла проверять её ещё раз "с обратной стороны", а уж равенство элемента самому себе так и вовсе проверять бессмысленно.

    В общем, приблизительно так (без точного соблюдения синтаксиса)
    bool is_adjacency_matrix_correct(const vector<string>& matrix) {
      size=matrix[0].size();
      for (auto i = 0; i < size-1; i++) {
        for (auto j = i+1; j < size; j++) {
          if (matrix[i][j] != matrix[j][i])
            return false;
        }
      }
      return true;
    }
    Ответ написан
    Комментировать
  • Как решить олимпиадную задачу python?

    @Akina
    Сетевой и системный админ, SQL-программист.
    По сути - для каждой антенны найти расстояние до ближайшего соседа, и вывести максимальное из этих расстояний, делённое пополам (вот читал это "Если диапазоны двух антенн имеют общую точку, эти антенны могут напрямую взаимодействовать" и ржал, представляя, как антеннам потребовалось взаимодействовать, и в эту общую точку поскакал придурок с репитером).

    Вторая часть задания вообще проста как лапоть. Так что основная проблема - для каждой антенны найти расстояние до ближайшего соседа. Ну тут для ускорения (если антенн реально дофига, 1000 из задания - это не дофига) можно использовать пред-отбор по сетке (для 1000 антенн - сетка 6*6) и пост-отбор если отклонение по любой координате больше текущего минимального расстояния. В среднем это снижает количество считаемых расстояний где-то втрое (999000 или 368000 расстояний - всё же разница).
    Ответ написан
    Комментировать