我一直在理解Big O计算的工作原理,在我开始练习一些问题后看了几部视频之后,我来到了这段代码,我觉得代码的时间复杂度是O(n ^ 2),因为外部循环将运行O( n)并且内部循环也将运行O(n)。因为内部循环必须遍历所有列表以查找唯一名称。 但是博客将其解释为O(n log n),怎么办?
def list_unique_names(phonebook):
unique_names = []
for name, phonenumber in phonebook: # 1
first_name, last_name = name.split(" ", 1)
for unique in unique_names: # 2
if unique == first_name:
break
else:
unique_names.append(first_name)
return len(unique_names)
phonebook = [
("John Doe", "555-555-5555"),
("Albert Einstein", "212-555-5555"),
("John Murphey", "202-555-5555"),
("Albert Rutherford", "647-555-5555"),
("Elaine Bodian", "301-555-5555"),
]
我期望复杂度为O(n ^ 2),但博客所有者表示其O(n log n)。
答案 0 :(得分:1)
您是正确的,您发布的代码在O(n^2)
中运行。
使用set
,您可以在amortized O(n)
中执行相同的操作:
def list_unique_names(phonebook):
unique_names = set()
for name, phonenumber in phonebook:
first_name, _ = name.split(" ", 1)
unique_names.add(first_name)
return len(unique_names)