Алгоритм Рабіна — Карпа Зміст Ідея алгоритму | Опис алгоритму | Аналіз | Зноски | Джерела | Дивіться також | Навігаційне менюEfficient randomized pattern-matching algorithms

Рядкові алгоритмиХешування


пошуку рядкаРабіномКарпомсистемі численнясхеми Горнеравідображення















Алгоритм Рабіна — Карпа
Клас
Пошук рядка
Найгірша швидкодія
O(nm)
Найкраща швидкодія
O(n+m)
Середня швидкодія
O(n+m)
Просторова складність у найгіршому випадку
O(p)

Алгоритм Рабіна-Карпа — алгоритм пошуку рядка запропонований Рабіном і Карпом[1]. Алгоритм показує високу продуктивність на практиці, а також дозволяє узагальнення на інші споріднені задачі.


Ідея алгоритму полягає в заміні текстових рядків числами, порівняння яких можна виконувати значно швидше.




Зміст





  • 1 Ідея алгоритму


  • 2 Опис алгоритму

    • 2.1 Псевдокод алгоритму



  • 3 Аналіз


  • 4 Зноски


  • 5 Джерела


  • 6 Дивіться також




Ідея алгоритму |


Для простоти припустимо, що алфавіт складається з десяткових цифр Σ = 0,1,…,9. (В загальному випадку можна припустити, що кожний символ — це цифра в системі числення з основою d, де d = |Σ|.) Після цього, рядок з k символів, можна розглядати як число довжини k. Тобто символьний рядок «12345» відповідає числу 12345.


Для заданого зразка P[1..m] позначимо через p відповідне йому десяткове значення. Аналогічно, для заданого тексту T[1..n] позначимо через tsdisplaystyle t_s десяткове значення підрядка T[s+1..s+m] довжини m при s = 0,1,…,n-m. Очевидно, що ts=pdisplaystyle t_s=p тоді і тільки тоді, коли T[s+1..s+m]=P[1..m]; таким чином, s — допустимий зсув тоді і тільки тоді, коли ts=pdisplaystyle t_s=p.


Якщо значення p можна обчислити за Θ(m) а значення tsdisplaystyle t_s за сумарний час Θ(n-m+1), то усі допустимі зсуви можна було б знайти за час Θ(m) + Θ(n-m+1) = Θ(n) шляхом порівняння p з кожним з можливих tsdisplaystyle t_s. (Покищо до уваги не береться той факт, що величини p і tsdisplaystyle t_s можуть виявитись дуже великими.)


З допомогою схеми Горнера величину p можна обчислити за час Θ(m):


p=P[m]+10(P[m−1]+10(P[m−2]+⋯+10(P[2]+10P[1]))…)).displaystyle ;p=P[m]+10(P[m-1]+10(P[m-2]+dots +10(P[2]+10P[1]))dots )).


Значення t0displaystyle t_0 можна обчислити з масиву T[1..n] аналогічним способом за час Θ(m). В той же час, знаючи величину tsdisplaystyle t_s величину ts+1displaystyle t_s+1 можна обчислити за фіксований час:


ts+1=10(ts−10m−1T[s+1])+T[s+m+1].displaystyle ;t_s+1=10(t_s-10^m-1T[s+1])+T[s+m+1].    (1)


Наприклад, якщо m = 5 і ts=31415displaystyle t_s=31415, то потрібно видалити цифру у старшому розряді T[s+1] = 3 і додати цифру у молодший розряд (припустимо, T[s+5+1]=2). В результаті отримуємо ts+1=10(31415−10000⋅3)+2=14152displaystyle t_s+1=10(31415-10000cdot 3)+2=14152.


Отже, всі tsdisplaystyle t_s можна обчислити за час Θ(n).


В цій процедурі пошуку наявна складність, пов'язана з тим, що значення p і tsdisplaystyle t_s можуть виявитись занадто великими і з ними буде незручно працювати. Якщо зразок P складається з m цифр, то припущення про те, що арифметичні операції з числом p (до якого входить m цифр) займають «фіксований час», не відповідає дійсності. Ця проблема має просте вирішення: обчислення значень p і tsdisplaystyle t_s за модулем деякого числа q. Оскільки обчислення проводяться рекурентно, то знаходження p можна виконати за Θ(m) а всіх tsdisplaystyle t_s відповідно за Θ(n). Значення q звичайно обирають таким, щоб величина dq не перевищувала максимальну величину комп'ютерного слова.


Тоді, співвідношення (1) приймає вигляд:


ts+1=(d(ts−T[s+1]h)+T[s+m+1])modq,displaystyle ;t_s+1=(d(t_s-T[s+1]h)+T[s+m+1])mod q,    (2)


де h≡dm−1(modq)displaystyle hequiv d^m-1pmod q — значення, що приймає цифра «1» поставлена в старший розряд m-значного текстового рядка.


Робота по модулю q має свої недоліки, оскільки з ts≡p(modq)displaystyle t_sequiv ppmod q не випливає, що ts=pdisplaystyle ;t_s=p. З іншого боку, якщо ts≢p(modq)displaystyle t_snot equiv ppmod q, то обов'язково виконується співвідношення ts≠pdisplaystyle ;t_snot =p і можна зробити висновок, що зсув s неприпустимий. Таким чином, співвідношення ts≡p(modq)displaystyle t_sequiv ppmod q можна використовувати як швидкий евристичний тест, що дозволяє виключити із розгляду деякі неприпустимі зсуви. Усі зсуви, для яких співвідношення виконується, треба додатково перевірити. Якщо q достатньо велике, то можна сподіватися, що хибні зсуви будуть зустрічатися досить рідко і час додаткової перевірки буде малим.



Опис алгоритму |


Алгоритм полягає в наступному:


  1. обчислити число p;

  2. обчислити всі tsdisplaystyle t_s;

  3. Для тих s для яких ts=pdisplaystyle t_s=p, виконати перевірку P[1..m] = T[s+1..s+m].


Псевдокод алгоритму |


Rabin_Karp_Matcher(T,P,d,q)displaystyle ;Rabin_Karp_Matcher(T,P,d,q)
1 n←length[T]displaystyle nleftarrow length[T]
2 m←length[P]displaystyle mleftarrow length[P]
3 h←dm−1modqdisplaystyle hleftarrow d^m-1mod q
4 p←0displaystyle pleftarrow 0
5 t0←0displaystyle t_0leftarrow 0
6 for i←1displaystyle ileftarrow 1 to mdisplaystyle ;m //Попередня обробка
7 do p←(dp+P[i])modqdisplaystyle pleftarrow (dp+P[i])mod q
8 t0←(dt0+T[i])modqdisplaystyle t_0leftarrow (dt_0+T[i])mod q
9 for s←0displaystyle sleftarrow 0 to n−mdisplaystyle ;n-m //Перевірка
10 do if p=tsdisplaystyle ;p=t_s
11 then if P[1..m]=T[s+1..s+m]displaystyle ;P[1..m]=T[s+1..s+m]
12 then print «Зразок знайдено зі зсувом» s
13 if s<n−mdisplaystyle ;s<n-m
14 then ts+1←(d(ts−T[s+1]h)+T[s+m+1)modqdisplaystyle t_s+1leftarrow (d(t_s-T[s+1]h)+T[s+m+1)mod q


Аналіз |


У процедурі Rabin_Karp_Matcher на попередню обробку витрачається час Θ(m),displaystyle Theta (m), а час пошуку у найгіршому випадку дорівнює Θ((n−m+1)m).displaystyle Theta ((n-m+1)m). Однак, в багатьох практичних задачах очікувана кількість допустимих зсувів є невеликою, тоді час роботи алгоритму коли знайдено c зсувів є O((n−m+1)+cm)=O(n+m),displaystyle O((n-m+1)+cm)=O(n+m), плюс час необхідний для перевірки хибних збігів. Ми можемо побудувати евристичний аналіз на припущені, що взяття значень по модулю q діє як випадкове відображення з множини усіх допустимих рядків Σ∗displaystyle Sigma ^* у Zq.displaystyle mathbb Z _q. Тоді ми можемо очікувати, що кількість помилкових збігів є O(n/q),displaystyle O(n/q), оскільки ми можемо оцінити шанс того, що будь-який tsdisplaystyle t_s буде тотожним pdisplaystyle p по модулю q,displaystyle q, як 1/q.displaystyle 1/q.



Зноски |



  1. Richard M. Karp and Michael O. Rabin. Efficient Randomized Pattern-Matching Algorithms. Technical Report TR-31-81, Aiken Computation Laboratory, Havard University, 1981.


Джерела |


  • Karp and Rabin's original paper: Karp, Richard M.; Rabin, Michael O. (March 1987). «Efficient randomized pattern-matching algorithms». IBM Journal of Research and Development 31 (2), 249-260.

  • Thimas H. Cormen; Charles E. Leiserson; Ronald L. Rivest; Clifford Stein. Introduction to Algorithms (2nd ed.) The MIT Press. ISBN 0-07-013151-1


Дивіться також |


  • Алгоритм пошуку рядка

  • Список алгоритмів


Popular posts from this blog

Best approach to update all entries in a list that is paginated?Best way to add items to a paginated listChoose Your Country: Best Usability approachUpdate list when a user is viewing the list without annoying themWhen would the best day to update your webpage be?What should happen when I add a Row to a paginated, sorted listShould I adopt infinite scrolling or classical pagination?How to show user that page objects automatically updateWhat is the best location to locate the comments section in a list pageBest way to combine filtering and selecting items in a listWhen one of two inputs must be updated to satisfy a consistency criteria, which should you update (if at all)?

Тонконіг бульбистий Зміст Опис | Поширення | Екологія | Господарське значення | Примітки | Див. також | Література | Джерела | Посилання | Навігаційне меню1114601320038-241116202404kew-435458Poa bulbosaЭлектронный каталог сосудистых растений Азиатской России [Електронний каталог судинних рослин Азіатської Росії]Малышев Л. Л. Дикие родичи культурных растений. Poa bulbosa L. - Мятлик луковичный. [Малишев Л. Л. Дикі родичи культурних рослин. Poa bulbosa L. - Тонконіг бульбистий.]Мятлик (POA) Сем. Злаки (Мятликовые) [Тонконіг (POA) Род. Злаки (Тонконогові)]Poa bulbosa Linnaeus, Sp. Pl. 1: 70. 1753. 鳞茎早熟禾 lin jing zao shu he (Description from Flora of China) [Poa bulbosa Linnaeus, Sp. Pl. 1: 70. 1753. 鳞茎早熟禾 lin jing zao shu he (Опис від Флора Китаю)]Poa bulbosa L. – lipnice cibulkatá / lipnica cibulkatáPoa bulbosa в базі даних Poa bulbosa на сайті Poa bulbosa в базі даних «Global Biodiversity Information Facility» (GBIF)Poa bulbosa в базі даних «Euro + Med PlantBase» — інформаційному ресурсі для Євро-середземноморського розмаїття рослинPoa bulbosa L. на сайті «Плантариум»

If a poisoned arrow's piercing damage is reduced to 0, do you still get poisoned? The 2019 Stack Overflow Developer Survey Results Are InDoes a zero-damage attack still count as a hit?Damage reduction and damage resistance: how to calculate?If a monk reduces damage to 0 using Deflect Missiles, does the attack still hit?Do damage resistance and temp hit points from False Life and the Heavy Armor Master feat stack?When does Armor of Agathys take effect?Should the damage from an unarmed strike be reduced by Heavy Armor Master?What's the duration of these wild feats?Does the Heavy Armor Master feat reduce damage twice against a mixed damage attack?Are Erinyes' Hellish Weapons poisonous in a PC's hands?How can I gain resistance to piercing, bludgeoning, and slashing damage while in heavy armor?Damage reduction and damage resistance: how to calculate?Can Mage Hand Legerdemain load a hand crossbow? What about two hand crossbows?Does the Polearm Master attack work with poison?