我有幾個GB值得的字符串,每個前綴我想找到10個最常見的後綴。有沒有一個有效的算法呢?高效最常用的後綴算法?
一個顯而易見的解決辦法是:
- 商店排序
<string, count>
雙名單。 - 通過二進制搜索範圍標識我們正在搜索的前綴。
- 在這個範圍內找到10個最高的
count
s。 - 可能預先計算所有短前綴,因此它不需要查看大部分數據。
我不確定這是否真的有效。有沒有更好的方式我忽略了?
答案必須是實時的,但它可能需要儘可能多的預處理。
我有幾個GB值得的字符串,每個前綴我想找到10個最常見的後綴。有沒有一個有效的算法呢?高效最常用的後綴算法?
一個顯而易見的解決辦法是:
<string, count>
雙名單。count
s。我不確定這是否真的有效。有沒有更好的方式我忽略了?
答案必須是實時的,但它可能需要儘可能多的預處理。
將單詞放在樹中,例如trie或radix,爲每個完整單詞放置一個「出現次數」計數器,這樣您就知道哪些節點是結尾,以及它們有多普遍。
通過迭代找到前綴/後綴組合。
這兩個操作都是O(n * k)其中k是最長單詞的長度;這是作爲散列表的same complexity。
HAT-trie是一個高速緩存意識的版本,可以保證高性能。
+ 1,但我建議將字符從右到左添加到trie。 – 2010-06-07 07:00:00
@Lieven:一個trie可以用作前綴樹或後綴樹。 – 2010-06-07 07:14:11
@Matthieu:謝謝,看來我誤解了嘗試。 – 2010-06-07 07:54:06
您正在使用的任何特定語言? C++或Java我猜... 此外,你的字符串在數據庫或只是在一個文件? – nico 2010-06-07 06:56:56
這是所有文件和任何語言最快,所以最有可能C. – taw 2010-06-07 12:01:52