试图理解连接字符串输出的空间复杂性

时间:2018-06-16 01:43:04

标签: python algorithm time-complexity asymptotic-complexity space-complexity

我在编码面试中遇到了这个问题:

typedef

这是一个经典的算法面试问题。我说我可以在# AAABB should return A3B2 时间和O(n)空间解决此问题。

O(1)

我理解def compress(s): output = '' count = 1 for i in range(len(s)-1): if s[i] == s[i+1]: count+=1 else: output = output + s[i] + str(count) count=1 output = output +s[i+1] + str(count) return output compress('AAABB') #returns A3B2 空间意味着它与输入的大小成比例增长。所以我认为O(n)空间看起来像 O(n)

我认为[(A,3),(B,2)]位于A3B2空间,因为它没有被分成多个字符串。

我现在意识到O(1)和我的输出与我的输入大小不成比例地(更少)增长,所以说空格是n == len(s)是否正确?

1 个答案:

答案 0 :(得分:4)

必须计算您存储的输出字符串的长度。在最坏的情况下(没有连续的字符匹配),它实际上是输入的两倍。很明显它通常是 O n ):如果你知道长输入总是包含非常长的运行,那么它只会渐近地变得更好。 (在最好的情况下,所有字符都相同,并且数字的长度为 O (log n )。)

也就是说,将输出视为流(如print)有时很有用,然后您的空间复杂度(对于count和当前输入字符)是常量。当然,即使这样,它在技术上也是对数的,因为存储count所需的位数是,但在实际分析中经常被忽略。