Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
kursova2012_Algorytmy_poshuku.doc
Скачиваний:
7
Добавлен:
29.08.2019
Размер:
438.78 Кб
Скачать

1.2.2. Алгоритм Рабіна.

Алгоритм Рабіна є модифікацією лінійного алгоритму; він заснований на дуже простій ідеї.

«Уявимо собі, що в слові A, довжина якого рівна m, ми шукаємо зразок X довжини n. Виріжемо "віконце" розміром n і рухатимемо його по вхідному слову. Нас цікавить, чи не збігається слово в "віконці" із заданим зразком. Порівнювати по буквах довго. Замість цього фіксуємо деяку числову функцію на словах довжини n, тоді завдання зведеться до порівняння чисел, що, поза сумнівом, швидше. Якщо значення цієї функції на слові в "віконці" і на зразку різні, то збігу немає. Лише якщо значення однакові, необхідно перевіряти послідовно збіг по буквах.» (Додаток №3, функція SearchRabin)

Цей алгоритм виконує лінійний прохід по стрічці (n кроків) і лінійний прохід по всьому тексту (m кроків), отже, загальний час роботи є O(n+m). При цьому ми не враховуємо тимчасову складність обчислення хеш-кодування-функції, оскільки, суть алгоритму в тому і полягає, щоб дана функція була настільки легко обчислюваною, що її робота не впливала на загальну роботу алгоритму. Тоді, час роботи алгоритму лінійно залежить від розміру рядка і тексту, отже програма працює швидко. Адже замість того, щоб перевіряти кожну позицію на предмет відповідності із зразком, ми можемо перевіряти лише ті, які схожі із зразоком. Отже, для того, щоб легко встановлювати явну невідповідність, використовуватимемо функцію, яка повинна:

1. Легко вираховуватися.

2. Як можливо краще розпізнавати неспівпадаючі стрічки.

Приклад (зручній для обчислення функції). Замінимо всі букви в слові і зразку їх номерами, що є цілими числами. Тоді зручною функцією є сума цифр. (При зрушенні "віконця" потрібно додати нове число і відняти "зникле".)

Проте, проблема в тому, що шукана стрічка може бути довгою, рядків в тексті теж вистачає. А оскільки кожній стрічці потрібно зіставити унікальне число, то і чисел повинно бути багато, а отже, числа будуть великими (порядку D*n, де D - кількість різних символів), і працювати з ними буде так само незручно. Але який інтерес працювати лише з короткими стрічками і цифрами? Розробники алгоритму придумали, як поліпшити цей алгоритм без особливих втрат в швидкості.

Приклад (сімейства зручних функцій). Виберемо деяке число р (бажано просте) і деякий вирахування x за модулем p. Кожне слово довжини n будемо розглядати як послідовність цілих чисел (замінивши літери їх кодами). Ці числа будемо розглядати як коефіцієнти многочлена стeпеня n-1 і обчислимо значення цього многочлена по модулю р в точці x. Це і буде одна з функцій сімейства (для кожної пари p і x виходить своя функція). Зсув "віконечка" на 1 відповідає відніманні старшого члена, множенню на х і додаванню вільного члена. Наступне міркування свідчить на користь того, що збіги не надто вірогідні. Нехай число р фіксоване і до того ж воно є простим, а X і Y - два різних слова довжини n. Тоді їм відповідають різні многочлен (ми припускаємо, що коди всіх букв різні - це можливо при р, більшому кількості букв алфавіту). Збіг значень функції означає, що в точці х ці два різних многочлена співпадають, тобто їх різниця рівна 0. Різниця є многочленом степеня n-1 і має не більше n-1 коренів. Таким чином, якщо n менше p, то випадковим значенням x мало шансів потрапити в "невдалу" точку.

Строго кажучи, час роботи всього алгоритму в цілому, є O(m+n+ mn/р), mn/р досить невелике, так що складність роботи майже лінійна. Зрозуміло, що просте число слід вибирати більшим, чим більше це число, тим швидше буде працювати програма.

Алгоритм Рабіна і алгоритм послідовного пошуку є алгоритмами з найменшими працевитратами, тому вони придатні для використання при вирішенні певного класу задач. Однак ці алгоритми не є найбільш оптимальними (хоча б тому, що інколи виконують явно непотрібну роботу, про що було сказано вище), тому ми перейдемо до наступного класу алгоритмів. Ці алгоритми з'явилися в результаті ретельного дослідження алгоритму послідовного пошуку. Дослідники хотіли знайти способи в більшій мірі використовувати інформацію, отриману під час сканування (алгоритм прямого пошуку її просто нехтує). Розглянемо алгоритм Кнута – Морріса – Прата.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]