字符串切割大O.

时间:2018-01-17 11:32:16

标签: python string big-o object-slicing

for i in range(n):
    print("HelloWorld"[i:])

这是O(n)还是应该将切片算作“HelloWorld”字符的运行?

此外,当我比较两个字符串s1==s2时,此操作会在s1中的每个字母上运行,并将其与s2的每个字母进行比较,因此O(max(len(s1), len(s2))?

2 个答案:

答案 0 :(得分:2)

通常,索引操作取决于字符串的存储方式。在大多数情况下,它只是一个字符序列,每个字符长度相同,因此索引可以在一个操作中完成 - 因此,O(1) - 通过直接访问 n 字符。< / p>

然而,在某些情况下,索引可能更昂贵;例如,一些unicode字符串可以包含不同大小的字符,在这种情况下,查找字符 n 的唯一方法是从头开始并将各个字符大小相加,在这种情况下它确实是为O(n)。

总之,我们必须像for i in range(n)一样添加 n 这些单独的操作,这会给出 n 的另一个因素 - 请注意,这是即使对于第二种情况,它的O(1 + 2 + 3 + 4 + ... + n)是O(n ^ 2),因为和是n *(n + 1)/ 2 。 (在这种情况下,如果效率很重要,您可能会使用稍微不同的算法来在O(n)中执行此任务。)

答案 1 :(得分:0)

字符串切片是一种O( k )操作,其中 k 是切片的大小。这使得你的程序为O( n 2 ),因为切片大小平均为 n / 2。

等于是O(min(len( s1 ),len( s2 )))。 min 不是 max 。一旦它到达任一串的末尾就完成了。