【问题标题】:Can a queue be implemented using only a hash-table?可以仅使用哈希表来实现队列吗?
【发布时间】:2018-12-04 10:06:25
【问题描述】:

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

编辑:这个数据结构应该支持 (Push,Pop,Top,Len) 操作,但在幕后,它不是链表/数组,而是使用哈希表。所需的大部分 O(n) 内存将包含在哈希表中。

【问题讨论】:

    标签: data-structures queue hashtable


    【解决方案1】:

    任何类似列表的数据结构都可以用哈希表表示,其中列表中的每个元素都映射到它的位置。所以这个列表:[a, b, c, d] 可以用这样的哈希表来表示:

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

    队列是一种先进先出的数据结构:先进先出。所以元素的弹出顺序与它们被推送的顺序相同。它可以用类似列表的数据结构建模,我们通过将新元素添加到尾部来将新元素推送到列表中,并通过从头部取出元素来弹出元素。

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

    独立于哈希表本身处理的唯一必要数据是headtail 索引。

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

    为了将一个新元素推送到队列中(例如e),我们将其插入到带有键tail + 1 的哈希表中,即4,并将tail 增加1。

    要弹出一个元素,我们获取位于head 位置的元素,将其从哈希表中删除,并将head 加1。

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

    1: b
    2: c
    3: d
    4: e
    

    有了这个实现,toplen 实现起来很简单。

    这个基本思想可以扩展到处理更复杂的哈希表。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-10-30
        • 2020-12-30
        • 1970-01-01
        • 2016-03-25
        • 2011-10-14
        • 2011-09-15
        相关资源
        最近更新 更多