要添加/查找/保持字符串数量的数据结构?

时间:2009-10-18 23:02:57

标签: data-structures hashtable trie

我正在试图找出哪种数据结构能够快速支持以下操作:

  • 添加一个字符串(如果它不在那里,添加它,如果它在那里,增加该单词的计数器)
  • 计算给定的字符串(按字符串查找然后读取计数器)

我在哈希表或者trie之间进行辩论。根据我的理解,只要您避免碰撞,哈希表就可以快速查找并添加。如果我不提前知道我的输入会有更好的方法吗?

3 个答案:

答案 0 :(得分:2)

这实际上取决于您将要用作“键”的字符串类型。如果你使用高度可变的字符串,加上你的字符串没有很好的哈希算法,那么trie可以胜过哈希。

然而,考虑到良好的哈希,查找将比在trie中更快。 (给出一个非常糟糕的哈希,但事实恰恰相反。)如果你不知道你的输入,但确实有一个像样的哈希算法,我个人更喜欢使用哈希。

此外,大多数现代语言/框架都有非常好的散列算法,所以很有可能,您将能够使用非常少工作的散列实现良好的查找,这将很好地执行。

答案 1 :(得分:1)

特里不会给你买太多东西;当前缀很重要时,它们才有趣。散列表更简单,通常是语言标准库的一部分,如果不是语言本身的直接部分(Ruby,Python等)。这是在Ruby中执行此操作的简单方法:

strings = %w(some words that may be repeated repeated)
counts = Hash.new(0)
strings.each { |s| counts[s] += 1 }
#counts => {"words"=>1, "be"=>1, "repeated"=>2, "may"=>1, "that"=>1, "some"=>1}

<强>附加物: 对于C ++,您可以使用Boost's hash implementation

答案 2 :(得分:0)

任何一个都相当快。

没有必要完全避免碰撞。

通过更接近地观察性能,通常,哈希表比树更快,但我怀疑现实生活程序是否因为使用树而不是HT而运行得太慢,而且有些树比某些树更快哈希表。

我们还能说什么,哈希表比树更常见。

复杂树的一个优点是它们具有可预测的访问时间。使用哈希表和简单的二叉树,您看到的性能取决于数据,HT性能在很大程度上取决于实现的质量及其相对于数据集大小的配置。