Bizda quyidagi matn bor bo’lsin


Download 412.49 Kb.
bet3/21
Sana16.02.2023
Hajmi412.49 Kb.
#1203577
1   2   3   4   5   6   7   8   9   ...   21
Bog'liq
kurs iwi malumotlar

Eslatma: Rabin va Karp tomonidan tavsiya etilgan xesh funksiyasi butun sonni hisoblaydi. Satr uchun butun son qiymati qatorning raqamli qiymatidir. 
Misol uchun, agar barcha mumkin bo'lgan belgilar 1 dan 10 gacha bo'lsa, "122" ning raqamli qiymati 122 bo'ladi. 
Mumkin bo'lgan belgilar soni 10 dan ortiq (umuman 256) va naqsh uzunligi katta bo'lishi mumkin. Shunday qilib, raqamli qiymatlarni amalda butun son sifatida saqlash mumkin emas. Shuning uchun, son qiymat modulli arifmetika yordamida hisoblab chiqiladi, bu xesh qiymatlari butun o'zgaruvchida saqlanishi mumkinligiga ishonch hosil qilish uchun (xotira so'zlariga sig'ishi mumkin). Qayta ishlash uchun biz eng muhim raqamni olib tashlashimiz va xesh qiymatiga yangi eng kam ahamiyatli raqamni qo'shishimiz kerak. Qayta tiklash quyidagi formula yordamida amalga oshiriladi:
hash( txt[s+1 .. s+m] ) = ( d ( hash( txt[s .. s+m-1]) – txt[s]*h ) + txt[s + m] ) mod q
hash( txt[s .. s+m-1] ) : Shiftdagi xesh qiymati s
hash( txt[s+1 .. s+m] ) : Keyingi siljishdagi xesh qiymati (yoki smena s +1) 
d : Raqam alifbodagi belgilar soni
q : tub son 
h: d (m-1)
Yuqoridagi ifoda qanday ishlaydi? 
Bu oddiy matematika, biz oldingi oynadan joriy oynaning kasr qiymatini hisoblaymiz. 
Misol: naqsh uzunligi 3 va qator “23456” 
Siz birinchi oynaning qiymatini (bu “234”) 234 deb 
hisoblaysiz. Keyingi “345” oynasining qiymatini qanday hisoblaysiz? Siz (234 - 2 * 100) * 10 + 5 ni bajarasiz va 345 ni olasiz.
G'oyani amalga oshirish uchun bu erda ko'rsatilgan bosqichlarni bajaring:

  • Dastlab naqshning hash qiymatini hisoblang.

  • Iteratsiyani satr boshidan boshlang:

    • Uzunligi m bo'lgan joriy pastki qatorning xesh qiymatini hisoblang.

    • Agar joriy pastki satr va naqshning xesh qiymati bir xil bo'lsa, pastki qator naqsh bilan bir xilligini tekshiring.

    • Agar ular bir xil bo'lsa, boshlang'ich indeksni to'g'ri javob sifatida saqlang. Aks holda, keyingi pastki qatorlar uchun davom eting.

  • Kerakli javob sifatida boshlang'ich indekslarni qaytaring.

Quyida yuqoridagi yondashuvni amalga oshirish ko'rsatilgan:

  • C++

  • C

  • Java

  • Python 3

  • C#

  • Javascript

/* Following program is a C++ implementation of Rabin Karp
Algorithm given in the CLRS book */
#include
using namespace std;
// d is the number of characters in the input alphabet
#define d 256
/* pat -> pattern
txt -> text
q -> A prime number
*/
void search(char pat[], char txt[], int q)
{
int M = strlen(pat);
int N = strlen(txt);
int i, j;
int p = 0; // hash value for pattern
int t = 0; // hash value for txt
int h = 1;
// The value of h would be "pow(d, M-1)%q"
for (i = 0; i < M - 1; i++)
h = (h * d) % q;
// Calculate the hash value of pattern and first
// window of text
for (i = 0; i < M; i++) {
p = (d * p + pat[i]) % q;
t = (d * t + txt[i]) % q;
}
// Slide the pattern over text one by one
for (i = 0; i <= N - M; i++) {
// Check the hash values of current window of text
// and pattern. If the hash values match then only
// check for characters one by one
if (p == t) {
/* Check for characters one by one */
for (j = 0; j < M; j++) {
if (txt[i + j] != pat[j]) {
break;
}
}
// if p == t and pat[0...M-1] = txt[i, i+1,
// ...i+M-1]
if (j == M)
cout << "Pattern found at index " << i
<< endl;
}
// Calculate hash value for next window of text:
// Remove leading digit, add trailing digit
if (i < N - M) {
t = (d * (t - txt[i] * h) + txt[i + M]) % q;
// We might get negative value of t, converting
// it to positive
if (t < 0)
t = (t + q);
}
}
}
/* Driver code */
int main()
{
char txt[] = "GEEKS FOR GEEKS";
char pat[] = "GEEK";
// we mod to avoid overflowing of value but we should
// take as big q as possible to avoid the collison
int q = INT_MAX;
// Function Call
search(pat, txt, q);
return 0;
}
// This is code is contributed by rathbhupendra


Download 412.49 Kb.

Do'stlaringiz bilan baham:
1   2   3   4   5   6   7   8   9   ...   21




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling