是的, Michael J. Fischer 在 1972 年给出了一个匹配的下限(见第 3 节)。他的示例使用深度为 log n 的二叉树,其中深度为 0 的二叉树是单个节点,深度为 k 的二叉树是深度为 k - 1 的两棵二叉树,其中一个的根指向另一个的根. 通过重复将二叉树的根联合指向一个单例并在最深的节点上进行查找,我们执行了一个昂贵的(对数步骤)操作,留下另一个嵌入的二叉树可供利用。
Python 演示:这将打印(k+1) * 2**k
wherek
的参数,表示对键example
的操作的近似操作计数。O(2**k)
O(2**k)
p = {}
def find(a):
global count
b = a
while (b in p):
count += 1
b = p[b]
while (a in p):
pa = p[a]
p[a] = b
a = pa
return b
def union(a, b):
p[find(a)] = find(b)
def deepest():
maxd = (0, None)
for (a, pa) in p.items():
d = 1
while (pa in p):
d += 1
pa = p[pa]
maxd = max(maxd, (d, a))
return maxd[1]
def example(k):
global count, p
count = 0
p.clear()
for a in range(((2 ** k) - 1), 0, (- 1)):
union(a, (a & (a - 1)))
r = 0
for a in range((2 ** k), (2 ** (k + 1))):
union(r, a)
find(deepest())
r = a
example(9)
print(count)