2013-06-05 91 views
3

我有一個文件「文字」大小約5.8 MB,並有560,000字的文字。我用它來從連接在一起的字符串中獲取真正的單詞。如何快速搜索字符串內巨大數組的值?

E.g. greenbananatruck可能是這樣的字符串。

我寫這個函數的速度非常快。但我不能讓它更快,然後0.5秒。我正在使用8核心處理器,8GB內存的服務器。其實cpu不是問題,問題是內存。我需要能夠在多個實例中快速高效地完成此過程。

public function wordSplitReal($str){

$words = array_filter($this->dict, function($word) use(&$str) { 
     $pos = strpos($str, $word); 
     if ($pos !== false){ 
      $str = substr_replace($str, "", $pos, strlen($word)); 
      return true; 
     } 
     return false; 
    }); 

    return $words; 

}

這很簡單,就是我其實做的是「過濾」數組「字典」僅是給定字符串中的單詞。 (我對多個單詞不感興趣。) 字典是從最長的單詞預先排序的。所有隻有低字母。 這個函數是使用單例的更大類的一部分。

任何幫助,將不勝感激。

+0

不會有數據庫更適合這個嗎? –

+0

不,我用資源測試了同樣的東西,花了大約3倍的時間。 –

回答

1

數組是工作的錯誤工具,因爲他們在線性時間訪問(正如你發現的,對於字典來說太慢了)。你可能想要一個trie;如果您搜索它們,有幾個PHP實現。 (我沒有與任何PHP線索庫中的任何經驗,所以我不推薦你一個。)

算法的輪廓可能是:

While string is non-empty 
    For all prefixes of str in decreasing order: 
    If it is in trie: 
     Drop the prefix 
     Add it to the result array 
     Next iteration of outer loop 
    Return failure 
Return result array 

(該算法是不是很複雜的,因爲它不執行回溯;留作練習讀者:p)