c++ - 适合图中不断删除的最佳数据结构

标签 c++ data-structures graph

我正在用 C++ 构建一个图作为整数 vector 的 vector

vector<vector<int> > graph;

我的问题是:

  • 图表是双向的,这意味着

    if G[u] contains v, G[v] contains u
    
  • 我需要能够

    remove any element v from G[u]
    remove u from G[v]
    

    在恒定时间内。

这个删除是一个我会重复很多次的操作,所以单个映射不起作用,因为当我删除一个元素时,其他元素会返回一个索引。

我想删除一条边(例如,G[u] 的最后一个索引,因此我可以使用 pop_back 并获取 O(1) ),然后删除另一个顶点的邻接 vector 中的相应边(由于这不是我正在编写的算法的主要问题,并且该算法必须在线性时间内运行,因此我认为必须有一种方法使该操作保持不变)。

最佳答案

使用unordered_set ,基于哈希的集合,用于内部数据结构。

也就是说,而不是

vector<vector<int> > graph;

使用

vector<unordered_set<int>> graph;

查找从 uv 是否存在边:

graph[u].find(v) != graph[u].end();

如果存在这样的边缘,则将其删除:

graph[u].erase(v);

所有这些操作预计O(1)

关于c++ - 适合图中不断删除的最佳数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38959766/

相关文章:

algorithm - 我如何最低限度地表示检查树的检查状态?

javascript - 比较两个数组并找出差异

c++ - 如何将邻接矩阵转换为关联矩阵,反之亦然?

c++ - 从存储在集合中的数字计算 vector 中的 int?

c++ - 改变数组元素的值

c++ - OpenGL 计算着色器调用

docker - Gremlin:服务器上未配置别名 [g] 的遍历源 [g]

c++ - STL 映射 - 插入或更新

node.js - 在多个集合中搜索 mongoose

algorithm - 维护拓扑排序中的序列