我有一个图形实现,它使用向量来存储它的节点和边(对象)。
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矢量可以解决问题。但也许有更好的方法?