Понимание Бойера-Мура визуально
Я уже исследовал различные решения Stackru, чтобы попытаться понять, как функционирует алгоритм Бойера-Мура, однако я ищу более-менее пошаговую иллюстрацию о том, как на самом деле функционирует алгоритм (визуальное обучение для меня гораздо лучше).
Я пытаюсь понять это изображение, но я не совсем понимаю, почему при сравнении 6 оно пропускает:
Я бы предпочел, чтобы это выглядело лучше, но если вы расскажете мне через псевдокод, почему это происходит, я буду признателен.
Спасибо.
1 ответ
Самая важная вещь в алгоритме Бойера Мура - это последняя таблица вхождений, которая представляет собой предварительную обработку шаблона. Он хранит последний индекс, в котором появился каждый отдельный символ в шаблоне.
Шаги можно разбить, как показано ниже, где я немного изменил вашу визуализацию.
Шаги переключения объясняются ниже.
Символ текста a несовпадение с символом шаблона b . Символ a появляется в последней таблице вхождений с индексом 4. Сдвинуть шаблон так, чтобы индекс 4 выровнялся с несоответствующим текстовым символом a .
Текст символов несоответствие с узором символов с . Символ a появляется в последней таблице вхождений с индексом 4. Сдвиг шаблона таким образом, чтобы индекс 4 выровнялся с несоответствующим текстовым символом a , сместил бы шаблон назад. Это не имеет смысла, поэтому все, что мы можем сделать, это сдвинуть шаблон на 1.
Символ текста a несовпадение с символом шаблона b . Символ a появляется в последней таблице вхождений с индексом 4. Сдвинуть шаблон так, чтобы индекс 4 выровнялся с несоответствующим текстовым символом a .
Несоответствие символа d текста и символа образца b . Символ d не появляется в последней таблице вхождений. Таким образом, мы можем сдвинуть всю картину за пределы этого несоответствия.
Символ текста a несовпадение с символом шаблона b . Символ a появляется в последней таблице вхождений с индексом 4. Сдвинуть шаблон так, чтобы индекс 4 выровнялся с несоответствующим текстовым символом a .
Все символы совпадают, т.е. у нас есть полное совпадение. Сдвиньте узор наивно на 1.
Тот же сценарий, что и для сравнения 7. Совместите индекс шаблона 4 с несоответствующим текстовым символом a .
Тот же сценарий, что и выше.
Точный сценарий, как для сравнений 2, 3 и 4. Сдвинуть шаблон на 1.
Несоответствие текстового символа b символу шаблона a . Мы дошли до конца текста, так что все готово.