【发布时间】:2013-04-30 18:25:05
【问题描述】:
前几天我被要求编写一个基本方法,当给定两个朋友时,如果他们被链接(我的意思是他们是朋友的朋友的朋友),则返回 true,如果他们是朋友,则返回 false不相关(他们的任何一个朋友列表中都没有关联)。
在和这个人合作之后,这是我们得出的基本算法:
def is_linked(friend_a, friend_b, visited = {}):
is_found = False
friends = friend_a.get_friends()
# You can assume this method is O(1)
if friends.contains(friend_b):
return True
visited[friend_a] = 1
for friend in friends:
# Prevents infinite recursion
# Assume O(1)
if friend in visited:
next
is_found = is_linked(friend, friend_b, visited)
if is_found:
last
del visited[friend_a]
return is_found
这个算法的最坏情况时间复杂度是多少?我们每个人都想出了自己的答案,由于我们无法达成协议,我希望在这里独立验证。
【问题讨论】:
-
在我看来
O(n^2)。 -
@AaronMiller - 您介意将其放入带有解释的答案中吗?
-
你在
if friend in visited上花了多少钱?如果O(1),整个事情就是O(n)。否则,我认为 Aaron 是对的。 -
@dlp - 假设
if friend in visited的 O(1)。话虽如此,您能否发布 O(n) 的推理作为答案?老实说,即使 if 语句为 O(1),我也在想 O(n^2),所以我很想知道为什么。 -
其实我收回了。我不知道。我的图论很弱,但这似乎是Breadth-first search 的变体,不是吗?正如它所说的那样,这真的让你在
O(n^2)。