反转字符串时间和 space 复杂度
Reverse string time and space complexity
我编写了不同的 python 代码来反转给定的字符串。但是,无法确定其中哪一个是有效的。有人可以指出这些算法使用时间和 space 复杂性的区别吗?
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,但我找不到时间和space复杂度。我想知道 space s[::-1]
需要多少?
甚至不尝试对它进行调整(你可以轻松做到),reverse_1
会因为很多原因变得非常慢:
- 循环索引
- 不断地向字符串中添加字符,每次都创建一个副本。
所以,由于循环和索引,速度慢,O(n*n)
时间复杂,因为字符串复制,O(n)
复杂,因为它使用额外的内存来创建临时字符串(希望在循环)。
另一方面s[::-1]
:
- 不使用可见循环
- returns 无需转换的字符串 from/to 列表
- 使用来自python运行时的编译代码
因此,在时间、space 复杂性和速度方面,您无法击败它。
如果你想要一个替代品,你可以使用:
''.join(reversed(s))
但这会比 s[::-1]
慢(它必须创建一个列表以便 join
可以构建一个字符串)。当需要其他转换而不是反转字符串时,这很有趣。
请注意,与 C 或 C++ 语言不同(就字符串的类比而言)不可能用 O(1)
[=55= 反转字符串] 由于 不变性 字符串的复杂性:你需要两倍的内存,因为字符串操作不能就地完成(这可以在字符列表上完成,但是 str
<=> list
转换使用内存)
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
我编写了不同的 python 代码来反转给定的字符串。但是,无法确定其中哪一个是有效的。有人可以指出这些算法使用时间和 space 复杂性的区别吗?
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,但我找不到时间和space复杂度。我想知道 space s[::-1]
需要多少?
甚至不尝试对它进行调整(你可以轻松做到),reverse_1
会因为很多原因变得非常慢:
- 循环索引
- 不断地向字符串中添加字符,每次都创建一个副本。
所以,由于循环和索引,速度慢,O(n*n)
时间复杂,因为字符串复制,O(n)
复杂,因为它使用额外的内存来创建临时字符串(希望在循环)。
另一方面s[::-1]
:
- 不使用可见循环
- returns 无需转换的字符串 from/to 列表
- 使用来自python运行时的编译代码
因此,在时间、space 复杂性和速度方面,您无法击败它。
如果你想要一个替代品,你可以使用:
''.join(reversed(s))
但这会比 s[::-1]
慢(它必须创建一个列表以便 join
可以构建一个字符串)。当需要其他转换而不是反转字符串时,这很有趣。
请注意,与 C 或 C++ 语言不同(就字符串的类比而言)不可能用 O(1)
[=55= 反转字符串] 由于 不变性 字符串的复杂性:你需要两倍的内存,因为字符串操作不能就地完成(这可以在字符列表上完成,但是 str
<=> list
转换使用内存)
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