【问题标题】:Removing multiple vertices from Boost Graph [duplicate]从Boost Graph中删除多个顶点[重复]
【发布时间】:2015-02-25 22:14:10
【问题描述】:

图中怎么没有同时移除多个顶点的例程呢?如果顶点为vecS,则只有 remove_vertex() 非常昂贵。

在 boost/graph/detail/adjacency_list.hpp remove_vertex_dispatch()starting line # 1966 例程中,它擦除给定节点,然后重新索引边缘。是否可以添加另一个例程,例如,要删除顶点的索引并一次性删除它们(如何?可以讨论)并且重新索引只发生一次?

我知道使用 listS 会使其时间恒定,但并非所有算法都适用于 listS,所以这是不可能的。

【问题讨论】:

    标签: c++ boost graph


    【解决方案1】:

    如果您删除一个顶点,您将无法避免重新索引所有边并更新您的向量。这具有至少与顶点数量呈线性关系的非本地成本,这可能确实很昂贵。

    话虽如此,您可以使用的一种技术是在最初设置为 true 的每个顶点中缓存一个布尔值。现在,要删除一个顶点,您需要删除所有连接到该顶点的边,并将顶点布尔值设置为 false。这样,删除时间只是局部的,并且您没有与顶点数量成线性关系的时间。然后您需要调整一些操作,例如迭代顶点,您只选择那些将布尔值设置为 true 的操作。

    这种技术很常见,例如用于简化 3D 三角剖分(您迭代地删除顶点并且您希望局部成本更快)。与 listS 相比,您仍然可以直接访问您的顶点(顶点句柄在删除顶点后仍然有效)。

    【讨论】:

    • 有见地的回答。你有我的赞成票
    • 对,我已经在使用该技术了。但我的情况是图表可以使用数周,添加和删除大量节点。同样在此期间,它被序列化以保存并重新打开。我只尝试在序列化之前实际删除“已删除”节点。我想知道我是否可以操纵序列化字符串来删除“已删除”节点,因为它们没有入边或出边。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多