反向字符串的时间和空间复杂度

时间:2018-07-14 05:08:04

标签: python algorithm data-structures time-complexity space-complexity

我写了不同的python代码来反转给定的字符串。但是,无法确定其中哪一个是有效的。有人可以指出使用时间和空间复杂度的这些算法之间的区别吗?

def reverse_1(s):
      result = ""
      for i in s : 
          result = i + result
      return result

def reverse_2(s): 
      return s[::-1]

already some solutions out there,但我找不到时间和空间的复杂性。我想知道s[::-1]将占用多少空间?

2 个答案:

答案 0 :(得分:3)

即使没有尝试进行测试(您可以轻松完成),reverse_1也会因为许多原因而变得缓慢:

  • 具有索引的循环
  • 不断在字符串中添加字符,每次创建一个副本。

因此,由于循环和索引的原因,速度很慢;由于字符串复制而造成的时间O(n*n)的复杂性;由于O(n)的复杂性,因为它使用了额外的内存来创建临时字符串(希望在循环中进行垃圾回收)

另一方面,s[::-1]

  • 不使用可见循环
  • 返回字符串,而无需从/转换为列表
  • 使用python运行时中的已编译代码

因此您无法在时间和空间复杂性以及速度方面击败它。

如果您想要替代方法,可以使用:

''.join(reversed(s))

,但这将比s[::-1]慢(它必须创建一个列表,以便join可以重新构建字符串)。当需要进行其他转换而不是反转字符串时,这很有趣。

请注意,与C或C ++语言不同(就类推而言,对于字符串而言),由于的不可变性,不可能以O(1)的空间复杂度来反转字符串字符串:您需要两倍的内存,因为字符串操作无法就地完成(可以在字符列表上完成,但是str <=> list转换使用内存)

答案 1 :(得分:0)

Complexity Operation | Example | Class | Notes --------------+--------------+---------------+------------------------------- Iteration | for v in l: | O(N) | Worst: no return/break in loop Slice | l[a:b] | O(b-a) | l[1:5]:O(l)/l[:]:O(len(l)-0)=O(N)

第二个更好!

来源:https://www.ics.uci.edu/~pattis/ICS-33/lectures/complexitypython.txt