【问题标题】:best data structure to fit constant deletion in graph适合图形中不断删除的最佳数据结构
【发布时间】:2016-08-15 17:17:44
【问题描述】:

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

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) ),然后删除另一个顶点的邻接向量中的相应边(由于这不是我正在编写的算法的主要问题,而且算法必须在线性时间内运行,我认为必须有一种方法可以使这些操作保持不变)。

【问题讨论】:

    标签: c++ data-structures graph


    【解决方案1】:

    使用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)

    【讨论】:

    • 是否有可能在 O(1) 中获得一些特殊元素?例如,第一个元素或最后一个元素。因为我需要不断获取一些元素来遍历图表
    猜你喜欢
    • 1970-01-01
    • 2011-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多