Вопрос

У меня есть пользовательский итератор (точный токер, который итерат, ну, токенизированный код PHP). Предметы - это простые объекты («сумки свойств» с добавленными методами нормализации)

Я должен реализовать функциональность поиска, которые должны найти, если 1. Один итератор содержит другой или 2. Два (или более) итератора перекрываются (с некоторой параметризацией).

В настоящее время я использую наивный подход к (1) - O (NXM) двойной цикл, и (2) еще не реализован.

Прежде чем начать переопределение действительно интеллектуальных алгоритмов поиска строк, я хотел бы знать, существует ли какая-то эффективная реализация этого? Может быть, что -то похороненное глубоко в какой -то рамках или общей библиотеке для повторного использования? И какой алгоритм будет наиболее подходящим здесь?

Это было полезно?

Решение

Первое, что приходит на ум, это то, что вы говорите об установленных операциях, для которых итераторы, возможно, не лучшее решение.

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

Учитывая у PHP есть ассоциативные массивы (которые являются формой хэш -таблиц), вы также можете создать массив, имеющий токены в качестве ключей, которые снова можно сделать в тета (n), а затем использовать array_key_exists. Вполне возможно, что array_key_exists - не что иное, как линейное сканирование списка ключей, так как я не знаком с внутренними значениями PHP, но я весьма уверен, что, если ассоциативные массивы реализованы как хэш -таблицы, это должно быть реализовано гораздо больше эффективно, чем линейное сканирование.

Другие советы

Если ваши итераторы могут быть подняты на массивы, вы можете использовать array_diff а также array_intersect. Анкет В противном случае вы должны реализовать то, что эти функции выполняют под капотом - пройти через свои структуры и сравнить. Поскольку данные, которые вы, выполняете, не отсортированы и не знаете об этом, у вас нет другого выбора.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top