L'algorithme Boyer-Moore est un algorithme de correspondance de chaînes efficace, largement utilisé dans la recherche de texte, les éditeurs, les compilateurs et divers outils de correspondance de modèles. Cet article présentera le fonctionnement de l'algorithme de Boyer-Moore et donnera des exemples de code spécifiques.
1. Principe de fonctionnement
L'algorithme Boyer-Moore commence la correspondance à partir de la fin du texte recherché et compare inversement les caractères de la chaîne de motif et de la chaîne de texte. Il utilise deux règles heuristiques : la règle du mauvais caractère et la règle du bon suffixe.
Règle des mauvais caractères :
Lorsque vous rencontrez une incompatibilité de caractères, l'algorithme fera glisser la chaîne de modèle vers l'arrière en fonction de la position du mauvais caractère (la dernière position dans la chaîne de modèle) pour aligner les mauvais caractères.
Règle du bon suffixe :
Lorsqu'une incompatibilité de caractères est rencontrée, l'algorithme fera glisser la chaîne de motif vers l'arrière en fonction de la position d'occurrence et de la longueur du bon suffixe afin que les bons suffixes soient alignés. Un bon suffixe est un suffixe dans la chaîne de modèle qui correspond à la chaîne de texte.
L'algorithme Boyer-Moore déplace continuellement la chaîne de motif et ignore les caractères sans correspondance, réduisant ainsi considérablement le nombre de comparaisons et améliorant l'efficacité de la correspondance.
2. Scénarios d'application
L'algorithme Boyer-Moore convient à la recherche de correspondance de texte à grande échelle, en particulier lorsque la chaîne de modèle est longue et le jeu de caractères est grand, par rapport à d'autres algorithmes de correspondance de chaîne courants (tels que KMP, Bruteforce). , etc.), présente des avantages évidents.
Par exemple, dans le traitement de texte, les moteurs de recherche et les compilateurs, nous devons trouver efficacement des mots-clés, des noms de variables ou des chaînes spécifiques. L'algorithme Boyer-Moore peut localiser rapidement les positions correspondantes possibles dans le texte, accélérant ainsi le processus de recherche.
Ce qui suit est un exemple de code PHP simple qui montre comment utiliser l'algorithme de Boyer-Moore pour la correspondance de chaînes :
<?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; } ?>
Dans l'exemple de code ci-dessus, nous ajoutons la chaîne de texte à la fonction $text
和模式串$pattern
传入boyerMoore
, et la fonction renverra la correspondance position. Si aucune chaîne correspondante n'est trouvée, le résultat renvoyé est -1.
Résumé :
L'algorithme de Boyer-Moore permet d'obtenir une correspondance de chaînes efficace grâce à l'application de mauvaises règles de caractères et de bonnes règles de suffixes. Il offre de bonnes performances dans la recherche de texte à grande échelle et est particulièrement adapté au traitement de chaînes de modèles plus longues et de jeux de caractères plus volumineux. Dans des scénarios d'application réels, nous pouvons utiliser l'algorithme de Boyer-Moore pour effectuer rapidement une correspondance de chaînes et améliorer l'efficacité de la recherche et de la correspondance.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!