我编写了不同的 python 代码来反转给定的字符串。但是,无法确定其中哪一个是有效的。有人可以指出这些算法在时间和空间复杂度上的差异吗?
def reverse_1(s):
result = ""
for i in s :
result = i + result
return result
def reverse_2(s):
return s[::-1]
有已经有一些解决方案了,但我无法找出时间和空间复杂度。我想知道有多少空间s[::-1]
会采取?
甚至无需尝试将其放在板凳上(您可以轻松做到),reverse_1
由于很多原因,速度会非常慢:
- 带索引的循环
- 不断向字符串添加字符,每次都创建一个副本。
因此,由于循环和索引而变慢,O(n*n)
由于字符串副本的时间复杂度,O(n)
复杂性,因为它使用额外的内存来创建临时字符串(希望在循环中进行垃圾收集)。
另一方面s[::-1]
:
- 不使用可见循环
- 返回一个字符串,无需从列表转换为列表
- 使用来自 python 运行时的编译代码
因此,在时间和空间复杂性以及速度方面你无法击败它。
如果您想要替代方案,您可以使用:
''.join(reversed(s))
但这会慢于s[::-1]
(它必须创建一个列表,以便join
可以构建一个字符串回来)。当需要除反转字符串之外的其他转换时,这很有趣。
请注意,与 C 或 C++ 语言不同(就字符串而言)这不可能反转字符串O(1)
空间复杂度是因为不变性字符串:您需要两倍的内存,因为字符串操作无法就地完成(这可以在字符列表上完成,但是str
list
转换使用内存)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)