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

    @res2001
    Developer, ex-admin
    Алгоритмы это классно, книга Кормена закроет большую часть вопросов по ним.
    По ассемблеру (в т.ч. и для АРМ) есть несколько толстых красивых книг у издательства ДМК пресс, можешь поискать у них на сайте. Не читал. Думаю, что не стоит пока туда лезть, разве что очень-очень руки чешутся.

    Из того, что реально необходимо в большинстве проектов:
    1. параллельное программирование: Энтони Уильмс C++. Практика многопоточного программирования
    2. сетевое программирование: Уильям Стивенс UNIX: Разработка сетевых приложений
    3. Разработка под линукс: Керриск Майкл Linux API. Исчерпывающее руководство
    4. базы данных. Тут очень много книг и много вариантов так что советовать ничего не буду, но стоит освоить работу хотя бы с одной реляционной базой данных и знать SQL. Рекомендую смотреть в сторону Postgres.
    Ответ написан
    Комментировать
  • Для чего внутри связного списка нужен массив?

    @res2001
    Developer, ex-admin
    Видимо планируется хранить список на медленном устройстве хранения (на диске). Тогда такое построение связного списка вполне оправдано - за одно чтение можно прочитать несколько блоков данных.
    Возможно примерно таким же способом хранятся таблицы в СУБД. Называться это может по разному.
    Так же в СУБД часто применяют b-tree для хранения индексов, в этом дереве то же хранится несколько элементов данных в одном узле.
    Ответ написан
    Комментировать
  • Как бы упростить непростое сравнение строк?

    @res2001
    Developer, ex-admin
    Если в отдельной таблице базы хранить еще и предварительно посчитанные количества нулей для каждой позиции во всех строках, то задача сократится до 1 прохода по символам новой строки.
    При добавлении/удалении строк, надо будет модифицировать и таблицу с количеством нулей.
    Ответ написан
  • Какой алгоритм быстрее и почему?

    @res2001
    Developer, ex-admin
    Ваш алгоритм быстрее. Но не лаконичнее. Это нормальное явление. Регулярно скорость достигается усложнением алгоритма. Но если раскрыть тему sort, то второй алгоритм уже не покажется таким уж простым.
    Еще ваш алгоритм не портит входные данные - часто это бывает важно.
    Ответ написан
    1 комментарий
  • Как вернуть первые N максимальных элементов из массива без сортировки массива?

    @res2001
    Developer, ex-admin
    Вместо сортировки можно использовать алгоритм выборки k-той статистики (quik select).
    Алгоритм не полностью сортирует массив, а только те элементы, которые необходимо для получения k-ой статистики. Для вашей задачи алгоритм надо вызывать N раз (с параметром от 1 до N).
    Чтоб не портить оригинальный массив можно сделать копию, содержащую ссылки на элементы оригинального массива и вызывать алгоритм на копии.

    Если N относительно не большое и массив не велик, то можно просто искать максимум N раз. При нахождении очередного максимума заменять значение элемента на минимально возможное и сохранять ссылку на измененный элемент. После нахождения всех N максимумов - восстанавливать значения в массиве.
    Ответ написан
    3 комментария
  • Почему вставка элементов занимает такое время?

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

    @res2001
    Developer, ex-admin
    Просто размышление.
    Логика подсказывает, что такой подход применяется, когда нужно не просто обойти все дерево как-нибудь, а обойти в порядке сортировки дерева (или в обратном порядке).

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

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

    @res2001
    Developer, ex-admin
    Дерево на основе связного списка это вообще первое что приходит в голову, когда думаешь, как реализовывать дерево. Правда это не обычный последовательный связный список, а иерархический.
    Ответ написан
  • Как сделать сортировку Шелла на Си?

    @res2001
    Developer, ex-admin
    Возвращайте значение iterations из shellsort. В main суммируйте эти значения и в конце находите среднее.
    Ответ написан
    Комментировать
  • Есть ли эффективый и не сложный алгоритм посика ярко выраженных пиков в 2D массивах без ML?

    @res2001
    Developer, ex-admin
    Можно находить разность соседних элементов. Если модуль разности больше какой-то величины - ярко выраженный пик.
    Фиксированную величину можно взять как среднее значение разностей или медианное или что-то другое.
    Ответ написан
  • Какие паттерны использовать для игровых ботов?

    @res2001
    Developer, ex-admin
    Массив/хэш таблица с функциями реализующими ветки switch, по переменной выбираете из массива/хэша нужную функцию и вызываете ее. Весь switch расползется по разным функциям.
    Не силен в JS, поэтому без кода.
    Ответ написан
  • Стоит ли это заучивать?

    @res2001
    Developer, ex-admin
    Что и Фурье выучил? А префиксные и суффиксные деревья?
    Обычно заучивать вообще никогда и ничего не нужно - нужно понимание.
    Заучивать нужно в том случае, если использовать нужно уже сейчас, а времени на доскональное изучение мало, или если теория, лежащая в реализации алгоритма, это целая наука, владение которой для ваших задач не нужно.
    Ответ написан
    1 комментарий
  • Как синхронизировать действия пользователей и данные в многопользовательской системе?

    @res2001
    Developer, ex-admin
    Вы описываете типичную ситуацию при работе с базами данных.
    Обычно применяются 2 стратегии:
    1. ничего не делаем, побеждает последний записавший данные. Запись, конечно, должна быть атомарной, т.е. если 2 пользователя одновременно пишут, то в итоге должны быть записанны данные либо первого пользователя либо второго, но не нечто среднее.
    2. блокировка доступа на изменение, в этом случае описанная ситуация просто не возникнет.
    Эти же подходы вполне применимы и в вашем случае.
    Оба подхода имеют свои достоинства и недостатки, нужно оценить вашу конкретную ситуацию и выбрать более подходящий подход.
    Ответ написан
  • Задача по олимпиаде?

    @res2001
    Developer, ex-admin
    Очевидно, что максимальное число переворотов будет, если блины лежат друг к другу одинаковыми сторонами (белая к белой, черная к черной). В этом случае для упорядочивания нужно сделать N-1 переворот.
    Количество переворотов увеличивается на 1 (потому что в конце оказывается, что вся стопка лежит черной стороной вверх), если:
    1. N не четное и в начале первый блин черный
    2. N четное и первый блин белый
    Итого, максимальное число переворотов: N
    Ответ написан
    Комментировать
  • Правильно ли я понял алгоритм быстрой сортировки?

    @res2001
    Developer, ex-admin
    Алгоритм просмотрел бегло - похоже на правду.
    обьясните пожалуйста почему тут такая запись

    Я бы написал так:
    int separator = L + (R - L) / 2;
    Впрочем, обе записи эквивалентны, но мой вариант понятней.
    Подразумевается, что L может быть любым 0 <= L < R.
    Предложенные вами варианты дают не правильный результат при L > 0. Проверьте.
    separator - целочисленный индекс середины заданного диапазона
    Ответ написан
    Комментировать
  • Есть ли у кого маленькая шпаргалка по перебору связного списка?

    @res2001
    Developer, ex-admin
    Обычно
    list.next == null - значит текущий элемент (list) - последний в списке
    list == null - нет никакого списка, возможно ошибка

    Оба варианта могут употребляться в одной и той же реализации в разных ситуациях.
    Кроме того могут быть нюансы и list.next == null в данной конкретной реализации списка является ошибкой и т.п.
    Ответ написан
    Комментировать
  • Почему в решениях с одинаковой сложностью существенная разница во времени расчета?

    @res2001
    Developer, ex-admin
    Виноваты накладные расходы.
    В traditional_way они минимальны.
    Замените лямбды вычислением промежуточного массива содержащего abs(a-x) в остальных случаях и получите дополнительный прирост производительности.
    Ответ написан
  • Почему n^3 работает быстрей чем 2^n?

    @res2001
    Developer, ex-admin
    Если рассуждать прямолинейно, то N^3 требует 3 операции умножения (O(3)) для любых N.
    При этом если N > 3, то 2^N будет требовать >3 операций умножения (N операций умножения, если делать совсем уж тупо).

    Но если N - целое и 2^N реализовывать сдвигом, а не умножением, то работать будет ооочень быстро - O(1) для всех N в допустимом диапазоне.
    Ответ написан
    2 комментария
  • Машинные константы и асимптотический анализ алгоритмов?

    @res2001
    Developer, ex-admin
    По моему речь о характеристиках ЦП, влияющих на производительность, например, тактовая частота, размер кэша и проч.
    Игнорировать их можно потому, что алгоритм с логарифмической сложностью будет выполняться быстрее на более медленном устройстве - как раз описанный случай. Для каждых двух разных аппаратных конфигураций и алгоритмов размер входных данных, при котором алгоритм с логарифмической сложностью будет выигрывать у линейного, будет разным и его нужно подбирать опытным путем.
    Просто примите к сведению и продолжайте изучение, это не то на чем требуется заострять внимание.

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