2010-06-07 88 views
3

我有几个GB值得的字符串,每个前缀我想找到10个最常见的后缀。有没有一个有效的算法呢?高效最常用的后缀算法?

一个显而易见的解决办法是:

  • 商店排序<string, count>双名单。
  • 通过二进制搜索范围标识我们正在搜索的前缀。
  • 在这个范围内找到10个最高的count s。
  • 可能预先计算所有短前缀,因此它不需要查看大部分数据。

我不确定这是否真的有效。有没有更好的方式我忽略了?

答案必须是实时的,但它可能需要尽可能多的预处理。

+0

您正在使用的任何特定语言? C++或Java我猜... 此外,你的字符串在数据库或只是在一个文件? – nico 2010-06-07 06:56:56

+0

这是所有文件和任何语言最快,所以最有可能C. – taw 2010-06-07 12:01:52

回答

6

将单词放在树中,例如trieradix,为每个完整单词放置一个“出现次数”计数器,这样您就知道哪些节点是结尾,以及它们有多普遍。

通过迭代找到前缀/后缀组合。

这两个操作都是O(n * k)其中k是最长单词的长度;这是作为散列表的same complexity

HAT-trie是一个高速缓存意识的版本,可以保证高性能。

+0

+ 1,但我建议将字符从右到左添加到trie。 – 2010-06-07 07:00:00

+0

@Lieven:一个trie可以用作前缀树或后缀树。 – 2010-06-07 07:14:11

+0

@Matthieu:谢谢,看来我误解了尝试。 – 2010-06-07 07:54:06