Как название, Грубая сила, Карп-Рабин, Кнутт-Моррис-Пратт, Бойер Мур, ... или еще? И какая сложность функции Pos() в Паскале?
Какой алгоритм используется для функции Pos() в Паскале?
Ответы (1)
В Delphi это ручной перебор ассемблера. Потенциально в D2006 и выше переделан проектом fastcode. В Turbo Pascal он тоже был написан вручную на ассемблере, но старше (вероятно, rep scasb)
В Free Pascal он использует indexbyte(), который является зависящим от архитектуры примитивом "поиск байта в блоке памяти", реализуемым сканированием по двойным словам.
IOW он просто сканирует первый равный символ, поэтому я предполагаю, что это то, что вы имеете в виду под грубой силой.
Существуют различные реализации Delphi Boyer Moore, которые можно использовать на случай, если вам нужно искать в больших текстах, но из-за их дополнительного выделения памяти они обычно плохо работают с короткими строками.
(2020-06-04 после сообщения на форуме Lazarus со ссылкой на эту тему:
Тем временем в RTL есть реализация BMH )