您是否可以通过保持链接列表的顺序来改进单独的链式哈希?
它如何影响阵列上的操作,时间复杂度(主要是插入,删除和搜索)?
起初我认为这可能是微不足道的,但我想的越多,我就无法弄清楚你为什么不对它进行排序? 当然,插入和删除节点的少数操作比每次尝试查找某个值都必须遍历整个列表要少得多吗?
我不是在寻找任何代码解决方案,只是对概念背后的理解。出于某种原因,我找不到任何讨论这个问题的消息来源。
答案 0 :(得分:1)
起初我认为这可能是微不足道的,但我想的越多 我无法弄清楚你为什么不对它进行分类?
我可以想到为什么散列表链的元素没有排序的原因:
哈希表中的键并不总是原始数据类型,如整数,浮点数,双精度或字符串。它可以是任何东西 - 任何复杂的对象/类实例都不容易比较以进行排序。因此,在这种情况下,每次您必须实现比较对象的关键策略(在C ++中实现<
,=
运算符,在Java等中实现Comparable<T>
)。
另一个原因是哈希表中的链基本上是双重链表。因此,例如,如果要搜索链中的元素,则无法利用二进制搜索在对数时间内进行搜索,因为在链表类型结构(查找中间)上应用二进制搜索并不是直截了当的。
如果明智地选择哈希表的load factor,则哈希表的桶/链不会太密集或太稀疏。在这种情况下,每个链都将具有合理数量的条目,并且在链上运行线性搜索并且确保分摊的恒定时间复杂度将是可接受的快速。
如果假设密钥是整数,那么对链进行排序仍然是有益的。对于哈希表的两个主要操作 - 插入和搜索,你仍然不能利用二进制搜索或对数时序,因为链不是数组或向量,它是双链表。链表上的二进制搜索不是对数的(链表中的查找中间不是像数组一样的O(1))。