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

    @tomatho
    Либо у вас совсем плохая фантазия, либо плохо поняли главу, либо школьную математику очень плохо знаете, либо автор вам соврал, что математика не требуется.
    Скорее всего последнее.

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

    @tomatho
    Для третьего и четвёртого варианта невозможно из компаратора узнать был ли уже на таком же расстоянии.
    Выход который я вижу: "сместить" в пользу "низа", но это возможно только с определённой точностью.
    Второй вариант: можно сделать если передавать в компаратор три значения: текущее, лучшее сейчас, и то что ищем.

    Далее код для a, b - текущее, то что ищем соответственно.
    Код не проверял.
    function c1(a, b) {
      return (a <= b ? b - a : Number.MAX_VALUE );
    }
    function c2(a, b) {
      return (a >= b ? a - b : Number.MAX_VALUE );
    }
    function c3(a, b) {
      if (a <= b && b - a < Math.abs(b)*(1e-7))
        return 0;
      return Math.abs(a - b + Math.abs(b)*(1e-7));
    }
    function c4(a, b) {
      if (a >= b && a - b < Math.abs(b)*(1e-7))
        return 0;
      return Math.abs(a - b - Math.abs(b)*(1e-7));
    }
    Ответ написан
  • Как правильно оценить временную сложность алгоритма?

    @tomatho
    Всё же зависит от того, что в скобках. Если там какие-то условия или циклы, то может оказаться:
    • Дополнительный множитель, из-за того, что выполняется сложная операция.
    • Уберётся множитель, из-за того, что при выполнении некоторого условия выполняется код который сильно дольше проверки этого условия.

    И это далеко не редкость, когда циклов три, а сложность как будто циклов всего два.
    Простейший пример поиск в ширину (bfs). В нём идёт цикл по вершинам, в котором идёт цикл по рёбрам вершины, то есть в худшем случае получается O(N*M) где N - количество вершин, а M количество рёбер, однако очевидно, что это всего лишь O(N+M), Но я хотел подчеркнуть, что это получается из-за того, что в данном алгоритме каждое ребро проходится максимум два раза: O(2M) = O(M), а каждая вершина максимум один раз O(N).
    Ответ написан
    Комментировать
  • Как развить алгоритмическое мышление?

    @tomatho
    Вообще, это не про алгоритмы а про психологию.
    Это состояние - боязнь связанная с ответственностью, это тоже почему перед ЕГЭ школьники сходят с ума.
    Один из способов: изменить отношение к таким событиям, то есть вести себя так, будто конца света не случится если зафейлишь. Воспринимать такое как ничего особенного, и что фэйл что успех - всё будет пучком.
    Других способов не знаю - не психолог.

    Алгоритмы где натаскаться: решать задачи, например на codeforces. Один важный аспект: желательно не знать на какой алгоритм задача заранее, так как главное не знать алгоритм, а понять, какой алгоритм применить.
    Ответ написан
  • Структура, позволяющая добавлять/удалять полуинтервалы из множества и выводящая количество непересекающихся интервалов?

    @tomatho
    Сразу скажу, что описание задачи чуть-чуть отличается от того, что я понял по заголовку.
    По заголовку я подумал, что это структура хранящая некоторое множество из пар (l, r) где l, r обозначают концы интервала. И удаление l, r соответствует удалению пары.
    А оказалось, что это структура которая хранит множество, которое представимо в виде пар (l, r), где каждое (l, r) - такой полуинтервал.

    Первое, что лезет в голову - set, но set не подойдёт так как надо как-то уметь удалять сразу несколько элементов (l, r) если пришел + l r который покрывает несколько элементов, то их надо удалять быстро. Set же даёт возможность их удалять только за m log n где m - количество элементов которые надо удалить, и n размер дерева.

    Так что моё предложение: декартово дерево.
    Я бы предложил дерево отрезков, если бы min l и max r были в разумных пределах, так как оно проще пишется в этом случае.
    Ответ написан
    3 комментария
  • Как перебрать массив?

    @tomatho
    Рекомендую делать это днём.
    Открываешь шторы окна, чтобы было посветлее.
    Можешь дополнительно включить свет.
    Берёшь, высыпаешь весь массив на стол.
    Пальцами одни элементы отодвигаешь от других.
    Смотришь, чтоб элементы были хорошие.
    Ну и хорошие прямо со стола пальцем кидаешь в кастрюлю.

    А если серьёзно, то сначала сформулируйте понятнее.
    Ответ написан
    Комментировать
  • Как оптимально обойти все вершины графа?

    @tomatho
    Для количества вершин порядка 15: (больше 15 вершин будет работать уже сравнимо дольше)
    1. Запускаем флойда чтобы получить матрицу 15х15 путей как из одной вершины быстрее всего попасть в другую. Либо 15 обходов в глубину (та же скорость, тот же эффект).
    2. Перебираем все перестановки чисел от 1 до 15, которых как известно 15! = 1307674368000.
    3. С помощью матрицы полученной на первом шаге, считаем общее количество шагов,
      которые получились бы если бы мы проследовали по вершинам в порядке перестановки.
    Ответ написан
    Комментировать