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

    Labunsky
    @Labunsky
    Я есть на хабре
    Не сложный алгоритм. Берешь таблицу, и начинаешь слева-направо:
    1. Берешь слово;
    2. Выбираешь первую попавшуюся свободную клетку (при обходе слева-направо, сверху-вниз, специально для longclaps. Сначала это угол, потом как пойдет);
    3. Выбираешь случайное направление движения из доступных (должна быть хоть одна свободная клетка по этому направлению);
    4. Начинаешь записывать слово по буквам, используя обход в глубину (ячейки клетки - вершины графа, ребра образуются между двумя свободными клетками, соединенными под прямым углом), с приоретитом на сохранение направления (никаких поворотов, кроме как при упоре в стенку);
    5. Если есть еще слова - бери их и иди в п.1.
    Ответ написан
  • В алгоритмической сложности омега большое обозначает лучший случай или нет?

    Labunsky
    @Labunsky
    Я есть на хабре
    Это не омега, это "О-большое". Грубо говоря - ограничение сверху. Алгоритм, имеющий сложность O(f(n)), при росте n будет расти (в плане времени работы) не быстрее, чем C*f(n) (C - константа)

    UPD. Глаза мыльные, моя беда, ответ - да, "омега"-нотация обозначает лучший случай, О-большое - асимптотически худший
    Ответ написан
  • Где компании ищут алгоритмы?

    Labunsky
    @Labunsky
    Я есть на хабре
    Есть отдельные R&D конторы. Там сидят умные ребята и много думают на заказ
    Ответ написан
    Комментировать
  • Как оптимизировать поиск комбинации строк и столбцов в матрице?

    Labunsky
    @Labunsky
    Я есть на хабре
    Не тестировал, но как-то так:
    1. Считаем сумму всех значений матрицы N, а так же сумму для каждой строки и столбца M[] и соотношение 1 к 0 Z;
    2. Вычитаем из N минимальное значение среди M: N -= min(M).;
    3. "Убираем" строку или столбец соответсвующую min(M) из матрицы: вычитаем из каждого столбца или строки (соответственно) значения на пересечении и параллельно обновляем Z;
    4. Сравниваем Z с предыдущим значением. Если оно стало больше - вернуться к шагу 2. Если меньше - комбинация найдена (неудаленые строки и столбцы).
    Ответ написан
    2 комментария
  • Алгоритм выпадения числа?

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

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

    Labunsky
    @Labunsky
    Я есть на хабре
    Список В единственный не содержит нарушения порядка следования.
    Во варианте А "Позавтракать" идет до "Почистить зубы", при этом "Проснуться" до "Принять душ" - очевидный косяк.
    Аналогично, в С "Принять душ" идет до "Проснуться", но "Почистить зубы" до "Позавтракать".
    Ответ написан
  • Структура, позволяющая добавлять/удалять полуинтервалы из множества и выводящая количество непересекающихся интервалов?

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

    Labunsky
    @Labunsky
    Я есть на хабре
    Очевидно, с помощью обходов графа.
    Какой из алгоритмов лучше использовать и какие модификации можно внести - зависит уже от конкретных особенностей графа, то есть у произвольного заранее неизвестно, какая вариация окажется самой оптимальной.
    Если возможно, то нужно собрать статистику и посмотреть на возможные особенности обрабатываемых графов. Так, например, для "звезд" будет оптимальным обход центра с BFS, после чего обработка лучей с помощью DFS.
    Ответ написан
    3 комментария
  • Как нарисовать дерево имея его ребра?

    Labunsky
    @Labunsky
    Я есть на хабре
    1. Находим корень дерева и рисуем его на рисунке;
    2. Присвоить v корень;
    3. Посчитать количество cu ребер таких, что существует [v, u];
    4. 140 / cu (или что-то подобное, константы по вкусу) - угол нарисунке между ребрами. Зная угол и вертикальную состовляющую расстояния между уровнями дерева, вычисляем координаты на рисунке вершин u таких, что существует ребро [v, u];
    5. Рисуем в вычисленных точках новые вершины. Для каждой из них выполнить алгоритм с пункта 2 (то есть каждая из u должна побывать раз в жизни v).
    Ответ написан
    Комментировать
  • Что лучше использовать, что бы определить различность изображений?

    Labunsky
    @Labunsky
    Я есть на хабре
    pHash.org, стандарт де-факто для поиска дубликатов.
    Есть под почти все что угодно, сама реализация в случае чего не является чем-то сверх-сложным.
    Проверить работоспособность можно прямо на сайте.
    Ответ написан
    3 комментария
  • Как найти такую вершину заданного графа, которая принадлежит каждому пути между двумя выделенными?

    Labunsky
    @Labunsky
    Я есть на хабре
    1. Представим все вершины числами от 0 до n;
    2. Заводим массив visited, забитый нулями, и переменную count = 0;
    3. Находим кратчайший путь между v и u (например, Дейкстрой). Если такой путь существует, то count++ и для каждой его вершины g, отличной от u и v, visited[g]++. Если пути не существует, перейти к шагу 6;
    4. Удаляем последнее ребро в найденом пути;
    5. Возвращаемся к 3.
    6. Ищем такую g, что visited[g] == count. Если такая есть, она и является искомой;

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

    Labunsky
    @Labunsky
    Я есть на хабре
    1. Если изначально последовательность правильная - любая инверсия приводит к ее порче;
    2. Если инверсии было две - последовательность может быть правильной, только когда
    • Инвертировались скобки разного типа ('(' и ')')
    • Между ними должно быть четное количество других скобок


    Если хоть что-то из перечисленного не выполняется, то последовательность не является правильной, при этом их проверка требует константное время.
    Если выполняется все - нужно использовать доволнительную структуру и следующий алгоритм:
    1. Предположим, что скобочная последовательность хранится в виде массива, элементами которого являются скобки, для каждой из которых хранится индекс ее пары (соответствующей закрывающей/открывающей скобки)
    2. При каждой инверсии будем затирать для соответствующих скобок (открывающая/закрывающая) индексы и помечать их
    3. Так как инверсии было две, то получим 4 помеченных индекса. В силу того, что инвертировались разные типы скобок, среди них будут либо образовываться две новые пары, не противоречащие правильности последовательности (проверяется это травиально), либо нет


    Быстрее ничего придумать не получается. Единственное тонкое место - проверка в последнем пункте, так как в различных случаях может занимать как константное время, так и O(k), где k строго меньше n и в среднем случае является логарифмом.
    Ответ написан