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

时间:2019-01-14 07:11:59

标签: runtime time-complexity

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。由于get_prefix将是O(N)并且将在单个循环内运行,因此它是O(N^2),其中N是字符串的长度吗?

谢谢。

1 个答案:

答案 0 :(得分:0)

您是对的,除了N是输入列表的长度,但是get_prefix在字符串上以线性时间(和空格)进行操作,并且字符串的长度没有任何关系到输入列表的长度。

get_prefix的复杂度为O(M),其中M是公共前缀的长度。

时间复杂度:O(N*M)
空间复杂度:O(M)