可以仅使用哈希表实现队列吗?

时间:2018-12-04 10:06:26

标签: data-structures queue hashtable

我的意思是,该实现只能单独分配少量(O(1)/ O(log n))的内存-大部分队列数据必须在哈希表中。

编辑:此数据结构应支持(Push,Pop,Top,Len)操作,但实际上,它不是哈希表,而是链接表/数组。所需的大多数O(n)内存将包含在哈希表中。

2 个答案:

答案 0 :(得分:1)

任何类似于列表的数据结构都可以由哈希表表示,其中列表中的每个元素都映射到其位置。因此,此列表:[a, b, c, d]可以用如下哈希表表示:

0: a
1: b
2: c
3: d

队列是FIFO数据结构:先进先出。因此,元素以与推送相同的顺序弹出。可以使用类似列表的数据结构进行建模,在该数据结构中,我们将新元素添加到列表的尾部,从而将其推送到列表中,然后从头开始提取元素,从而弹出该列表。

  

该实现只能单独分配少量(O(1)/ O(log n))内存

与哈希表本身无关的唯一必要数据是headtail索引。

因此,使用[a, b, c, d]示例,我们的头指向索引0(对应于a),而尾部指向索引3(对应于{{ 1}})。

要将新元素(例如d推入队列,我们​​将其插入键为e(即tail + 1)的哈希表中,并递增{{1 }}通过1。

要弹出元素,我们将元素放在4位置,将其从哈希表中删除,然后将tail递增1。

之后,我们的哈希表如下所示:

head

使用此实现,head1: b 2: c 3: d 4: e 的实现很简单。

此基本思想可以扩展为处理更复杂的哈希表。

答案 1 :(得分:0)

我遇到了这个问题。谷歌搜索后,如果这样做是可取的。据我所知,队列的目标是具有恒定的检索时间和恒定的移除时间。 0(1)。最好的实现是使用“Unshift”和“pop”方法的链表方法或数组