Data structures 使用linkedlist的队列与使用哈希表存储桶数组的队列的优点?

Data structures 使用linkedlist的队列与使用哈希表存储桶数组的队列的优点?,data-structures,linked-list,hashmap,queue,Data Structures,Linked List,Hashmap,Queue,我知道两种实现队列的方法,使用链表或数组。在哈希表中生成bucket时应该使用哪一个,当bucket超过条目限制时,哈希表需要重新刷新。我是否可以使用其他数据结构获取O(1)排队和解排队以及索引 使用数组,我可以让bucket大小变为更高的值,因为数组中的索引允许我对键(按排序顺序插入)使用二进制搜索。如果桶大小变为1000,则搜索成为LN(1000)vs 1000。插入操作变为O(n),但查找比插入更常见 使用链表我得到O(1)插入,删除,但我也得到O(n) 我的问题是,我可以同时使用其他数据

我知道两种实现队列的方法,使用链表或数组。在哈希表中生成bucket时应该使用哪一个,当bucket超过条目限制时,哈希表需要重新刷新。我是否可以使用其他数据结构获取O(1)排队和解排队以及索引

使用数组,我可以让bucket大小变为更高的值,因为数组中的索引允许我对键(按排序顺序插入)使用二进制搜索。如果桶大小变为1000,则搜索成为LN(1000)vs 1000。插入操作变为O(n),但查找比插入更常见

使用链表我得到O(1)插入,删除,但我也得到O(n)


我的问题是,我可以同时使用其他数据结构的好处吗?或者使用这些数据结构的好处明显大于使用其他数据结构的好处吗?

在实现哈希表的存储桶时,应该使用链表,因为它们可以调整大小。在散列映射中,您需要在bucket中执行的唯一操作是遍历和附加新项,这两项都可以在每个元素
O(1)
中完成。使用数组时,分配的内存不必要或太少,因为无法调整其大小。此外,您不应该使用队列,最好只使用普通的链表。

当您实现哈希表的存储桶时,您应该使用链表,因为它们可以调整大小。在散列映射中,您需要在bucket中执行的唯一操作是遍历和附加新项,这两项都可以在每个元素
O(1)
中完成。使用数组时,分配的内存不必要或太少,因为无法调整其大小。此外,你不应该使用队列,最好只使用普通的链表。

我认为你问错了问题。与其担心如何处理一个桶中的大量物品,不如关心为什么你的桶已经满了

哈希表假设了两件事:

  • 您已经选择了一个散列函数,它可以在bucket之间提供良好的项目分布
  • 您不会让负载系数变得太高。一个好的哈希表实现将提供相当不错的性能,负载系数高达0.8左右,但超过该值,性能将急剧下降。我认为大多数实现喜欢将负载因子保持在0.7以下。因此,如果哈希表中的项目数超过表容量的70%,则应考虑增加容量。当负载系数超过某个阈值时,大多数哈希表实现会自动增加容量
  • 当您选择使用哈希表时,您有责任确保这两个条件都成立。如果您选择了一个糟糕的散列函数,或者如果您超过了设计的负载系数,那么性能将受到影响,再多的优化bucket结构也帮不了您

    bucket列表结构的实现应该无关紧要,因为bucket的大小不应该足以改变性能。一个简单的链表提供了O(1)插入和O(k)查找(其中k是bucket中的项数)。但是k不应该大于2或3,所以使用渐近更有效的数据结构是没有意义的


    无论您如何实现存储桶,当您超过哈希表的容量(或者如果您的哈希表实现自动调整大小,则为负载因子阈值)时,您都会不时付出O(n)调整大小的代价。

    我认为您问错了问题。与其担心如何处理一个桶中的大量物品,不如关心为什么你的桶已经满了

    哈希表假设了两件事:

  • 您已经选择了一个散列函数,它可以在bucket之间提供良好的项目分布
  • 您不会让负载系数变得太高。一个好的哈希表实现将提供相当不错的性能,负载系数高达0.8左右,但超过该值,性能将急剧下降。我认为大多数实现喜欢将负载因子保持在0.7以下。因此,如果哈希表中的项目数超过表容量的70%,则应考虑增加容量。当负载系数超过某个阈值时,大多数哈希表实现会自动增加容量
  • 当您选择使用哈希表时,您有责任确保这两个条件都成立。如果您选择了一个糟糕的散列函数,或者如果您超过了设计的负载系数,那么性能将受到影响,再多的优化bucket结构也帮不了您

    bucket列表结构的实现应该无关紧要,因为bucket的大小不应该足以改变性能。一个简单的链表提供了O(1)插入和O(k)查找(其中k是bucket中的项数)。但是k不应该大于2或3,所以使用渐近更有效的数据结构是没有意义的


    无论您如何实现存储桶,当您超过哈希表的容量(或者如果您的哈希表实现自动调整大小,则为负载因子阈值)时,您都会不时地付出O(n)调整大小的代价。

    我试图理解您为什么要为哈希表存储桶使用队列。你为什么不直接使用动态列表?@JimMischel你的权利,让我解释一下,编辑这个问题。我试图理解你为什么要使用队列作为哈希表存储桶。你为什么不直接使用动态列表呢?@JimMischel你说得对,让我解释一下,编辑这个问题。因此,如果桶太大或者大约70%的桶都满了,我应该重新刷新这个表?我不应该在桶中使用另一个哈希表。@AchyutRastogi:我从未见过实现