代码之家  ›  专栏  ›  技术社区  ›  Dawn17

如何计算此代码的时间复杂性?

  •  0
  • Dawn17  · 技术社区  · 6 年前
    def long_common_prefix(input_list):
    
    
        for i in range(1, len(input_list)):
            input_list[0] = get_prefix(input_list[0], input_list[i])
    
        return input_list[0]
    
    def get_prefix(s1, s2):
    
        p1 = p2 = 0
        e1, e2 = len(s1), len(s2)
        currLongest = ''
        while p1 != e1 and p2 != e2:
            if s1[p1] == s2[p2]:
                currLongest += s1[p1]
                p1 += 1
                p2 += 1
            else:
                break
    
        return currLongest
    

    这是一个计算列表中字符串最长公共前缀的代码。例如, ['abcd','abc','ab'] 会给我 'ab' . 代码工作得很好,但我不确定如何定义代码的时间和空间复杂性。

    long_common_prefix ,只有一个循环 O(N) 在循环中,它调用帮助器 get_prefix . 自从 GETX前缀 将是 o(n) 它会在单回路中运行,是吗? O(N^2) 其中n是字符串的长度?

    谢谢。

    1 回复  |  直到 6 年前
        1
  •  0
  •   jgb    6 年前

    你是对的,除了 N 是输入列表的长度,但是 get_prefix 对字符串进行线性时间(和空间)操作,字符串的长度与输入列表的长度没有任何关系。

    的复杂性 GETX前缀 O(M) 在哪里 M 是公共前缀的长度。

    时间复杂性: O(N*M)
    空间复杂性: o(m)