User:Fenrir3737/Kullanıcı:Fenrir3737/Aho-Corasick Algoritması

Bilgisayar biliminde Aho—Corasick algoritması, 1975'te Alfred V. Aho ve Margaret J. Corasick tarafından icat edilen bir dizi arama algoritmasıdır. Bu, bir girdi metni içindeki sonlu bir dizi dizideki ("sözlük") öğelerin yerini belirleyen bir tür sözlük eşleştirme algoritmasıdır. Tüm dizelerle aynı anda eşleşir. Algoritmanın karmaşıklığı, dizelerin uzunluğu artı aranan metnin uzunluğu artı çıktı eşleşmelerinin sayısıyla doğrusaldır. Tüm eşleşmeler bulunduğundan, her alt dizenin eşleşmesi durumunda ikinci dereceden sayıda eşleşme olabileceğini unutmayın (örn. sözlük =a ,aa ,aaa ,aaaa ve giriş dizesiaaaa ).

Algoritma, düğümler(nodes) arasında bağlantılar(edges) bulunan bir trie'yi -bu veri yapılarında bilinen bir ağaç türüdür- andıran finite-state machine oluşturur. Var olan bağlantılar haricinde ek bağlantılar, başarısız string eşleşmeleri arasında hızlı geçişlere izin verir (örneğin, cart kelimesini içermeyen ama art kelimesini içeren bir trie'da cart kelimesi için yapılan bir arama, car ile başlayan düğümde başarısız olur), ve ortak bir son eki paylaşan trie'nin diğer dallarına geçiş yapılabilir (örneğin, önceki durumda attribute kelimesi için bir dal en iyi yan geçiş olabilir). Bu, otomatonun backtracking ihtiyacı olmadan string eşleşmeleri arasında geçiş yapmasına olanak tanır.

Oluşturulan kelimeler listesi ile bir metin içerisinde geçen kelimelerin tespiti yapılabilir. Bu uygulamalar ayrıca SEO uygulamalarını geliştirme oldukça yardımcı olabilir. Uygulamanın zaman karmaşıklığı doğrusaldır ve araştırma yapılacak metinin uzunluğu ve eşleşen metinsel ifadelerin toplamıdır.

Bu örnekte şu kelimelerden oluşan bir sözlük ele alacağız: {a, ab, bab, bc, bca, c, caa}.

Aşağıdaki grafik, belirtilen sözlükten oluşturulan Aho—Corasick veri yapısıdır; tablodaki her satır, üçlüdeki bir düğümü temsil eder ve sütun yolu, kökten düğüme kadar (benzersiz) karakter dizisini belirtir.

Veri yapısında sözlükteki her dizenin her öneki için bir düğüm bulunur. Yani eğer (bca) sözlükte varsa, o zaman (bca), (bc), (b) ve için düğümler olacaktır. Sözlükte bir düğüm varsa o zaman mavi bir düğümdür. Aksi takdirde gri bir düğümdür.

Her düğümden, adı bir karakter eklenerek bulunan düğüme siyah yönlü bir "çocuk" yay vardır. Yani (bc)'den (bca)'ya siyah bir yay vardır.

Her düğümden düğüme, grafikte mümkün olan en uzun katı sonek olan mavi yönlü bir "son ek" yayı vardır. Örneğin, (caa) düğümü için katı son ekleri (aa) ve (a) ve 'dir. Bunlardan grafikte yer alan en uzunu (a)’dır. Yani (caa)'dan (a)'ya mavi bir yay vardır. Mavi yaylar, kökten başlayarak genişlik öncelikli arama [potansiyel sonek düğümü her zaman daha düşük seviyede olacaktır] gerçekleştirilerek doğrusal zamanda hesaplanabilir. Ziyaret edilen bir düğümün mavi yayının hedefi, ebeveyninin mavi yayını en uzun sonek düğümüne kadar takip ederek ve karakteri ziyaret edilen düğümünkiyle eşleşen sonek düğümünün bir alt öğesini arayarak bulunabilir. Karakter çocuk olarak mevcut değilse, bir sonraki en uzun eki (yine mavi yay sonrasında) bulabilir ve ardından karakteri arayabiliriz. Bunu, karakteri bulana kadar (bir düğümün çocuğu olarak) veya köke ulaşana kadar (ki bu her zaman her dizenin bir son eki olacaktır) yapabiliriz.

Sözlükte her düğümden bir sonraki düğüme mavi yaylar takip edilerek ulaşılabilen yeşil bir "sözlük son eki" yayı bulunmaktadır. Örneğin, (bca)'dan (a)'ya yeşil bir yay vardır, çünkü (a), sözlükteki ilk düğümdür (yani mavi bir düğümdür), mavi yayları (ca)'ya ve daha sonra ('ye) takip ederek ulaşılmaktadır. A). Yeşil yaylar, mavi bir düğüm bulunana kadar mavi yayların tekrar tekrar geçilmesi ve bu bilginin hafızaya alınması yoluyla doğrusal zamanda hesaplanabilir.