Ответы пользователя по тегу Алгоритмы
  • Какую формулу использовать?

    Adamos
    @Adamos
    Деление 17 монет на троих:
    15 монет делим на троих поровну, 2 монеты отдаем первому и второму из скидывавшихся.
    Не идеально справедливо, зато без бесконечных дробей, которые иначе неизбежны.
    При неравных долях сортируем скидывавшихся так, чтобы раньше получал внесший большую долю.
    Собственно, при этом должна восстановиться исходная картина - как же так, скидывались поровну, а в сумме 17 ;)
    Ответ написан
    Комментировать
  • Через какой алгоритм решать эту задачу?

    Adamos
    @Adamos
    Когда не знаешь, как решать задачу программно - это нормально.
    Надо взять листочек и начать решать ее руками.
    12 этаж, есть два варианта - вверх или вниз. Считаем их, получаем этажи, на каждом два варианта...
    Внезапно доходит, что если уже рассматривал варианты для этажа, то второй раз это можно не делать, результаты будут те же.
    Значит, помечаем посещенные этажи - и крутим варианты, отсекая те, которые ведут на уже посещенные.
    Банальной рекурсией, например...
    Из кода осталось только написать функцию, которая выдаст два варианта для текущего номера этажа - по подробной инструкции из задачи.
    Ответ написан
  • Как из первых N натуральных чисел составить максимальное количество пар, суммы которых являются простыми?

    Adamos
    @Adamos
    Подозреваю элементарное: под конец цикла остаются два числа, которые при сложении дают не простое, но больше их комбинировать не с чем. Задача-то переборная, а тут один проход без возвратов.
    Ответ написан
  • Какой есть алгоритм для оптимальной перегруппировки множеств (массивов)?

    Adamos
    @Adamos
    Перебрать исходную кашу. Набрать массив
    [14] => [A2, A7,  A8, A9, A10],
    [15] => [A9],
    [17] => [A1, A2, A4, A6, A8, A9],
    [18] => [A1, A2, A4, A6, A8, A9],
    [32] => [A5, A7, A9],
    [33] => [A5, A7, A9],

    ...
    И объединить ключи у тех, у которых одинаковый набор значений.
    Ответ написан
  • Как читать книгу Вирт, Алгоритмы и Структуры данных школьнику?

    Adamos
    @Adamos
    Программирование в начале изучения - навык. Для него достаточно учебника, где простым языком написано, какие есть структуры и алгоритмы и как их использовать. Незачем лезть в издания, для прочтения которых требуется знание матана. Они - для тех, кто хочет разобраться, как оценить оптимальность использования тех или иных алгоритмов и структур.
    Вы же и по методичке без всякой аналитики можете выучить синтаксис и начать практиковаться. Потом, если захочется, полезете глубже. Спойлер: многие и многие программеры до этого этапа не доходят никогда ;)
    Ответ написан
    Комментировать
  • Как бы упростить непростое сравнение строк?

    Adamos
    @Adamos Автор вопроса
    Попробовал составить бенчмарк для сравнения текущего... эм... сравнения с предложенными методиками.
    Данные - тысяча строк по тысяче символов. По сравнению с исходными данными в строках 2 заменены на 1, чтобы было более бинарно, но это все равно строки. Каждая строка сравнивается с каждой, кроме себя, итого почти миллион итераций.
    Старый код, который в вопросе, крутил эти данные 10,3 секунды.
    Новый код - 0,5 секунды:
    $h = gmp_hamdist(
        $firstGmp, // gmp_init первой строки вынесен за цикл
        gmp_init($other, 2)
    );
    $sum = $zeroes[$n1] + $zeroes[$n2]; // подсчитанные до цикла количества 0 в строках
    $percent = round(($sum - $h) * 100 / ($sum + $h));
    if ($percent >= 95) { ...

    Результаты идентичны. Собственно, только две строки из этой тысячи совпали на 96%, остальные - менее.
    Проверка, можно ли исключить из сравнения строки по общему количеству нулей, показала, что отсеивается менее 3%. Такие данные, да...

    Благодарю поучаствовавших в дискуссии и отдельно Stalker_RED - за практически готовое решение, причем "малой кровью".
    Ответ написан
    Комментировать
  • Почему код не проходит по тайм лимиту?

    Adamos
    @Adamos
    Функции работы со строками будут постоянно выделять память, это дорогая операция.
    Ваша задача, в сущности, не требует такого выделения.
    Достаточно завести два массива длиной в строку, заполнить первый числами по порядку и при каждой итерации заполнять другой перестановкой, а потом менять их местами.
    В конце составить строку по получившимся индексам символов.
    Это будет однозначно быстрее за счет стабильной памяти (в сущности, вообще не будет обращаться к памяти, все будет крутиться в кэше процессора).
    Ответ написан
  • Какой язык программирования выбрать для изучения основ работы с алгоритмами и структурами данных?

    Adamos
    @Adamos
    Для изучения основ - любой с С-подобным синтаксисом, эти оба годятся.
    А вот если захочется более глубокого понимания - стоит опуститься к С/С++, где вынужденная возня с данными на уровне байт в памяти даст твердую основу насчет реальной оптимальности того или иного алгоритма.
    На высокоуровневом языке слишком много прослоек, чтобы прочувствовать, над чем на самом деле пыхтит процессор ;)
    Ответ написан
    Комментировать
  • Какие есть лучшие книги по программированию 2022 для новичка?

    Adamos
    @Adamos
    книги по программированию (без привязки к ЯП)

    "Посоветуйте лучшие книги по музыке (без привязки к инструменту)".
    Ответ написан
    2 комментария
  • Как преобразовать 3-х цветную RGB модель в 8 цветов?

    Adamos
    @Adamos
    Вы эту 8-цветную палитру сами придумали или подсмотрели в каком-нибудь дурном учебнике по информатике?
    Однозначного перевода тут не может быть уже хотя бы потому, что оранжевый = красный + желтый и т.п. А розовый = уполовиненный красный.
    Цветовые модели предполагают, что каждый цвет незаменим или хотя бы однозначно вычисляется при переводе. У вас же получаются 5-мерные поверхности в 8-мерных координатах, каждая из точек которых соответствует одному и тому же RGB-значению.
    Ответ написан
  • Какие есть варианты проверить, что у судоку только одно решение?

    Adamos
    @Adamos
    Вариант проверить, что у головоломки есть только одно решение, только один.
    Написать решатель такой головоломки и скормить ему задание. Если он успешно ее решает - результат единственный. Если упирается в "вилки" - значит, головоломка составлена неправильно.
    Все подобные головоломки составляются на компьютере именно таким образом:
    - заполняется готовое поле решения
    - убирается по одной цифре, после чего запускается решатель
    - если он не смог решить головоломку, цифра возвращается на место
    - цикл повторяется до перебора всех цифр (или не всех, если нужно составить головоломку меньшего уровня сложности).
    Например, в наборе головоломок от Simon Tatham судоку тоже есть (под названием Solo), и составляется она именно так.
    Ответ написан
    2 комментария
  • Как эффективно и лаконично отсортировать файл из строк не вмещающихся в память?

    Adamos
    @Adamos
    А зачем вам вся строка для сортировки?
    Вам она нужна только до того байта, который не совпадет с другими строками.
    Взять от каждой строки по 64Kб, отранжировать по отличиям в этой части, продолжить читать только у тех, у которых она совпадает. Повторять чтение кусков до прекращения совпадений.
    Ответ написан
    5 комментариев
  • Как вписать прямоугольник в многоугольник?

    Adamos
    @Adamos
    Если все угля прямые - это не многоугольник, а составная фигура из прямоугольников.
    Разбить на мельчайшие (первая фигура - на три, вторая - на пять) и комбинаторикой проверить, какие с какими складываются в более крупные, сравнивая результирующую площадь.
    Собственно, если оно, как на рисунке, состоит из квадратиков - первый этап уже выполнен.
    Ответ написан
    Комментировать
  • Каким алгоритмом отображать кнопки со свойствами?

    Adamos
    @Adamos
    Хм. Я, видимо, неверно понял вопрос, сочтя "отображать" ключевым словом.
    Нужен всего лишь алгоритм отбора позиций по списку свойств?
    Ну, делаешь для каждой битовую маску из ее свойств, и две такие же маски - по отмеченным свойствам.
    Побитовое И свойств позиции с маской "включенных" должно равняться маске включенных, а с маской "выключенных" - нулю.
    Ответ написан
    Комментировать
  • Как проверить вхождение диапазона дат в определенный диапазон?

    Adamos
    @Adamos
    Два временных интервала не пересекаются, если начало и конец одного из них раньше начала второго. Элементарное условие.
    Ответ написан
  • Путь коня или какова польза ограничений?

    Adamos
    @Adamos
    Для больших полей вообще может иметь смысл перестроить алгоритм на определение самой "зажатой" на текущий момент клетки (той, в которую можно попасть из наименьшего количества клеток и при этом хотя бы одна из них уже занята) - и выстраивания кратчайшего пути до нее. Возвращаясь, если такой путь приводит к недостижимым клеткам.
    Ответ написан
    1 комментарий
  • Доказано ли, и можно ли сжать произвольные данные до 20 байтов к примеру?

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

    Adamos
    @Adamos
    Ну, самое тупое - отсортировать множество по возрастанию (1 - 7) и перебирать его перестановки по принципу счетчика.
    На каждой итерации проверяем, получается ли сумма первых n элементов равной половине суммы всего множества. Такой набор (со всеми перестановками второй части) будет решением. Если не сложилось - пропускаем все перестановки до изменения n-ого (или (n-1)-ого) элемента, потом продолжаем.

    P.S. Собственно, раз вам нужно с точностью до перестановки - вам и счетчик нужно увеличивать с условием, что все элементы от первого до n-ного отсортированы по возрастанию.
    Ответ написан
    Комментировать
  • Какие есть Алгоритмы генерации сетки Судоку?

    Adamos
    @Adamos
    Вряд ли кто-либо, всерьез занимавшийся программированием головоломок, мог не видеть коллекцию от Simon Tatham - с открытой лицензией и исходниками.
    Ответ написан
    Комментировать