有效频率计算的数据结构决策

时间:2012-04-20 23:34:21

标签: c++ performance algorithm data-structures frequency

问题:在计算文本文件中 n 最常用的单词时,哪种数据结构更有效。 哈希表优先级队列

我之前已经问了一个与此主题相关的问题,但是在创意反应之后我感到困惑,并且我已经确定了 I 实际上很容易实现的两种数据类型; 哈希表优先级队列

优先级队列混淆:老实说,我听过youtube与优先级队列相关的讲座,了解它的每个组件,但是当涉及到它的适用性时,我感到困惑。使用二进制堆我可以轻松实现优先级队列,但我的挑战是将其组件使用与频率问题相匹配。

我的哈希表想法:因为在这里决定哈希表的大小有点不确定,所以我决定选择对我更有意义的事情: 26 。由于字母表中的字母数量。此外,具有良好的散列函数,它将是有效的。然而,在我看来,链接列表(使用单独链接进行共谋)并将其整数值递增1会再次进出,这样效率会不高。

很抱歉这篇长篇文章,但作为其他程序员,你会推荐哪一个。如果优先级队列你可以简单地给我一些想法,将它与我的问题联系起来,如果哈希表可以做些什么来提高它的效率吗?

2 个答案:

答案 0 :(得分:1)

除了更有意义之外,哈希表将是两个选项中提供的更快的选择。如果您对特殊单词总数的估计(而且大多数人的词汇量超出技术专业术语的数量并不比10,000大得多 - 而不是选择大小26,而不是大于20,000 - 20,000非常大,而30,000是制作一个收集单词的爱好),使大小足够大,你不希望永远填充它,所以碰撞的可能性很低 - 不超过25%。如果你想更加保守,可以实现一个函数,将表格的内容重新整理成原始大小的两倍(并使大小成为素数,因此只有原始大小的两倍)。

既然这是标记的C ++,你可能会问自己为什么你不只是直接使用标准模板库中的多重集。它将记录您输入的每个单词的数量。

在任何一种情况下,您都需要单独传递以查找哪个词是最常见的,因为您只有频率,而不是频率的等级顺序。

答案 1 :(得分:0)

为什么不使用通用/通用字符串散列函数?毕竟你不想算第一个字母,你想要算上所有可能的单词。我会保持桶计数动态。如果不是,您将需要进行大量的链表遍历。