Алгоритм Рабіна — Карпа Зміст Ідея алгоритму | Опис алгоритму | Аналіз | Зноски | Джерела | Дивіться також | Навігаційне меню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

Can not update quote_id field of “quote_item” table magento 2Magento 2.1 - We can't remove the item. (Shopping Cart doesnt allow us to remove items before becomes empty)Add value for custom quote item attribute using REST apiREST API endpoint v1/carts/cartId/items always returns error messageCorrect way to save entries to databaseHow to remove all associated quote objects of a customer completelyMagento 2 - Save value from custom input field to quote_itemGet quote_item data using quote id and product id filter in Magento 2How to set additional data to quote_item table from controller in Magento 2?What is the purpose of additional_data column in quote_item table in magento2Set Custom Price to Quote item magento2 from controller

How to solve knockout JS error in Magento 2 Planned maintenance scheduled April 23, 2019 at 23:30 UTC (7:30pm US/Eastern) Announcing the arrival of Valued Associate #679: Cesar Manara Unicorn Meta Zoo #1: Why another podcast?(Magento2) knockout.js:3012 Uncaught ReferenceError: Unable to process bindingUnable to process binding Knockout.js magento 2Cannot read property `scopeLabel` of undefined on Product Detail PageCan't get Customer Data on frontend in Magento 2Magento2 Order Summary - unable to process bindingKO templates are not loading in Magento 2.1 applicationgetting knockout js error magento 2Product grid not load -— Unable to process binding Knockout.js magento 2Product form not loaded in magento2Uncaught ReferenceError: Unable to process binding “if: function()return (isShowLegend()) ” magento 2

Nissan Patrol Зміст Перше покоління — 4W60 (1951-1960) | Друге покоління — 60 series (1960-1980) | Третє покоління (1980–2002) | Четверте покоління — Y60 (1987–1998) | П'яте покоління — Y61 (1997–2013) | Шосте покоління — Y62 (2010- ) | Посилання | Зноски | Навігаційне менюОфіційний український сайтТест-драйв Nissan Patrol 2010 7-го поколінняNissan PatrolКак мы тестировали Nissan Patrol 2016рвиправивши або дописавши її