Алгоритм Карпа-Рабина: мощный инструмент для поиска подстроки
Алгоритм Карпа-Рабина является алгоритмом для строкового поиска и сравнения, разработанным Майклом Карпом и Ричардом Рабином. Он обладает эффективностью по времени, так как позволяет искать совпадения подстроки в тексте за время, пропорциональное длине текста и подстроки. Этот алгоритм основывается на использовании хеш-функции для быстрого сравнения строк.
Прежде чем рассмотреть работу алгоритма, важно понять концепцию хеш-функций. Хеш-функция - это функция, которая принимает на вход строку и возвращает числовое значение, называемое хешем. Хеш-функции должны обладать двумя основными свойствами: равенство хешей для одинаковых строк и различность хешей для разных строк.
Одной из самых простых хеш-функций является функция, основанная на суммировании кодов символов строки. Например, пусть у нас есть строка "abc". Код символа 'a' равен 97, символа 'b' - 98, и символа 'c' - 99. Сумма кодов символов равна 294, и это будет хеш-значением для строки "abc".
Алгоритм Карпа-Рабина использует хеш-функцию для пошагового сравнения подстроки с текстом. Он начинает с вычисления хеша подстроки и первого фрагмента текста. Затем алгоритм сравнивает хеши: если они равны, происходит дополнительная проверка посимвольно, чтобы исключить возможные коллизии хеш-функции.
Однако, если хеши не равны, алгоритм переходит к следующему фрагменту текста, пересчитывает его хеш и снова сравнивает. Этот процесс продолжается до тех пор, пока либо не будет найдено точное совпадение подстроки, либо текст полностью просмотрен.
Для реализации алгоритма Карпа-Рабина вам потребуется знать хорошую хеш-функцию и некоторые операции, такие как вычисление хеша, обновление хеша и сравнение хешей. Приведу ниже примеры кода на языке Python:
def hash_string(s): # пример реализации хеш-функции
hash_value = 0
prime = 101 # выбираем некое простое число
for char in s:
hash_value += ord(char)
return hash_value % prime
def rabin_karp_search(pattern, text):
m = len(pattern)
n = len(text)
pattern_hash = hash_string(pattern)
text_hash = hash_string(text[:m])
for i in range(n-m+1):
if pattern_hash == text_hash:
if pattern == text[i:i+m]:
return i
if i < n-m:
text_hash = (text_hash - ord(text[i])) % prime
text_hash = (text_hash + ord(text[i+m])) % prime
if text_hash < 0:
text_hash += prime
return -1
В представленной реализации hash_string является нашей хеш-функцией, которая принимает строку и возвращает хеш-значение. Функция rabin_karp_search осуществляет поиск подстроки pattern в тексте text. Она сравнивает хеши подстроки с текстом и, при необходимости, обновляет хеш-значение текста для перехода к следующему фрагменту.
Надеюсь, предоставленный ответ помог вам понять алгоритм Карпа-Рабина и дал ясность в реализации его кода на примере языка программирования Python. Если у вас возникнут дополнительные вопросы, не стесняйтесь задавать.