我的哈希表实现具有这样的功能来调整表时约70%的负载达到。我的哈希表与用于碰撞分离链实现。

是否有意义,我应该调整在任何时候哈希表下还是应该只是离开它喜欢它?否则,如果我增加大小(由近一倍,其实我遵循这个: http://planetmath.org /encyclopedia/GoodHashTablePrimes.html )当负载是70%,我应该调整下来当负载获得30%或低于?

有帮助吗?

解决方案

您写的一般用途的哈希表,或者是有它特定的目的是什么?我建议不要调整为一般实现小。这将让你的表简单,在表格为填充和排空通常条件下保持它的内存抖动。如果你最终运行到哪里的尺寸可以减小哈希表需求的条件下,在该时间点进行扩展。

其他提示

哈希表不必有黄金数的长度,如果你有一个良好的质量散列函数(见的这里)。可以使两个,其基本上加速指数计算他们的权力。

这是为什么相关的问题?因为当你收缩幂的两个哈希表,则可以将所有条目在下半区其中它们与简单地追加在插槽i链表(从上半部)上在时隙i - n/2链表

如果存储器是便宜的,不要管它。如果内存是昂贵的,调整与滞后为你建议。完成后,配置文件中的结果,以确保它运行良好,并没有做一些愚蠢的。

第一个想法:为不断增长的一个哈希表的唯一原因是因为如果有太多的冲突哈希表的性能下降。当它的负载超过70%的速度增长的表是一个很好的经验规则,以防止这种情况发生,但它只是一个经验法则。更好的是保持碰撞次数的轨道且仅当超过一定限度成长哈希表或者一旦某个冲突率被击中。毕竟,你为什么要增长由90%加载的哈希表,但还没有一个单一的碰撞?那就没有优势。

二想法:收缩一个哈希表的唯一原因是为了节省存储器,但它萎缩可能增加的碰撞次数,从而减少查找性能。这是一个经典的速度VS内存权衡,你为什么要自己解决呢?谁正在使用你的代码交给。只是从来没有收缩在自己的,但提供了一个收缩的方法。如果低内存占用率的要求,谁正在使用你的代码可以调用定期收缩。如果最大性能,如果需要,谁正在使用你的代码不应该调用萎缩。其他人都可以使用某种启发,决定是否以及何时调用收缩。

第三想法:当生长或萎缩,总是生长/收缩以这样的方式使操作后的一定负载因数得以保证。例如。生长时,总会长大,这样以后的客座率为50%,收缩时,总是以这样的方式收缩这事后客座率为70%。当然,没有提到冲突的数量,所以越来越多后,立即添加元素/萎缩可能会导致哈希表恢复增长,但是这是不可避免的作为模拟的种植效果/收缩通常是太昂贵了。也收缩一旦没有进一步的修改都将刨经常被调用,因此它应该而节省存储器不必在未来再次增长避免。

最后的想法:对于每一个你做出决定,你会做的更好的哈希表对于一些使用情况更糟糕了其他的。如果你知道你的哈希表将如何被使用,这不会是一个问题。然而,如果你不这样做,通常你不这样做,为什么让自己这些决策?只是委托他们。让你的代码的用户自定义所有的小细节,例如多少要么允许正在创建您的哈希表时,所有这些因素进行设置,或允许您的哈希表有委托函数(回调函数,你总是可以问什么时候不清楚该怎么做),以扩大或缩小。这样,你的代码的每个用户甚至可以在运行时无论何种应用场景,他们需要对其进行自定义您的代码。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top