Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Language agnostic 一种可搜索的堆结构_Language Agnostic_Data Structures_Abstract Data Type - Fatal编程技术网

Language agnostic 一种可搜索的堆结构

Language agnostic 一种可搜索的堆结构,language-agnostic,data-structures,abstract-data-type,Language Agnostic,Data Structures,Abstract Data Type,问题是通过两种不同的方法访问一系列值。第一,按优先次序;这是通过堆实现的。此外,必须能够使用一个或多个符号“标记”每个值,通过这些符号可以访问项目列表 通过在两个不同的结构中引用相同的数据,这将非常容易有效地实现。但是,这些必须形成一个内聚队列。因此,通过一个结构移除的项也必须从另一个结构移除,这是一个堆不太适合的操作 是否有一种数据结构能够按一个值进行有效排序(理想情况下优化为推/弹出),而不会完全降低在任意位置查找/删除节点的性能?如果知道要删除哪个元素,您可以在O(log(n))时间内从二

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

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


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

如果知道要删除哪个元素,您可以在O(log(n))时间内从二进制堆中删除任何元素。任何节点都可以被视为一个有效的“子堆”,您可以使用deletemax(或deletemin)操作,就像在整个过程中一样

唯一的问题是你如何知道删除哪一个?我想我有一个解决办法。对具有堆节点引用的存储类使用包装器,并从包装器析构函数中删除该节点。当您想从集合中删除任何元素时,您只需通过任何索引删除包装器,其余的就由它来处理了。在向集合中插入内容时,需要创建一个包装器对象并将引用传递给其堆节点

这里有一些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();
    }
};
模板类包装器{
T数据;
HeapNode*索引\堆;
Foo*索引标签;
条形*索引_队列;
public:~Wrapper(){
索引_堆->删除_max();
索引标签->删除标签();
索引_队列->删除_栏();
}
};