扫描文件以查找HashTable大小的确切大小与不断调整Array和ReHashing以及其他问题的大小

时间:2014-04-02 05:32:09

标签: arrays hashtable

所以我正在做一个项目,这需要我找到给定文件中的所有字谜。每个文件在每一行都有单词。

到目前为止我做了什么:

1。)对单词进行排序(使用Mergesort - (我认为在最坏的情况下这是最好的......对吧?)) 2.)使用散列函数放入散列表 3.)如果碰撞移动到阵列中的下一个可用空间(基本上一个接一个地向下移动,直到你看到哈希表中的空白点)(有更好的方法吗?我在线性做什么探测)。

问题:

当哈希表中的空间不足时...我该怎么办?我想出了两个解决方案,要么在将任何内容输入到哈希表之前扫描文件,要么具有一个确切的大小,要么继续调整数组的大小并重新运行,因为它会变得越来越多。我不知道选哪一个。任何提示都会有所帮助。

1 个答案:

答案 0 :(得分:0)

一些建议:

  • 排序通常是一个好主意,我可以想到一种在这里使用它的方法,但如果你以后做的所有事情都被放入哈希表中,那么排序项目没有任何好处。 Hashtables设计用于恒定时间插入,即使插入项目的顺序没有特定顺序。
  • Mergesort是具有O(nlog n)最坏情况复杂度的几种排序算法之一,如果您只能比较两个元素以查看哪个较小,则这是最佳选择。如果你可以做其他的操作,比如索引一个数组,可以用radixsort完成O(n)排序 - 但它几乎肯定不值得花时间去研究它(特别是因为你甚至可能不需要排序全部)。
  • 如果您在散列表中填充了一个常量因子(例如,将大小加倍或增加三倍),那么您将保持恒定时间插入。 (如果按照常量调整大小,则插入将降低到每次插入的线性时间,或者在所有n次插入时降低二次时间。)这可能看起来浪费内存,但如果调整大小因子为k,那么浪费空间的比例永远不会超过(k-1)/ k(例如加倍时为50%)。因此,事先计算确切的大小并没有任何渐近的执行时间优势,尽管这可能是一些更快(或更慢)的常数因素。
  • 有多种方法可以处理散列冲突,以不同的方式将执行时间与最大可用密度进行权衡。