如何同步向量及其子集

时间:2016-03-20 23:23:06

标签: c++ algorithm vector graph

我有一个图形实现,它使用向量来存储它的节点和边(对象)。

class Node
{
    int index;
    std::vector<Edge*> from;
    std::vector<Edge*> to;
};

class Edge
{
    int index;
    Node *from;
    int indexFrom;
    Node *to;
    int indexTo;
};

class Graph
{
    std::vector<Node*> nodes;
    std::vector<Edge*> edges;
};

只要图形结构通过交换最后一个技巧发生变化,索引就会更新。基本上在删除时,我将要删除的元素与最后一个(包括索引)交换。这个图结构在所有操作中给出了O(1),代价是向量中元素的顺序不一致(但元素上的一致索引)。

现在我努力实施体面效率很高的子图。第一直觉是使用主图中的向量来仅存储相关元素。

class Subgraph
{
    std::vector<Node*> nodes; //subset of Graph::nodes
    std::vector<Edge*> edges; //subset of Graph::edges
};

然而,突然这样的子图在线性时间或更差的情况下执行,因为当遍历时我需要检查每个边缘是否存在于子图中,当移除时我需要先在子矢量中查找它。

现在我试图弄清楚如何做到这一点,至少得到O(1)进行遍历(或者更确切地说,检查子图中元素的存在),最坏的情况是O(log n)(删除,插入)。

到目前为止,我认为遮蔽原始矢量的bool矢量可以解决问题。但也许有更好的方法?

0 个答案:

没有答案