下面的python代码的时间复杂度如何计算为0(n log n)?

时间:2019-05-26 21:13:16

标签: python time-complexity big-o

我一直在理解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)。

1 个答案:

答案 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)
相关问题