instagram twitter linkedin github youtube

14.7.15

Knuth-Morris Prat arama algoritması

Knuth-Morris-Prat Bir kelimenin (yada Bir metin parçasının) Bir metin İÇERİSİNDE aranmasını sağlayan algoritmadır algoritması. Basitçe bu algoritmada Bir kelimenin aranan Metinde bakılması ziyaretinde bakıldığı yerde bulunamaması durumunda nerede olabilecegi Ile Ilgili Bir Bilginin Elde Edilmesi hedeflenir.
Algoritma aranan kelimenin, aranan Metinde bulunmaması durumunda, kelimenin içerisindeki harflerden yola çıkarak Birden Fazla ihtimali elemektedir.
Klasik Bir metin arama işleminde aranan kelime metindeki bütün, ihtimallerde denenir. (Örneğin Doğrusal arama (doğrusal arama)  bu sekılde Çalışır). KMP algoritmasında imkb aranan metindeki bütün, ihtimaller denenmez. Bu Durumu anlamak Click Bir örnek Üzerinden algoritmayı inceleyelim:
KMP algoritmasının çalışması.
Örneğin metin Olarak:
ŞABCDŞADEFABŞADI
Aranan kelime Olarak da:
Sadi
Click KMP algoritmasının nasıl çalıştığını inceleyelim.
Öncelikle aranan kelime aşağıdaki sekılde ilk harflerinden karşılaştırılmaya başlanır ziyaretinde metin:
ŞABCDŞADEFABŞADI
Sadi
ilk on iki Harfin tutmasına karsilik 3. 4. harfler tutmamaktadır ettik. Algoritma benzemeyen ilk harf Olan 3. harfi bulunca geri kalanını benzetmeye çalışmaktan vaz geçer. AYRICA bakmış Olduğu harflerden hiçbirisi Aradığı kelime olmadigi Click Metinde Aradığı kelime boyu Kadar kayarak yeniden arama yapar.
ŞABCDŞADEFABŞADI
    Sadi
Yukarıdaki sekılde 4 harf kayarak D harfinden itibaren ODALAR VE DETAY arama YAPMAYA baslar göster çünkü Bir Önceki aramada, ilk 4 harf Arasında aranan kelimenin ilk harfi Olan Ş harfinin bulunmadığını anlamis ziyaretinde artık bu harflere bakmak gerekmediği sonucuna varmıştır.
4. harf Olan D harfi ile Başlayan Metinde, aranan kelime Olan sadi karşılaştırılmış ziyaretinde görülmüştür ki metin uymmamaktadır. Ancak aranan Metnin Bir Parçası Olan Kısmı üzücü göster buradaki aranan harfler arasındadır. dolayısıyla algoritma bu sefer 1 harf kaydırarak Ş harflerini alt alta getirerek deneme yapar ettik.
ŞABCDŞADEFABŞADI
     Sadi
Karşılastırma İşlemi sonucunda ilk ziyaretinde Vardır 3 harf tutmasına karsilik oğul harfte sorun karşılaştırılan harflerden hiç birisi aradığımız kelimenin baş harfi Olan Ş ile başlamamaktadır. Bu DURUMDA 4 harf Daha hareket edilerek Bir Sonraki karşılastırma İşlemi Yapılır Metinde:
ŞABCDŞADEFABŞADI
         Sadi
Karşılaştırmada başarı olmamasına karsilik oğlu harf Ş harfidir ziyaretinde dolayısıyla bu harfi Yakalamak Click 3 harf Daha kaydırılır:
ŞABCDŞADEFABŞADI
            Sadi
Bu kez başarı Elde Edilmiş aranan kelime bulunmuştur ettik.
Yukarıdaki örnekte dikkat edilirse Toplam 5 karşılastırma İşlemi Yapılmıştır. Bu Işlem Doğrusal arama algoritması ile yapılsaydı 12 karşılastırma gerekcekti. Bu anlamda KMP algoritmasının Daha Başarılı Olduğu söylenebilir.  
Algoritmanın Performansı Olarak O (n) Değeri bulunabilir (n Metnin BOYUTU Olarak düşünülürse). Doğrusal arama ile Cardio sonucun Alındığı algoritma Performansı Click en kötü durum analizi Yapıldığı ziyaretinde en kötü DURUMDA Doğrusal arama ile Cardio olacağı unutulmamalıdır.

Arama algoritması Click pseudocode Açıklaması 

Yukarıdaki örnekte algoritmasının Tüm Unsurları içermektedir.  Şu an Click, bir "kısmi maç" tablosu varlığını varsayalım T tarif, aşağıda biz Şimdiki tek Bir uyumsuzluk biter durumunda Yeni Bir ​​maçın başlama Click bakmak Gerekir nereye Gösterir. Girdileri T biz Başlayan bir maç Varsa o kadar INSA Edilmiş [M] karşılaştırırken Başarısız S [M + i] Click [i] B , bir Sonraki want maç endeksi başlayacak T [- m + II] Olarak S (yani, T [i] biz uyumsuzluğu Sonra yapmanız Gereken "yararlar" miktarıdır ). Bu on iki Etkileri Vardır: birincisi, T [0] -1 = Eger belirten, W [0] Bir uyumsuzluk, biz sarfınazar edemez ziyaretinde Sadece Bir Sonraki karakteri Kontrol etmelidir; ikincisi ettik, bir Sonraki olasi maç Rağmen baslar endeksi de m + I - T [i] , yukarıdaki örnekte Olduğu gibi, göster Aslında hiçbir, Kontrol GEREKMEZ T [i] bundan Sonra karakter, o yüzden gelen arama devam B [T [i]] . Aşağıdaki örnek Bir sözde kod KMP arama algoritması uygulanması.                                   
algoritması  kmp_search :
      Giriş : 
        karakter dizisi, S (metin Arancak) 
        karakter dizisi, W (kelime Aradı) Çıktı : 
        Arasında Bir tamsayıdır ( sıfır Temelli W Bulunan edildiği S pozisyon)
    

    değişkenleri tanımlamak : 
        Bir tamsayı, m ← 0 (S geçerli maçın başında) 
        Bir tamsayı, ben 0 (W geçerli karakterin konumunu) ← 
        tamsayı dizisi, T (tablo Başka Bir yerde, hesaplanan)

    ISE 1 <uzunluk, (S) - m + ı mutlaka 
        Eger B [i] = S [M + i] Sonra 
            Eger i = uzunluk (W) - 1 Ardından 
                Dönüş m
              Izin i ← i + 1
          başka 
            Eger T [i]> -1 Sonra 
                Topçu Alay Komutanı m ← m + i - T [i] T ← [i]
              başka 
                Izin 0 ← m ← m + 1 i 
            
    (Burada Ulaşmak, biz Başarısız S Tüm arama var) DÖNMEK S uzunluğu

    

ARAMA algoritması verimliligi 

Tablo Önceden var oldugunu varsayarak, T , Knuth-Morris-Pratt algoritmasının Ara bölüme sahiptir karmaşıklığı O ( n ) , n, uzunluğu S ziyaretinde O Olduğu Büyük O gösterimi . Giren ziyaretinde çıkan fonksiyonu Click katlanılan sabit Yükü Dışında, tum Hesaplamaları yapılmaktadır Süre döngü. Bu döngünün yineleme Sayısı Bağlı etmek; Bu gözlemlemek T İnşa böylece Başlamış Olan bir maç Eger [M] karşılaştırarak yaparken Başarısız S [M + i] Click B [I] , bir Sonraki want maç başlayacak Gerekir S [M +: (i - Ti [i])] . Özellikle, bir Sonraki olasi maç Daha YÜKSEK endeks meydana gerektiğini m böylece, T [i] <i                                  
Bu durum döngüsü tr Fazla 2 yürütebilirsiniz ima n ona tekrarda bu döngü on iki kolundan biri yürütür beri kez. ilk dalı değişmez artar i değişmez ziyaretinde m İndeksi, böylece m + ı , şu anda incelenip karakter S artar. İkinci şube ekler [i] T - i ıcın m onu met, gördüğümüz Gibi ettik, zaman pozitif Bir sayıdır. Böylece Konum m MEVCUT Potansiyel maçın başında artar. Ayni ZAMANDA, ikinci Bir ​​dal Yaprakları M + l Click değişmemiş m Alir I - T [i] buna ilave etmek, Edildi ziyaretinde hemen Sonra T [i] Yeni Bir ​​Değer Olarak atanmaktadır ziyaretinde i , dolayısıyla T [old_i] + T [old_i] = old_m + old_i - new_m + new_i = old_m + old_i . , döngü sona ererse şimdi M + = N ; Bu nedenle, döngünün ulaşılabilir tr onun dal n sırasıyla ya beri, zaman artırmak + i m ya da m ziyaretinde m ≤ m + i Eger: m = n , sonra kesinlikle m + in , o göster çünkü böylece En birim artışlarla artar, biz olmalıydı i + m = n Bir is on a distinguished bu nedenle ziyaretinde Geçmişte onu on iki DURUMDA da biz bitmiş OLACAKTIR.                                                          
Böylece döngü En Fazla 2 çalıştırır n arama algoritması zaman karmaşıklığı oldugunu gösteren, Sureleri O ( n ).      
İşte çalışma zamanı Düşünmek Click Başka Bir yoludur: Bize maç BAŞLAR diyelim B ziyaretinde S pozisyonunda i ziyaretinde s . Eger B Bir alt dize Olarak var S s, sonra [0..m] W = S [p..p + m] . Başarı Üzerine, bu kelime POZİSYONLARDA Eşleşen metin (Olduğu ziyaretinde [i] = S [p + i] W ), biz artırmak i metin de uymuyor Pozisyonları (ve kelime, yani başarısızlık Üzerine 1 ile W [i] ≠ S [p i + ] ) kelimesi işaretçi beligbli Bir ​​miktar geri alınır imkb, metin işaretçisi, hala Tutulur ( i = T [i] , burada T atlama tablo), A.Ş. Biz maç girişiminde W [T [i]] ile S [p + i] . rulo -arka Sayısı i Tarafından sınırlanan i , O, söylemek biz başarısızlık Kadar ilerlemiştir gibi HERHANGİ Bir başarısızlık, biz sadece sadece geri Kadar dönebilirsiniz oldugunu. Sonra 2 Açıktır zamanı N                                     

Horspool Algoritması

Algoritmanın gayesi, bir metin İÇERİSİNDE Verilen Bir  dizginin (string)  aranmasıdır. Literatürde arama Yapılan metin Click T (ingilizcedeki Metin (metin) kelimesinden gelmektedir) aranan kelime Click P (ingilizcedeki Desen (örüntü) kelimesinden gelmektedir) kullanılmaktadır ettik.
Klasik bir arama, yukarıdaki resimde gösterilmiştir Temsili.
Algoritmanın Diğer metin arama algoritmalarından En Büyük farkı, aranan dizgi (pattern) Yerine aranılan metin (text) Üzerinden Işlem yapmasıdır.
Yukarıdaki sekilde gösterildiği gibi, uzerinde arama isleminin Yapıldığı Metinde Bulunan HERHANGİ Bir X harfi İçin, aranılan metin Üzerindeki (pattern) en solda Olan harf bulunmaya çalışılır.
Arama işlemine başlanan α değerinin Ardından gelen harfler eşleştiği Sürece, aranan kelimenin (pattern) Sonuna Kadar eşleştikçe arama İşlemi devam eder. Şayet bu aşama uyuşmayan bir harf olursa, zaten aranan kelimenin olmadigi sonucuna varılabilir.
Ardından uyuşma OLUP olmadığına bakılmaksızın aranan kelimeyi ß değerine denk gelecek sekılde kaydırma İşlemi Yapılır. Bu kaydırmanın Olması Click kelimenin (pattern) kalan kısmında ikinci Bir değerinin bulunmaması Gerekir.
Örnek
Algoritmanın CALISMASINI Bir örnek Üzerinden göstermeye çalışalım.
Yukarıdaki sekilde görüldüğü Üzere, aranan kelime Click (P) sağdan sola doğru Bir numaralandırma yapılmakta bu numaralandırma Üzerinden aşağıda gösterilen HpBc dizisi çıkarılır ve. Bu dizi Üzerinden metin uzerinde arama Yapılır.
Sırasıyla, bir kez harfi aranır. Ardından C G harfleri aranır ettik. Dikkat edilirse, kelimede üç kere Geçen A harfi, dizide bir kere kullanılmaktadır.
Uyuşma oldukca aranan kelime kaydırılmaktadır.

Müsvette Kod (Pseudo Code)
Algoritmanın müsvette kodu aşağıdaki sekılde yazılabilir:
Horspool (p = p 1 p 2 ... p m , T = t 1 t 2 t ... n 
Önişleme Aşaması
Için c Î Σ Do d [ c ] ← m     
Için j Î 1 ... m -1 Do d [ p j ] ← m - j     
Arama Aşaması
Poz ← 0
Iken posnm Do    
m
Iken j > 0 Ve t pos + j = p j     Do jj-       
Eğer j : = 0 Bulundu pos +1   
pos  ← pos + d [ t pos + m 
Süre sonu
Yukarıdaki algoritmada Geçen değerlerin, örnek Üzerindeki gösterimlerini adım adım anlatmaya çalışalım:
Yukarıdaki ilk Adımda aranan ilk harf Olan C harfi için öncelikle kümede OLUP olmadigi KONTROLÜ Yapılır. Eklendi bunun anlamı aranan kelimenin harflerinden birisi Olmaması durumunda vakit kaybedilmemesidir.
İkinci Adımda ISE Daha Önce çıkardığımız HpBc [a] dizisine Göre onu Harfin Değerleri atanır.
Arama isleminin devamı aşağıdaki şekildedir:

GCATCGC bir GAGAGTATACAGTACG
GCAGAGA G
     Poz 0 + d [t 0 + 7 ], pos0 + d [ A ], pos ← 1        

Yukarıda görüldüğü Üzere, kelimenin ilk KONTROLÜ Bir Değeri aranmıştır Bulunan 1. pozisyonda Click. Ardından arama İşlemi Sonraki harf Olan G Click aşağıdaki sekılde devam eder:
GCATCG CAG AGAGTATACAGTACG
GCAGA GAG
pos  ← 1 + d [t 1 + 7 ], pos ← 1   + d [ G ], pos ← 3.  
G harfi ile Cı harfinin tutuşmamasından Dolayı aranan kelime (P) kaydırılmıştır.
GCATCG CAGAG AGTATACAGTACG
GKRY GAGAG
pos  ← 3 + d [t 3 + 7 ], pos3 + d [ G ], pos ← 5      
Benzer sekilde Cı G ziyaretinde uyuşmamasından Dolayı bir kere Daha kaydırıyoruz.
GCATC GCAGAGAG TATACAGTACG
GCAGAGAG
Iken j > 0 Ve t pos + j = p j Do jj-1        
Eğer j = 0 pos + 1'de Bulundu   
pos  ← 5 + d [t 5 + 7 ], pos ← 5   + d [ G ], pos ← 7  
Görüldüğü Üzere aranan kelime ile uyuşma oldu. Algoritmamızın Ilgili satırlarını çalıştırıyor bulunduğunu rapor Ediyoruz ettik.
GCATCGCAGAGAGT bir TACAGTACG
GCAGAGA G
pos  ← 7 + d [t 7 + 7 ], pos ← 7   + d [ A ], pos ← 8  
İkinci kere A harfini arıyoruz.
GCATCGCAGAGAGTA T ACAGTACG
GCAGAGA G
pos  ← 8 + d [t 8 + 7 ], pos ← 8   + d [ T ], pos ← 16  
Bir harfi G harfi ile uyuşmadığı Click atlıyoruz Bulunan:
GCATCGCAGAGAGTATACAGTAC G
GCAGAGA G
pos  ← 16 + d [t 16 + 7 ], pos ← 16   + d [ G ], pos 18 ←  
pos> nm // pos> 23-7
döngüsünden cik iken.
Oğlu Olarak kelimenin Sonuna gelindiği halde aranan yazı bulunmadığı Click algoritma sonlanıyor.
Algoritmanın Karmaşıklığı
Algoritmanın zaman karmaşıklığı aranan kelimenin boyu n ziyaretinde aranılan kelimenin boyu m olmak Üzere O (mn) 'dir denilebilir. Çünkü en kötü DURUMDA onu aranılan kelime harfi Click uzerinde arama Yaptığımız onu harfi karşılaştırmamız gerekebilir. Bu da onu n harf Click m adet karşılaştırmaya eşittir.
 Brute-Force'a Benzer sekilde pattern'in oğlu harfinden başlanarak soldan saga ve yukagbıdan doğru desen ziyaretinde text'te karşılıklı denk gelen harfler karşılaştırılır. Eger pattern'deki Tüm karakterlerin eşleşmesi sağlanırsa alt dize bulunmuş demektir. Bu DURUMDA arama durdurulabilir VEYA Başka eşleşme var mı diye Aramaya devam Edilebilir.

Eşleşme olmazsa pattern'i Sağa kaydırmamız Gerekir. Bu DURUMDA HERHANGİ Bir eşleşmeyi kaçırma olasılığını riske atmadan yapabileceğimiz En Büyük olasi kaydırmayı yapmak isteriz. Horspool algoritması burada son karakterine karsilik gelen (c) 'pattern'in karakterine bakarak kaydırma yapar. Burada dört Olasılık söz konusudur. Bu durumlardan ilerideki sayfalarda bahsedilecek.

BERBER pattern'ini Bir text'te aradığımızı düşünelim.
Pattern'in oğlu elemanı Olan R ile başlayarak sağdan sola doğru hareket ediyoruz ziyaretinde metin ile pattern'de karsilik gelen Karakterleri karşılaştırıyoruz. Eger pattern'deki karakterlerin tümü eşleşirse alt dize bulunmuş demektir.

Eşleşme olmazsa pattern'i Sağa kaydırmamız Gerekir. Bu DURUMDA HERHANGİ Bir eşleşmeyi kaçırma olasılığını riske atmadan yapabileceğimiz En Büyük olasi kaydırmayı yapmak isteriz. Horspool algoritması burada son karakterine karsilik gelen (c) 'pattern'in karakterine bakarak kaydırma yapar.

Burada dört durum söz konusudur.

Durum 1 : c harfi pattern'de yoksa Örn. örnekteki S harfi. . Bu DURUMDA pattern'i BOYUTU Kadar Sağa kaydırabiliriz (Bu boyuttan Küçük Bir karşılastırma gerçekleştirirsek pattern'i karşılaştırdığımız KONUMDA pattern'de olmayan Bir c harfi ile denk getirmiş oluruz):


Durum 2 : Patternde c harfi Varsa o oğul karakter değilse orn ettik. örnekteki B harfi. Kaydırma Cı harfinin patternde görüldüğü en Sağ Noktaya denk gelecek sekilde gerçekleştirilmelidir, bu sekilde patterndeki Cı harfi ile text'teki Cı harfi eşleşmiş olur ziyaretinde Diğer karakteler de Eşit mi diye bakılır.


Durum 3:  c karakteri patterndeki oğlu karakterse göster Fakat pattern'in Diğer m - 1 karakterinde bu c karakteri yoksa Örn. örnekteki R harfi. Bu DURUMDA, makarnalık 1'e Benzer sekilde desen BOYUTU Kadar kaydırma Yapılır.


Durum 4 : c karakteri patterndeki oğlu karakterse pattern'in Diğer m A.Ş. - 1 karakterinde bu karakter tekrar ediyorsa Örn. örnekteki R harfi. Bu DURUMDA, Durum 2'ye Benzer sekilde patternde c'nin bulundugu tr Sağ Konuma Göre kaydırma Yapılır. Bu sayede text'teki c karakteri ile pattern'deki Cardio karakter hizalanmış olur. 


Bu örnek sağdan sola şeklinde gerçekleştirilen karakter karşılaştırmalarının kaba kuvvet algoritmasındaki gibi her Adımda Bir kaydırmadan öteye gidebileceğini Bize açıkça göstermektedir. Her turda patterndeki Tüm karakterlerin Kontrol Edilmesi bu algoritmanın üstünlüğünü Ortadan kaldırırdı. Neyse ki girdi Geliştirme fikri tekrar eden karşılaştırmaları gereksiz hale daha zor hale getiriyor. Kaydırma boyutlarını Önceden hesaplayıp Bir tabloya atabiliriz. Tablo text'te karşımıza çıkabilecek Tüm want Karakterleri içerecektir; doğal dil text'leri Click boşluk, noktalama işaretleri ziyaretinde Diğer Özel karakterler gibi. Tablo, folmül ile Bulunan kaydırma boyutunu gösterecektir.

Örneğin ERKEK pattern'i İçin, E, B, R3 4 OLACAKTIR ziyaretinde bir Karakterleri sırasıyla 1, 2, ve,. Diğer Tüm tablo Girdileri 6'ya Eşit OLACAKTIR.

Aşağıda kaydırma tablosunun hesaplanması Click Basit bir algoritma verilmiştir. Tablodaki Tüm Girdileri pattern'in BOYUTU Olan m Değeri Başlangıç ​​Değeri Olarak yüklenir desen ziyaretinde soldan Sağa doğru devamındaki aşamayı m - 1 kere tekrar EDECEK sekilde taranır; patterndeki j. karakter Click (0 <= j <= m - 2) ONUN tablodaki girdisini m - 1 - j ile Change Language. Bu da karakterin pattern'in oğul karakterine Olan uzaklığıdır. Algoritma pattern'i soldan saga ve yukagbıdan taradığı oğlu Click için üstüne yazma tr sağdaki karakterde gerçekleşecektir.

ALGORİTMA  ShiftTable (P  [0 ..M  -  1] )
// Horspool en ve Boyer-Moore algoritması tarafından kullanılan kaydırma tablosunu doldurur
// Girdi: Pattern  P [0 ..M  -  1] olası karakterleri ve bir alfabe
// Çıktı:  Tablo [0 ..size  -  1] alfabe karakterleri ve endeksli
// Formülle hesaplanan vardiya boyutları ile dolu
için  0  için  boyut  -  1  do  Masa [ i ] m
için  0  için   -  2  do  Tablo [ P [ ]] -  1 -  j
Dönüş  Tablosu


Algoritmayı şu sekılde özetleyebiliriz:

Adım 1  Verilen m boyutlu model ziyaretinde text'te Kullanılan alfabe Click kaydırma Tablosunu yukarda anlatıldığı gibi oluştur desen ziyaretinde
Adım 2  Pattern'i text'in Başına Hizala
Adım 3  Bunu Eşleşen Bir alt dize bulana Kadar ya da text'in Sonuna Kadar gelene tekrarla. Tüm m karakteri eşleşene Kadar ya da eşleşme bozulana Kadar pattern'deki oğlu karakterden başlayarak, ziyaretinde pattern'de text'de denk gelen Karakterleri karşılaştır. Eşleşme bozulursa Cı karakteri Click kaydırma tablosunda denk gelen sayıyı ark ziyaretinde pattern'i bu sayı Kadar Sağa kaydır.

ALGORİTMA  HorspoolMatching (P  [0 ..M  -  1] , T  [0 ..N  -  1] )
// Girdi: Pattern  P [0 ..M  -  1] ve metin   [0 ..N  -  1]
// Çıktı: ilk eşleşen alt dizenin sol ucunda indeksi
// Veya  - 1 eşleşme varsa
ShiftTable (P  [0 ..M  -  1] )           oluşturmak //  Tablo  kaymaların
-  desenin sağ ucunun 1 // pozisyonu
ise   ≤   -  1  do
keşleşen karakter 0 // sayısı
ise   ≤   -  1  ve  P [ -  1 -  k ] =   [ -  k ]  do
k +  1
eğer   =  m  dönüş   -   +  1
Başka   +  Masa [ [ i ]]
dönmek  - 1

ÖRNEK  Horspool algoritmasının tam uygulamasına örnek vermek gerekirse; İngilizce harflerden Boşluktan ziyaretinde (alt çizgi ile gösterilen) OLUŞAN Bir text'te ERKEK kelimesini arayacak olalım. Öncelikle kaydırma Tablosunu Önceden belirttiğimiz formül ile aşağıdaki gibi doldururuz.

Arama İşlemi imkb aşağıdaki gibi gerçekleşir.

Horspool algoritmasının kötü anahtar etkinligi O (nm) 'dir. Fakat BBC muhabirine rastgele textler Click met karmaşıklık  Θ (n) 'dir kaba kuvvet ziyaretinde sınıfı ile Cardio etkinliğe Sahip olsa da Horspool algoritması açıkça görülmektedir ki ona göre Daha hızlıdır. Hatta bu algoritma kendinin Daha Karmaşık hali Olan Boyer-Moore algoritması Kadar etkin'ait sayılır.

C # dili ile uygulanmış hali:

///  <summary>
///  Horspool algoritması Click vardiya Tablosunu oluşturur
///  </ summary>
///  <param name = "text"> Kontrol edilecek, metin </ param>
///  <param name = "desen"> Text'te Arancak kelime </ param>
///  <döner> Shift tablosuna Uygun'un Verileri atar </ döner>
Özel  static  void  ShiftMyTable ( dize  deseni,  dize  metni)
{
   bool  baskaVar =  false ;
           
   ShiftTable =  new  Hashtable ();  // Tablo edilir başlatılamadı
   için  ( int  i = 0; i <text.Length; i ++)
   {
       eğer  (! ShiftTable.ContainsKey (metin [i]))  // Text'teki Değişken tabloya Daha Önceden eklenmemişse
       {
           eğer  (! pattern.Contains (metin [i] .ToString ()))  // Text'teki harf patternde yoksa
               ShiftTable.Add (metin [i] pattern.Length);  // O harf Click pattern'in lenght'ini tabloya yaz
           başka
           { // Text'teki harf patternde Varsa
               için ( int  J = pattern.Length - 2, J> = 0; j--)
               {
                  eğer  (pattern [j] == metin [i])
                  {
                      baskaVar =  true ;
                      ShiftTable.Add (metin [i], pattern.Length - j - 1);  // Sondan başlayarak O Harfin patterndeki konumuna Göre tabloya Değeri atar
                      kırmak ;
                  }
               }
               eğer  (baskaVar ==  false )
                  ShiftTable.Add (metin [i], pattern.Length);
               başka
                  baskaVar =  false ;}}}}

Yukarıdaki algoritma Horspool algoritması Click Kullanılan kaydırma Tablosunu olusturan algoritmanın C # 'Edilmiş halidir uygulamak ta. Bu yöntem Parametre Olarak desen metin değişkenlerini almaktadır ettik.

için  ( int  i = 0; i <text.Length; i ++)
Text'teki Tüm karakterler Click kaydırma Değeri belirleniyor.

eğer  (! ShiftTable.ContainsKey (metin [i]))
Text'teki karakter Daha Önceden tabloya eklenmişse tekrar eklenmesi gerekmemesi Click Kullanılan koşul.

eğer  (! pattern.Contains (metin [i] .ToString ()))
Eger text'teki karakter patternde yoksa o karakter Click tabloda m Değeri yani pattern'in BOYUTU atanmaktadır. Karakter patternde Varsa karakterin konumunu sağdan başlayarak hesaplıyoruz ziyaretinde bulduğumuz Değer karakterin kaydırma tablosundaki Değer oluyor.

///  <summary>
///  Horspool algoritmasını kullanarak Verilen text'te desen eşleşmesi OLUP olmadığını bulur ziyaretinde eşleşme Varsa eşleşmenin konumunu Dondurur
///  </ summary>
///  <param name = "text"> Kontrol edilecek, metin </ param>
///  <param name = "desen"> Text'te Arancak kelime </ param>
///  <döner> Pattern eşleşmesinin konumunu Dondurur </ döner>
Özel  static  int  HorspoolMatching ( dize  deseni,  dize  metni)
{

      ShiftMyTable (desen, metin);  // Shift tablosunun hesaplanması Click yöntemi çağrılıyor
      int  i = pattern.Length - 1;
      ise  (i <= text.Length - 1)  // göstergesi lenght'ten Kısa ISE döngüye giriliyor
         {
            int  k = 0;
            ise  (- 1 && desen [pattern.Length - 1 - - k] == metin [i k] k <= pattern.Length)  ; // Anahtar karşılaştırma karşılaştırılan harfler eşitse Girilir
            {
                k ++;
            }
            Eğer  (k == pattern.Length)  // Desen bulunduysa
            {
               geri  i - pattern.Length + 1;  // Eşleşmenin Hakkinda Konumu döndürülüyor
            }
            başka
            {
               i = i +  dönüştürme , .ToInt32 (. ShiftTable [metin [i]] ToString ())  // Eşleşme tablosuna Göre endeksi vardiya çıkacağı kayması olmadıysa
            }}
      geri  -1;  // desen eşleşmesi yoksa -1 döndürülüyor
}

Algoritma Parametre Olarak desen text'i alıyor, ve. DAHA SONRA kaydırma tablosu oluşturuluyor. Eşleşme sağlanırsa k değişkeninin Değeri artıyor. k değişkeni m değerine ulaşırsa bu pattern'i textte bulduğumuz anlamına geliyor. Farkı bir durum olursa desen kaydırma tablosuna Göre Sağa kaydırılıyor ziyaretinde karşılaştırmaya devam ediliyor.