Python - 哈希堆实现

3

我有一组流数据,我将它们一个接一个地推入堆(优先队列)中进行维护,最终的堆看起来像:

[(a,1), (b,2), (c, 7), (d, 2), ...]

因为我需要不断更新项目(例如将(a,1)更改为(a,2),或者删除(c,7))以便随时有效地查找和删除堆中的项,因此我希望使用哈希表构建一个存储堆中每个项位置的哈希表。
这样,每次我想要更新一个项目时,我可以使用哈希表轻松地在堆中找到它并进行更改,同时更新哈希表中每个项目的位置。
相同的问题已在此帖子中提出:如何在哈希表上实现O(1)的最小堆删除,C++代码如下:
template<typename state, typename CmpKey, class dataStructure>
bool AStarOpenClosed<state, CmpKey, dataStructure>::HeapifyUp(unsigned int index)
{
        if (index == 0) return false;
        int parent = (index-1)/2;
        CmpKey compare;

        if (compare(elements[theHeap[parent]], elements[theHeap[index]]))
        {
                // Perform normal heap operations
                unsigned int tmp = theHeap[parent];
                theHeap[parent] = theHeap[index];
                theHeap[index] = tmp;
                // Update the element location in the hash table
                elements[theHeap[parent]].openLocation = parent;
                elements[theHeap[index]].openLocation = index;
                HeapifyUp(parent);
                return true;
        }
        return false;
}

我对c++的经验很少,想知道有没有人可以帮我解释这个思路或者提供一个python版本的代码实现?

1个回答

2

据我所知,您的一对中的第一个项目作为键,第二个项目作为数据有效负载。然后,我建议采用另一种方法,有些类似于此答案,但更简单。

  1. 让哈希表成为主要的数据存储结构,让最小堆成为辅助数据结构以维护数据集中当前最小的键。

  2. 插入新项:将数据添加到哈希表和最小堆中。

  3. 更新给定键的值:仅在哈希表中更新值。

  4. 删除具有给定键的项:仅从哈希表中删除具有给定键的条目。

  5. 访问最小键:如果堆顶上的元素未在哈希表中找到,则放弃它;重复这个过程,直到顶部的键存在于哈希表中。


@enaJ 你应该知道得更好。这是最小堆数据结构的主要功能。如果你不需要访问最小键,那么为什么你的问题围绕着最小堆建立呢? - Leon
我的一对中的第一个项目代表一个节点,第二个项目代表连接到该节点的边缘。这个问题的大局是在1分钟的滚动时间窗口内更新具有顶点和节点的图形。 - enaJ
@enaJ,我仍然不清楚你需要最小堆来做什么。 - Leon
因为最终目标是使用堆来找到这个集合的中位数,在排序方面它比哈希表有优势。 - enaJ
让我们在聊天中继续这个讨论。点击此处进入聊天室 - Leon
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接