所以我在尝试实现一个功能时遇到了这个问题:
假设我有一个随机的、无向的节点图,其中一些节点相互连接。
让我们将沿某条路径彼此可达的每一组节点称为一个集合。
现在,让我们假设图只包含一个这样的集合(即,每个节点都可以从其他节点到达)。
如果我取一个随机节点 A 并将其从集合中删除,我需要快速有效地确定保留哪些集合。如果 A 是集合中的一个切点,则删除它应该将集合拆分为两个或更多个更小的集合。我只需要一种有效的方法来做两件事:
- 从集合中移除 A 并确定剩余集合,以及
- 添加一个新节点 B,其中任意数量的新边将其连接到其他节点。
我需要能够适度快速地执行这两个操作。本质上,我正在寻找 O(log(n)) 或 O(1) 解决方案。O(n) 解决方案是不可接受的,因为该图可能很大。我并不特别关心内存开销。谁能指出我在这里使用哪种数据结构/算法的正确方向?我已经考虑过 Union-Find 和 Djikstra 之类的东西,但它们不适合我的需要。我不想在每次添加或删除节点时对整个图进行完整的连接检查。