链接在哈希表
回答
是的,当然。通常引用的散列表的O(1)假设完美的散列 - 其中没有两个不相同的条目解析为相同的散列。
在实践中,这将不会是这样。你会一直有(为了一个足够大的数据集)碰撞。无论您是使用链接还是其他碰撞解决方法,碰撞都意味着查找时会有更多工作。
这就是为什么要选择具有良好的设计/写一个好的哈希函数这是非常非常重要的,有良好的匹配数据,你会使用为您的哈希表的关键。在实践中,不同类型的数据会使用不同的散列函数更好地散列。
这不是他问的问题。他特意询问一旦他已经发生碰撞后应该怎么做 - 如果他索引或排列该列表,如果他有这种复杂性问题,会是什么? – 2012-04-25 17:50:04
可以想像,你选择你的哈希算法和地图的大小,以减轻碰撞,你会在第一时间得到的数字。此时,您应该在任何位置都有一个非常小的列表(理想情况下是一个或两个元素),因此在链中维护排序结构的额外工作肯定不仅仅是迭代该存储桶中的少量项目。
从理论上讲:是的,因为在一般情况下,你只需要步行半链找到,如果一个项目在连锁与否。
在实践中,有可能是没有太大的区别,因为链通常很短,而增加了代码的复杂性也将花费一定的周期,主要表现在“插入”情况。
顺便说一句:在大多数情况下的时隙数大于所述散列值的“密钥空间”小得多。如果您能够承担该空间,则将散列值存储在链节点中将节省重新计算每一跳上的散列值,并且将避免大部分最终比较。这当然是一个空间< - >时间折衷。如:
struct hashnode **this;
for (this=& table[slot] ; *this; this = &(*this)->link) {
if ((*this)->hash != the_hash) continue;
if (compare ((*this)->payload , the_value)) continue;
break;
}
/* at this point "this" points to the pointer that points to the wanted element,
or to the NULL-pointer where it should be inserted.
For the sorted-list example, you should instead break out of the loop
if the compare function returns > 0, and handle that special case here.
*/
- 1. 哈希表链接
- 2. 链式哈希表链接列表
- 3. F#中的哈希链接和.net中的弱哈希表
- 4. 单独链接的哈希表
- 5. 如何用链接实现哈希表?
- 6. Beautifulsoup和哈希链接#
- 7. 哈希表 - 链表 - 分段错误
- 8. 如何反向链接哈希映射?
- 9. 从网址抓取哈希链接
- 10. IE火狐VS链接(哈希VS HTM5)
- 11. Ember中的哈希链接href位置
- 12. 向custon js accordion添加哈希链接
- 13. 哈希表vs哈希列表与哈希树?
- 14. 哈希表在Java
- 15. 哈希表中的链接列表(含结构体)
- 16. 从哈希表中获取链接列表C
- 17. 使用链接列表数组实现哈希表
- 18. 使用哈希表和链接列表的C++访问冲突
- 19. 哈希表直接接入运营商[]
- 20. 链式哈希表:插入功能
- 21. 银链条哈希链接重写把不需要的斜杠在链接
- 22. 哈希表中的搜索哈希
- 23. 哈希打印表哈希perl
- 24. 理解哈希表与链接的实现的问题
- 25. 单独的链接哈希表 - 何时停止查找
- 26. 我们可以把哈希表放在哈希表里面吗?
- 27. 如何在powershell中的哈希表中添加哈希表?
- 28. 形式的哈希表 - 在Java中的<key,哈希表>
- 29. 将Twitter哈希标签变成链接并链接到可点击的链接
- 30. 在Python创建哈希表
你的意思是像地图一样<键,列表>吧? –
ControlAltDel
2012-04-25 17:40:26
@ user1291492我认为他的意思更像这样:http://en.wikipedia.org/wiki/Hash_table#Separate_chaining – pstrjds 2012-04-25 17:42:05