Другой ответ относится к алгоритму Бойера Мура.Он использует предварительную обработку подстроки, а не поисковый материал.Это считается быстрый неиндексированный поиск.
Существуют и другие алгоритмы поиска, полезные для многократного поиска в одном и том же документе.Рассмотрим Aho-Corasick.
Однако алгоритм, который я использовал и похож на описанный вами, реализован в Python ниже.Идея состоит в том, чтобы для каждого элемента получить набор индексов, где он появляется.Затем для поиска используйте наименее общий символ в подстроке в качестве списка контрольных точек.Переберите подстроку для каждой контрольной точки, разрывая, когда не удается найти индекс.
Вы должны проверить это, чтобы увидеть, работает ли он быстрее, чем Бойер Мур или другие алгоритмы.Этот может быть в состоянии быть улучшенным.Было бы хорошим упражнением, опоздание на пять лет.
class IndexRegistry(object):
def __init__(self, iterable):
self._store = defaultdict(set)
for index, val in enumerate(iterable):
self._store[ val ].add( index )
def find(self, items):
_, refIndex, refItem = min(
[ ( len(self._store[item]), index, item )
for index, item in enumerate(items)
],
key=lambda el: el[0]
)
for referenceIndex in self._store[ refItem ]:
startIndex = referenceIndex - refIndex
for itemIndex, item in enumerate(items):
absIndex = startIndex + itemIndex
if absIndex not in self._store[ item ]:
break #substring broken
else: #no break
yield startIndex
def __contains__(self, items):
try:
next(self.find(items))
except StopIteration:
return False
return True