我知道使用链表或使用数组实现队列的两种方法。我应该使用哪一个在哈希表中制作存储桶,当存储桶超出条目限制时,需要重新哈希表。我是否有可能使用其他数据结构获得O(1)队列和去队列以及索引?
使用数组我可以让桶大小变为更高的值,导致数组中的索引让我在键上使用二进制搜索(按排序顺序插入)。考虑桶大小变为1000时的好处,搜索变为ln(1000)对1000.插入操作变为O(n)但是,查找比插入更常见。
使用链表我得到O(1)插入,删除但我得到O(n)。
我的问题是,我是否可以从使用其他数据结构中获益,或者使用这些数据结构的好处明显多于其他数据结构?
答案 0 :(得分:1)
当您为哈希表实现存储桶时,您应该使用链接列表,因为它们可以调整大小。您需要在哈希映射中的存储桶中执行的唯一操作是遍历和追加新项目,这两项都可以在O(1)
每个元素中完成。使用数组时,不必要地或者太少地分配内存,因为您无法调整它的大小。此外,你不应该使用队列,你最好只使用普通的链表。
答案 1 :(得分:1)
我认为你问的是错误的问题。你不应该担心如何处理桶中的大量物品,而应该关注你的桶变得过满的原因。
哈希表假设有两件事:
当您选择使用哈希表时,您负责确保两个条件都成立。如果您选择了较差的散列函数或超出设计的载荷因子,性能将受到影响,并且优化桶结构的任何数量都不会对您有所帮助。
您的存储桶列表结构的实现应该无关紧要,因为您的存储桶不应该大到足以产生性能差异。简单的链接列表为您提供O(1)插入和O(k)查找(其中k是存储桶中的项目数)。但是k不应该超过2或3,因此使用渐近更有效的数据结构是没有意义的。
无论您如何实现存储桶,当您超出哈希表的容量时,您将不时支付O(n)调整大小的代价(如果哈希表实现自动执行,则会加载负载因子阈值)调整大小)。