Algoritma Boyer-Moore ialah algoritma pemadanan rentetan yang cekap, digunakan secara meluas dalam carian teks, editor, penyusun dan pelbagai alatan padanan corak. Artikel ini akan memperkenalkan cara algoritma Boyer-Moore berfungsi dan memberikan contoh kod khusus.
1. Prinsip kerja
Algoritma Boyer-Moore mula memadankan dari penghujung teks yang sedang dicari dan membandingkan secara terbalik aksara rentetan corak dan rentetan teks. Ia menggunakan dua peraturan heuristik: peraturan watak buruk dan peraturan akhiran yang baik.
Peraturan Watak Buruk:
Apabila menghadapi ketidakpadanan aksara, algoritma akan meluncur rentetan corak ke belakang berdasarkan kedudukan watak buruk (kedudukan terakhir dalam rentetan corak) untuk menjajarkan aksara buruk.
Peraturan Akhiran Baik:
Apabila ketidakpadanan aksara ditemui, algoritma akan meluncur rentetan corak ke belakang mengikut kedudukan kejadian dan panjang akhiran yang baik supaya akhiran yang baik diselaraskan. Akhiran yang baik ialah akhiran dalam rentetan corak yang sepadan dengan rentetan teks.
Algoritma Boyer-Moore secara berterusan menggerakkan rentetan corak dan melangkau aksara yang tidak dapat dipadankan, sekali gus mengurangkan bilangan perbandingan dan meningkatkan kecekapan pemadanan.
2. Senario aplikasi
Algoritma Boyer-Moore sesuai untuk carian pemadanan teks berskala besar, terutamanya apabila rentetan corak panjang dan set aksara besar, berbanding dengan algoritma pemadanan rentetan biasa yang lain (seperti KMP, Brute-force , dsb.), mempunyai kelebihan yang jelas.
Sebagai contoh, dalam pemprosesan teks, enjin carian dan penyusun, kita perlu mencari kata kunci, nama pembolehubah atau rentetan tertentu dengan cekap. Algoritma Boyer-Moore dengan cepat boleh mencari kemungkinan kedudukan padanan dalam teks, dengan itu mempercepatkan proses carian.
Berikut ialah contoh kod PHP ringkas yang menunjukkan cara menggunakan algoritma Boyer-Moore untuk pemadanan rentetan:
<?php function boyerMoore($text, $pattern) { $textLength = strlen($text); $patternLength = strlen($pattern); $lastOccurrence = array(); // 初始化坏字符的位置表 for ($i = 0; $i < $patternLength; $i++) { $lastOccurrence[$pattern[$i]] = $i; } $offset = 0; while ($offset <= $textLength - $patternLength) { // 从末尾开始匹配 for ($j = $patternLength - 1; $j >= 0 && $pattern[$j] == $text[$offset + $j]; $j--); if ($j < 0) { // 找到匹配 return $offset; } else { // 根据坏字符规则和好后缀规则计算滑动距离 // 坏字符规则 $badCharDist = $j - $lastOccurrence[$text[$offset + $j]]; // 好后缀规则 $goodSuffixDist = 0; if ($j < $patternLength - 1) { $goodSuffixDist = $moveBy = $patternLength - $j; for ($k = $j + 1; $k < $patternLength - 1; $k++) { if ($pattern[$k] == $pattern[$k - $j - 1]) { $goodSuffixDist--; } } } // 取最大距离 $offset += max($badCharDist, $goodSuffixDist); } } // 未找到匹配 return -1; } // 示例用法 $text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit."; $pattern = "dolor"; $result = boyerMoore($text, $pattern); if ($result == -1) { echo "未找到匹配的字符串"; } else { echo "匹配的字符串位置:".$result; } ?>
Dalam kod sampel di atas, kami menambah rentetan teks pada fungsi $text
和模式串$pattern
传入boyerMoore
, yang akan mengembalikan kedudukan padanan. Jika tiada rentetan yang sepadan ditemui, hasil pulangan ialah -1.
Ringkasan:
Algoritma Boyer-Moore mencapai padanan rentetan yang cekap melalui penerapan peraturan watak buruk dan peraturan akhiran yang baik. Ia mempunyai prestasi yang baik dalam carian teks berskala besar, dan amat sesuai untuk memproses rentetan corak yang lebih panjang dan set aksara yang lebih besar. Dalam senario aplikasi sebenar, kita boleh menggunakan algoritma Boyer-Moore untuk melaksanakan pemadanan rentetan dengan cepat dan meningkatkan kecekapan carian dan pemadanan.
Atas ialah kandungan terperinci Prinsip kerja dan senario aplikasi algoritma Boyer-Moore dalam algoritma pemadanan rentetan dalam PHP.. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!