【发布时间】:2020-07-17 23:58:32
【问题描述】:
我将如何为流实现Boyer-Moore Search?我了解如何为给定的字符串实现这一点,我们知道整个字符串的长度。但是,如果我们不知道字符串的大小(即它是任意长度的字节流)怎么办。
我正在尝试在 PHP 中实现这一点,因此 PHP 中的任何代码都会有所帮助。
这是我在 PHP 中的 Boyer-Moore Search 的实现:
function BoyerMooreSearch($haystack, $needle) {
$needleLen = strlen($needle);
$haystackLen = strlen($haystack);
$table = computeSkipTable($needle);
for ($i = $needleLen - 1; $i < $haystackLen;) {
$t = $i;
for ($j = $needleLen - 1; $needle[$j] == $haystack[$i]; $j--, $i--) {
if($j == 0) {
return $i;
}
}
$i = $t;
if(array_key_exists($haystack[$i], $table)) {
$i = $i + max($table[$haystack[$i]], 1);
} else {
$i += $needleLen;
}
}
return false;
}
function computeSkipTable($string) {
$len = strlen($string);
$table = [];
for ($i=0; $i < $len; $i++) {
$table[$string[$i]] = $len - $i - 1;
}
return $table;
}
如果我们给它一个像"barfoobazquix" 这样的干草堆字符串和一个像"foo" 这样的针状字符串,它会正常工作,它将按预期返回3。但是,如果输入 haystack 是一个拆分为 4 字节块的流怎么办。第一个块是"barf",它将不返回匹配项,第二个块是"ooba",它也返回不匹配项,依此类推...
在这种情况下,我们永远无法在当前实现的流的任何缓冲块中找到子字符串"foo"。我正在努力调整当前的实现,即使搜索字符串被分成多个块,它也能正常工作。
【问题讨论】:
标签: php algorithm search boyer-moore