问题的描述如下。
程序将按行读取文件以构建图形。文件中的每一行都是以下三种操作之一:
add x y
,这意味着在节点x和y之间添加边,以便形成图形。此图是无向图。remove x y
,这意味着删除节点x和y之间的边,如果它无效(图中似乎不存在x或y,或者x和y之间不存在边),则不执行任何操作。 / LI>
is linked x y
,如果x和y可以通过图中的所有边连接,则应该返回。此操作的时间复杂度应该是恒定的时间。以下是一个例子:
add 1 2
add 2 3
is linked 1 3(should be true ,cause there is a path 1-> 2, 2->3)
add 3 4
remove 2 3
is linked 1 4(should be false)
答案 0 :(得分:1)
您可以使用union-find数据结构在接近线性的amortized时间内执行此操作。对于其结构和实现细节,您可以通过路径压缩等级联合google 。您可以通过图画教程和精确的时间/空间复杂性分析找到许多关于此的学术说明。这个link和one可以提供帮助。
但这里有两个注释:
其复杂性是摊销的。如果您想将其与最坏情况分析进行比较,请参阅here。
接近线性是什么意思?该算法的摊销分析等于α(n)所指出的逆Ackermann函数。
其中α(n){\ displaystyle \ alpha(n)} \ alpha(n)是逆Ackermann函数。该函数的值α(n)<1。 5 {\ displaystyle \ alpha(n)&lt; 5} {\ displaystyle \ alpha(n)&lt; 5}表示可以在此物理世界中写入的任何n值,因此不相交集操作基本上是恒定的时间