BMH子串查詢演算法(PHP實現)
程式碼
interface StringSearchable
{
public function search($substring, $buffer);
}
class BoyerMooreStringSearch implements StringSearchable
{
public $substring = null;
public $buffer = “;
public $jumpTable = array();
protected $results = array();
public function __construct()
{
}
public function __destruct()
{
}
public function search($substring, $buffer)
{
$this->results = array();
$this->substring = $substring;
$this->buffer = $buffer;
$this->deriveJumpTable();
$substringLen = strlen($this->substring);
$currentCharIndex = $substringLen – 1;
$bufferLen = strlen($this->buffer);
while ($currentCharIndex < $bufferLen) {
for ($i = $substringLen – 1; $i >= 0; $i–) {
if ($this->buffer[$currentCharIndex – $substringLen + $i + 1] == $this->substring[$i]) {
if ($i == 0) {
$this->results[] = $currentCharIndex – $substringLen;
$currentCharIndex += $this->getJumpLength($this->buffer[$currentCharIndex]);
} else {
continue;
}
} else {
$currentCharIndex += $this->getJumpLength($this->buffer[$currentCharIndex]);
break;
}
}
}
return (sizeof($this->results) > 0);
}
protected function deriveJumpTable()
{
$maxJump = strlen($this->substring);
for ($i = strlen($this->substring) – 2; $i >= 0; $i–) {
if (!array_key_exists($this->substring[$i], $this->jumpTable)) {
$this->jumpTable[$this->substring[$i]]] = $maxJump – $i -1;
}
}
}
public function getJumpTable()
{
return $this->jumpTable;
}
public function getResults()
{
return $this->results;
}
public function getResultsCount()
{
return sizeof($this->results);
}
public function getJumpLength($charIndex)
{
if (array_key_exists($charIndex, $this->jumpTable)) {
return $this->jumpTable[$charIndex];
} else {
return strlen($this->substring);
}
}
}
function Main()
{
$poem = <<<POEM
you son of bitch
god damn it
hey,god love me
POEM;
$bm = new BoyerMooreStringSearch();
$bm->search(`god`, $poem);
$count = $bm->getResultsCount;
echo $count;
}
複製程式碼
本文轉自Phinecos(洞庭散人)部落格園部落格,原文連結:http://www.cnblogs.com/phinecos/archive/2010/04/21/1717668.html,如需轉載請自行聯絡原作者
相關文章
- 子串查詢
- Python小技巧 - 子串查詢Python
- PHP 實現二分查詢PHP
- 子字串查詢演算法字串演算法
- Laravel Query Builder 複雜查詢案例:子查詢實現分割槽查詢 partition byLaravelUI
- 二分查詢【折半查詢】演算法 PHP 版演算法PHP
- php查詢演算法的理解PHP演算法
- 面試常問的幾個排序和查詢演算法,PHP 實現面試排序演算法PHP
- 實驗七: 查詢演算法的實現演算法
- JavaScript實現常見查詢演算法JavaScript演算法
- Java實現二分查詢演算法Java演算法
- 複雜查詢—子查詢
- 分塊查詢【大規模資料查詢演算法優化】【索引順序查詢】演算法 PHP 版演算法優化索引PHP
- 演算法練習:求字串的最長重複子串(Java實現)演算法字串Java
- SQL查詢的:子查詢和多表查詢SQL
- 76.最小覆蓋子串 Golang實現Golang
- MySQL實現樹狀所有子節點查詢的方法MySql
- MySQL子查詢MySql
- MYsql 子查詢MySql
- 查詢演算法__Fibonacci查詢演算法
- mysql-分組查詢-子查詢-連線查詢-組合查詢MySql
- SSH:hiberate實現資料的查詢(單查詢和全查詢)
- 查詢演算法__插值查詢演算法
- 區分關聯子查詢和非關聯子查詢
- MySQL之連線查詢和子查詢MySql
- PHP 程式池與輪詢排程演算法實現多工PHP演算法
- 二叉查詢樹【二叉排序樹】構建和查詢演算法 PHP 版排序演算法PHP
- 最長公共子串 二維陣列 Go實現陣列Go
- Javaweb-子查詢JavaWeb
- 巢狀子查詢巢狀
- GORM subquery 子查詢GoORM
- php演算法實現(一)PHP演算法
- 演算法-兩最長迴文子串演算法
- MYSQL學習筆記25: 多表查詢(子查詢)[標量子查詢,列子查詢]MySql筆記
- 查詢演算法__二分查詢演算法
- C++,Java,Python,Javascript實現二分查詢演算法C++PythonJavaScript演算法
- python實現查詢糾錯Python
- mysql多表查詢如何實現MySql
- indexdb實現分頁查詢Index