


Struktur data dan algoritma dalam JavaScript (5): Kemahiran algoritma_javascript KMP klasik
May 16, 2016 pm 03:54 PMAlgoritma KMP dan algoritma BM
KMP ialah algoritma klasik untuk padanan awalan dan padanan akhiran BM Dapat dilihat bahawa perbezaan antara padanan awalan dan padanan akhiran hanya dalam susunan perbandingan
Padanan awalan bermaksud: perbandingan rentetan corak dan rentetan induk adalah dari kiri ke kanan, dan pergerakan rentetan corak juga dari kiri ke kanan
Padanan akhiran bermaksud: perbandingan rentetan corak dan rentetan induk adalah dari kanan ke kiri, dan pergerakan rentetan corak dari kiri ke kanan.
Melalui bab sebelum ini jelas bahawa algoritma BF juga merupakan algoritma awalan, tetapi kecekapan padanan satu demi satu adalah sangat sombong Sememangnya, tidak perlu menyebut O(. mn). KMP, yang menjengkelkan dalam talian, banyak menerangkan mereka pada asasnya menggunakan laluan peringkat tinggi dan anda mungkin keliru >
KMP
KMP juga merupakan versi algoritma awalan yang dioptimumkan Sebab mengapa ia dipanggil KMP ialah singkatan daripada tiga nama Knuth, Morris dan Pratt Berbanding dengan BF, titik pengoptimuman algoritma KMP ialah "the jarak setiap pergerakan ke belakang" Ia akan melaraskan jarak pergerakan setiap rentetan corak secara dinamik. BF ialah 1 setiap kali,Tidak semestinya untuk KMP
Seperti yang ditunjukkan dalam rajah, perbezaan antara pra-algoritma BF dan KMP dibandingkan
Cari rentetan corak P dalam rentetan teks T. Apabila ia secara semula jadi sepadan dengan huruf keenam c, didapati tahap kedua tidak konsisten Kemudian kaedah BF adalah untuk memindahkan keseluruhan rentetan corak P pada satu tempat, dan KMP akan memindahkannya ke dua tempat .
Kami tahu kaedah pemadanan BF, tetapi kenapa KMP menggerakkan dua digit dan bukannya satu atau tiga atau empat digit?
Mari jelaskan gambar sebelumnya Rentetan pola P adalah betul apabila ia sepadan dengan ababa, dan ia adalah salah apabila ia sepadan dengan c Maka idea algoritma KMP ialah: ababa dipadankan dengan betul kami menggunakan maklumat ini untuk tidak mengalihkan "kedudukan carian" kembali ke kedudukan yang telah dibandingkan, tetapi terus mengalihkannya ke belakang, yang meningkatkan kecekapan.
Maka persoalannya, bagaimana saya tahu berapa banyak jawatan yang perlu dipindahkan?
Pengarang algoritma offset KMP ini telah meringkaskannya untuk kami:
Digit peralihan = Bilangan aksara yang dipadankan - Nilai padanan separa yang sepadan
Jadi bagaimana kita memahami bilangan aksara yang dipadankan dalam subrentetan dan nilai padanan separa yang sepadan?
Aksara dipadankan:
p : ababacb
Nilai padanan separa:
Ini adalah algoritma teras, dan ia juga sukar untuk difahamiJika:
P:aaronaac
Kita boleh memerhatikan teks ini Jika kita membuat ralat semasa memadankan c, di manakah langkah seterusnya berdasarkan struktur sebelumnya.
aaronaac
Maksudnya: dalam teks corak, jika permulaan dan penghujung perenggan aksara tertentu adalah sama, maka perenggan kandungan ini boleh dilangkau semasa penapisan semula jadi idea ini juga wajar
Mengetahui peraturan ini, algoritma jadual padanan separa yang diberikan adalah seperti berikut:
Pertama sekali, anda perlu memahami dua konsep: "awalan" dan "akhiran". "Awalan" merujuk kepada semua gabungan kepala rentetan kecuali aksara terakhir; "akhiran" merujuk kepada semua gabungan ekor rentetan kecuali aksara pertama.
"Nilai padanan separa" ialah panjang elemen sepunya terpanjang antara "awalan" dan "akhiran""
Mari kita lihat bahagian aaronaac jika ia adalah perlawanan BF
Anjakan BF: a,aa,aar,aaro,aaron,aarona,aaronaa,aaronaac
Jadi bagaimana pula dengan bahagian-bahagian KMP? Di sini kita perlu memperkenalkan awalan dan akhiran
Mari kita lihat dahulu keputusan jadual padanan separa KMP:
a a r o n a a c
[0, 1, 0, 0, 0, 1, 2, 0]
Saya pasti keliru, jadi jangan risau, mari kita pecahkan, awalan dan akhiran
Rentetan padan: "Aaron"
Awalan: A, Aa, Aar, Aaro
Akhiran: aron,ron,on,n
Kedudukan bergerak: Sebenarnya, ia adalah untuk membandingkan awalan dan akhiran setiap aksara yang dipadankan untuk melihat sama ada ia adalah sama, dan kemudian mengira jumlah panjang
Penguraian jadual padanan separa
Algoritma jadual padanan dalam KMP, dengan p mewakili awalan, n mewakili akhiran dan r mewakili hasil
a, p=>0, n=>0 r = 0
aa, p=>[a], n=>[a], r = a.panjang => 1
aar, p=>[a,aa], n=>[r,ar] ,r = 0
aaro, p=>[a,aa,aar], n=>[o,ra,aro] ,r = 0
aaron p=>[a,aa,aar,aaro], n=>[n,on,ron,aron] ,r = 0
aarona, p=>[a,aa,aar,aaro,aaron], n=>[a,na,ona,rona,arona] ,r = a.lenght = 1
aaronaa, p=>[a,aa,aar,aaro,aaron,aarona], n=>[a,aa,naa,onaa,ronaa,aronaa] , r = Math.max(a.length ,aa.length) = 2
aaronaac p=>[a,aa,aar,aaro,aaron,aarona], n=>[c,ac,aac,naac,onaac,ronaac] r = 0
Sama seperti algoritma BF, mula-mula menguraikan kedudukan setiap subskrip padanan yang mungkin dan cache apabila memadankan, gunakan "jadual padanan separa" ini untuk mencari bilangan digit yang perlu dialihkan
Jadi keputusan akhir jadual padanan aaronaac ialah 0,1,0,0,0,1,2,0
KMP versi JS akan dilaksanakan di bawah, terdapat 2 jenis
Pelaksanaan KMP (1): jadual padanan caching KMP
Pelaksanaan KMP (2): kira KMP seterusnya
secara dinamik
Pelaksanaan KMP (1)
Meja padan
Perkara yang paling penting dalam algoritma KMP ialah jadual padanan Jika jadual padanan tidak diperlukan, maka ia adalah pelaksanaan BF Menambah jadual padanan adalah KMP
Jadual padanan menentukan kiraan anjakan seterusnya
Berdasarkan peraturan jadual padanan di atas, kami mereka bentuk kaedah kmpGetStrPartMatchValue
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
|
Selaras sepenuhnya dengan pelaksanaan algoritma jadual padanan dalam KMP, a->aa->aar->aaro->aaron->aarona-> diuraikan melalui str.substring(0, i 1) aaronaa-aaronaac
Kemudian hitung panjang unsur sepunya melalui awalan dan akhiran dalam setiap penguraian
Algoritma Sandaran
KMP juga merupakan algoritma bahagian hadapan Anda boleh memindahkan sepenuhnya BF satu-satunya pengubahsuaian ialah BF terus menambah 1 apabila KMP berundur, kita boleh mengira nilai seterusnya melalui jadual padanan
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
|
Algoritma KMP lengkap
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 |
|
KMP(二)
第一种kmp的算法很明显,是通过缓存查找匹配表也就是常见的空间换时间了。那么另一种就是时时查找的算法,通过传递一个具体的完成字符串,算出这个匹配值出来,原理都一样
生成缓存表的时候是整体全部算出来的,我们现在等于只要挑其中的一条就可以了,那么只要算法定位到当然的匹配即可
next算法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
其实跟匹配表是一样的,去掉了循环直接定位到当前已成功匹配的串了
完整的KMP.next算法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
|

Artikel Panas

Alat panas Tag

Artikel Panas

Tag artikel panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

CLIP-BEVFormer: Selia secara eksplisit struktur BEVFormer untuk meningkatkan prestasi pengesanan ekor panjang

Melaksanakan Algoritma Pembelajaran Mesin dalam C++: Cabaran dan Penyelesaian Biasa

Terokai prinsip asas dan pemilihan algoritma bagi fungsi isihan C++

Algoritma pengesanan yang dipertingkatkan: untuk pengesanan sasaran dalam imej penderiaan jauh optik resolusi tinggi

Bandingkan struktur data kompleks menggunakan perbandingan fungsi Java

Aplikasi algoritma dalam pembinaan 58 platform potret

Wawasan ke dalam sistem Hongmeng: pengukuran fungsi sebenar dan pengalaman penggunaan

Algoritma CVM terobosan menyelesaikan lebih daripada 40 tahun masalah pengiraan! Saintis komputer membelek syiling untuk mengetahui perkataan unik untuk 'Hamlet'
