一个队列可以只用一个hash-table来实现吗?
Can a queue be implemented using only a hash-table?
我的意思是该实现只能独立分配少量 (O(1)/O(log n)) 的内存 - 队列的大部分数据必须在散列内 table。
编辑:这个数据结构应该支持 (Push,Pop,Top,Len) 操作,但在幕后,它将使用散列 table 而不是 linked-list/array。所需的大部分 O(n) 内存将包含在散列中-table.
任何类似列表的数据结构都可以用散列表示table,其中列表中的每个元素都映射到它的位置。所以这个列表:[a, b, c, d]
可以用散列 table 表示,如下所示:
0: a
1: b
2: c
3: d
队列是一种先进先出的数据结构:先进先出。因此,元素的弹出顺序与它们被推送的顺序相同。它可以用类似列表的数据结构建模,我们通过将新元素添加到尾部来将它们推入列表,并通过从头部取出元素来弹出元素。
the implementation can only allocate a small (O(1)/O(log n)) amount of memory independently
独立于散列 table 本身处理的唯一必要数据是 head
和 tail
索引。
因此,使用 [a, b, c, d]
示例,我们的头指向索引 0
(对应于 a
),我们的尾指向索引 3
(对应于d
).
要将新元素推送到队列(例如 e
),我们将其插入我们的散列 table 中,键为 tail + 1
,即 4
,并且我们将 tail
增加 1.
要弹出一个元素,我们在 head
位置获取元素,将其从散列中删除 table 并将 head
递增 1。
在此之后,我们的散列 table 会变成这样:
1: b
2: c
3: d
4: e
有了这个实现,top
和 len
就很容易实现了。
可以扩展这个基本思想来处理更复杂的散列tables。
我遇到了这个问题。谷歌搜索后是否建议这样做。据我所知,队列的目标是具有恒定的检索时间和恒定的移除时间。 0(1)。最好的实现是链表方法或使用 'Unshift' 和 'pop' 方法的数组
我的意思是该实现只能独立分配少量 (O(1)/O(log n)) 的内存 - 队列的大部分数据必须在散列内 table。
编辑:这个数据结构应该支持 (Push,Pop,Top,Len) 操作,但在幕后,它将使用散列 table 而不是 linked-list/array。所需的大部分 O(n) 内存将包含在散列中-table.
任何类似列表的数据结构都可以用散列表示table,其中列表中的每个元素都映射到它的位置。所以这个列表:[a, b, c, d]
可以用散列 table 表示,如下所示:
0: a
1: b
2: c
3: d
队列是一种先进先出的数据结构:先进先出。因此,元素的弹出顺序与它们被推送的顺序相同。它可以用类似列表的数据结构建模,我们通过将新元素添加到尾部来将它们推入列表,并通过从头部取出元素来弹出元素。
the implementation can only allocate a small (O(1)/O(log n)) amount of memory independently
独立于散列 table 本身处理的唯一必要数据是 head
和 tail
索引。
因此,使用 [a, b, c, d]
示例,我们的头指向索引 0
(对应于 a
),我们的尾指向索引 3
(对应于d
).
要将新元素推送到队列(例如 e
),我们将其插入我们的散列 table 中,键为 tail + 1
,即 4
,并且我们将 tail
增加 1.
要弹出一个元素,我们在 head
位置获取元素,将其从散列中删除 table 并将 head
递增 1。
在此之后,我们的散列 table 会变成这样:
1: b
2: c
3: d
4: e
有了这个实现,top
和 len
就很容易实现了。
可以扩展这个基本思想来处理更复杂的散列tables。
我遇到了这个问题。谷歌搜索后是否建议这样做。据我所知,队列的目标是具有恒定的检索时间和恒定的移除时间。 0(1)。最好的实现是链表方法或使用 'Unshift' 和 'pop' 方法的数组