可搜索的堆结构

时间:2009-09-04 12:31:21

标签: language-agnostic data-structures abstract-data-type

问题是通过两种不同的方法访问一系列值。首先,优先考虑;用堆简单地实现了。此外,必须能够用一个或多个符号“标记”每个值,通过这些符号可以访问项目列表。

通过在两个不同的结构中引用相同的数据,这很容易实现。但是,这些必须形成一个有凝聚力的队列。因此,通过一个结构删除的项目也必须从另一个结构中删除,这是一个堆不太适合的操作。

是否存在能够通过一个值提供有效排序的数据结构(理想情况下针对推/弹出优化),而不会完全降低在任意位置查找/删除节点的性能?

1 个答案:

答案 0 :(得分:4)

如果知道要删除哪一个元素,可以在O(log(n))时删除二进制堆中的任何元素。任何节点都可以被视为有效的“子堆”,您可以像使用整个事件一样使用delete-max(或delete-min)操作。

唯一的问题是你怎么知道删除哪一个?我想我有一个解决方案。对存储类使用包装器,该类具有对其堆节点的引用,并从包装器析构函数中删除该节点。当你想从集合中删除任何元素时,你可以通过任何索引删除包装器,它将负责其余的事情。向集合中插入内容时,需要创建包装器对象并将引用传递给其堆节点。

这是一些C ++代码:

template <class T> class Wrapper {
    T data;
    HeapNode* index_heap;
    Foo* index_tags;
    Bar* index_queue;

    public: ~Wrapper() {
        index_heap->delete_max();
        index_tags->delete_foo();
        index_queue->delete_bar();
    }
};