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

    turboNOMAD
    @turboNOMAD
    Я бы использовал множество (set).
    Алгоритм такой: для каждого числа проверяем, есть ли оно в множестве. Если нет, добавляем, иначе удаляем. Проверка эта идет за O(log n) для std::set на C++, или вообще за константу для хэш-контейнеров. (Я не знаю, какой язык можно использовать по условию задачи).
    Единственная проблема — если числа и их пары расположены не псевдослучайно, а например сначала все уникальные, а потом все их пары. В таком случае при проходе первой половины массива размер множества будет только увеличиваться и можем пролететь с ограничением по памяти.
    Ответ написан
    2 комментария
  • Поиск всех путей от точки до точки?

    turboNOMAD
    @turboNOMAD
    Ваша задача на практике неразрешима — ни средствами СУБД, ни даже написанием программы, реализующей алгоритм.

    Объясню почему. Давайте для простоты решим, что мы ищем только пути, не посещающие одну вершину более 1 раза — так называемые «простые» пути. Если не налагать это ограничение, то количество путей будет несравнимо больше, а при наличии в графе циклов — бесконечным.

    Но даже перечисление простых путей невозможно при таком размере графа. Дело в том, что количество простых путей из вершины А в вершину В зависит экспоненциально от количества ребер в графе. Эксполненциальный рост сложности приводит к тому, что при количестве ребер свыше десятков перечисление путей занимает неприемлемо долгое время. В случае с миллионами ребер всё еще гораздо хуже.

    Вы можете попробовать реализовать поиск в глубину и лично убедиться.

    Замечу, что при наложении на структуру графа некоторых строгих ограничений (например, не более 2 ребер, выходящих из каждой вершины) время работы поиска в глубину становится приемлемым — полиномиальная асимптотика вместо экспоненты. Но на практике такими графами дело, конечно же, не ограничивается.
    Ответ написан
    1 комментарий
  • Задача со множествами, помогите решить

    turboNOMAD
    @turboNOMAD
    Постройте граф, где каждый элемент — вершина, а ребра обозначают принадлежность к одному множеству. При этом если одну и ту же пару элементов содержат несколько множеств, одного ребра достаточно. Такой граф строится за один проход.

    Искомые множества — связные подграфы полученного графа.

    Кстати, для работы с графами могу посоветовать соответствующую библиотеку из boost, если подразумевается C++.
    Ответ написан
    1 комментарий
  • Помогите найти алгоритм растеризации эллипса

    turboNOMAD
    @turboNOMAD
    Нарисовать эллипс очень просто.
    Идем построчно, для каждой строки Х известен, решаем уравнение эллипса относительно Y.
    Получится два корня, это левая и правая граница закрашиваемой линии на строке Х.

    Только нужно помнить, что эти координаты (X, Y) рассчитаны, принимая за начало координат центр эллипса.
    Т.е. прежде чем рисовать линию, прибавляем к ним (X0, Y0) — центр эллипса.
    Ответ написан
    2 комментария