我有一个内存双向图实现为邻接列表,如下所示:
class MemGraph
{
struct Node { int id; std::vector<int> from, to; }; //stores ids of adjacent edges
struct Edge { int id, from, fromIndex, to, toIndex; }; //from, to are ids of nodes and the fromIndex and toIndex are locations in those
//Index is open-addressing hash table using Node::id and Edge::id as key
struct Index { int count; std::vector<int> data; };
std::vector<Node> nodes;
Index nodeIndex;
std::vector<Edge> edges;
Index edgeIndex;
};
这允许O(1)
为所有操作(对id和index位置插入,删除,搜索和随机访问)进行转换。插入仅仅附加在相应的列表中。使用“swap with last”技术完成删除(需要一些较小但始终不断更新交换元素)。
有没有办法在保持O(1)
复杂度的同时将这种方法(或修改后的版本)与文件(而不是向量)一起用作后端?
我遇到的问题是相邻边缘的向量。每当我修改它们时,整个节点都需要在最后重新插入文件中。这同样适用于边缘,但这些边缘始终是恒定的,而节点可能很大(因此违反了O(1)
时间复杂度的要求。