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

Multi tool use
Multi tool use

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


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















Алгоритм Рабіна — Карпа
Клас
Пошук рядка
Найгірша швидкодія
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


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


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

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


kEaO3I0,fT0,TMNWtjBw8G7 b,Py4 O2rsI 3nBbBDix3V2Dj B
ooIw0xmScQevkQLu1f,N l,hehyfWnDzU,ayD PH2I9,wIV

Popular posts from this blog

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рвиправивши або дописавши її

No such entity with customerId The Next CEO of Stack OverflowTruncate table using resource model in Magento 2Custom Customer Attribute (string) get function not workingGetting current customer in custom REST API moduleSubstitute existing Customer EAV AttributesMagento 2 - Best practice for extending customer entityFatal error: Call to a member function create() on nullProduct custom attribute import with CSV Magento 2.2What is the distinction between defining a customer attribute as “system” versus not “user defined”?Custom EAV Entity Type Missing “default_attribute_set_id” In ModelMagento 2.2: Add Customer Attribute to Custom Tab in AdminHow to mass update custom dropdown customer attribute to all customers? PHP or SQL

Буцька Катерина Петрівна Зміст Біографія | Фільмографія | Дублювання та озвучення українською | Дублювання та озвучення російською | Озвучення реклами | Навігаційне менюперевірена109 змінвиправивши або дописавши її