Кіріспе

Компьютерлік ғылымда Бойер–Мур–Хорспул алгоритмі немесе Хорспул алгоритмі – тізбектердегі кіші тізбелерді табуға арналған алгоритм. Оны Найджел Хорспул 1980 жылы SBM деп жариялаған. Бұл Кнут–Моррис–Пратт алгоритмімен байланысты Бойер–Мур тізбегін іздеу алгоритмінің жеңілдетілген нұсқасы. Алгоритм орташа жағдайда кездейсоқ мәтінде O(n) күрделілігін алу үшін жадты уақытпен алмастырады, бірақ ең жаман жағдайда O(nm) болады, мұнда үлгінің ұзындығы m, ал ізделінетін тізбектің ұзындығы n.

Өнер көрсету

Алгоритм ұзын ине тізбектерімен ең жақсы жұмыс істейді, егер ол ағымдағы позициядағы мақта үйірінің соңғы байтын немесе оған жақын байтты сәйкес келмейтін символмен тұрақты түрде кездестірсе және иненің соңғы байты ине ішінде басқа жерде кездеспесе. Мысалы, "z" әрпімен аяқталатын 32 байтты ине, "z" байты жоқ 255 байтты мақта үйірін іздесе, 224 байтқа дейін салыстыру қажет болады. Ең жақсы жағдай үлкен O белгісінде Бойер-Мур тізбектік іздеу алгоритміне ұқсас, бірақ инициализацияның тұрақты қосымша шығындары және әрбір цикл үшін жұмсалатын уақыт аз. Ең нашар жағдай, жаман символдың жылжуы үнемі төмен болғанда (төменгі шегі 1 байттық жылжу) және иненің үлкен бөлігі мақта үйірімен сәйкес келгенде пайда болады. Жаман символдың жылжуы тек жартылай сәйкес келген жағдайда төмен болады, егер инедегі соңғы символ ине ішінде басқа жерде де кездессе, ал бір байттық жылжу соңғы екі позициядағы байттар бірдей болғанда болады. Жоғарыдағы "ең жақсы" жағдайға ұқсас канондық дегенеративті жағдай – 'a' байтынан кейін 31 'z' байтынан тұратын ине, ал мақта үйірі 255 'z' байтынан тұрады. Бұл 31 сәтті байт салыстыруын, сәтсіз аяқталатын 1 байт салыстыруын және содан кейін 1 байтты алға жылжытуды қамтиды. Бұл процесс тағы 223 рет қайталанады (255 – 32), жалпы байт салыстырулар саны 7168 (32 × 224) құрайды. (Байт салыстырудың басқа циклы басқаша әрекет етеді.) Ең нашар жағдай Бойер-Мур тізбектік іздеу алгоритміне қарағанда айтарлықтай жоғары, бірақ бұл қалыпты жағдайларда қол жеткізу қиын. Сондай-ақ, бұл ең нашар жағдай наивті (бірақ әдеттегі) memcmp алгоритмі үшін де ең нашар жағдай екенін атап өткен жөн, бірақ оның іске асырылуы айтарлықтай оңтайландырылған (және кэш үшін ыңғайлы).