большого размера. Пока придумал только вот-такой алгоритм:
Исходный шаблон проходим побайтно через mov ax, [ebx] . Очередной байт ищем через scansb. Если не находим откатываемся на байт назад и снова ищем следующее вхождение. И так до тех пор, пока не будет достигнут конец шаблона — вхождение найдено, либо конец текста — вхождения нет.
Но может быть есть еще какой вариант алгоритма?
А если UTF8 или 16? Не, там немного сложнее. Пару лет назад такое же делал, т.к. всякие питоны не смогли переварить большие файлы
КМП вам в помощь , или Рабин-карп
Я ожидаю, что подстрока и строка в одной кодировке (пусть даже это utf-8) в бинарном виде также сохранят свойство вхождение одной в другую. Или уже с этим возможны проблемы?
А можно расшифровку для гугления?
нет-нет. Я тоже приводил всё к одному знаменателю, а потом уже сравнивал побайтово. Просто про этот нюанс отметил, не более чем как для информации
вариантов нет, но есть простор для оптимизации. в зависимости от длины шаблона первые итерации искать через sse/avx, а последние побайтно. за раз по 16/32/64 байт, или по 8/4/2 через scas
А при поиске через границы слова, двойного слова и т.п. проблемы не возникнет?
эт уже будет на конечном жтапе через scasb
Да просто сконкатенируй строки и юзай z-функцию
Можно по-подробнее, непонятно!
Ну смотри, сложность построения z-массива линейная, таким образом сложность поиска подстроки в строке будет O(l1 + l2)
Knuth-Morris-Pratt, а второе ето Rolling Hash Rabbin-Karp
Спасибо, засяду читать!
Обсуждают сегодня