Python-Big(O)运行时:列表理解和For循环

时间:2018-10-09 09:56:23

标签: python for-loop big-o list-comprehension

在CTCI(Python版本)中,以下代码的运行时描述为O(N)

# O(N)

def unique(string):
    # Assuming character set is ASCII (128 characters)
    if len(string) > 128:
        return False

    char_set = [False for _ in range(128)]
    for char in string:
        val = ord(char)
        if char_set[val]:
            # Char already found in string
            return False
        char_set[val] = True

    return True

这真让我感到困惑,因为我看到列表理解是char_set的形成,而在……之后另一个for循环……运行时间不应该是O(N ^ 2)吗?

编辑:关于Laakman为什么使用len(string)> 128检查ascii字符,我也感到困惑。难道不是只给出所讨论字符串的长度,而不是Python中ord方法所给出的字符值吗?

Edit1:如果她不使用val = ord(char),是否可以实现相同的目的?这样会将下一行更改为if char_set[char]:

2 个答案:

答案 0 :(得分:1)

[False for _ in range(128)]花费的时间是固定的,因此时间复杂度为O(1)

答案 1 :(得分:1)

对于第二个问题,关键是该代码旨在检查字符串中的每个字符是否唯一。假定该字符串是ASCII,则如果长度超过128个字符,则可能不能仅包含唯一字符,因为ASCII字符集中的开头只有128个字符。