【发布时间】:2020-03-03 14:54:27
【问题描述】:
让我们假设以下代码 (Python)- 数组中的领导者
def goldenLeader(A):
n = len(A)
size=0
for k in xrange(n):
if (size == 0): size += 1
value = A[k] else:
if (value != A[k]): size -= 1
else:
size += 1
candidate = -1 if (size > 0):
candidate = value leader = -1
count = 0
for k in xrange(n):
if (A[k] == candidate): count += 1
if(count>n//2): leader = candidate
return leader
所以既然我们要遍历数组A两次,时间复杂度应该是O(n + n)
但是提到时间复杂度是O(n)
怎么会?
【问题讨论】:
-
O(n+n) == O(2n) == O(n)。 Big-O 符号“隐藏”乘法常数;我推荐reading up 了解它的工作原理。 -
应该注意 O(n) 和所有其他 O 都是集合,而不是数字。更好的表达方式是 O(n+n) ∈ O(n)。
-
@chepner 如果 Big-O 表示法“隐藏”乘法常数;如果 m>n,那么 O(m+n) 应该是 O(m)。
-
@manishkumar m+n 是任意的。 O(m)==O(n) 在你的例子中,即使 m>n,就大 O 而言。
-
图算法的运行时间往往有这样一个“分裂”的输入大小,以强调图的密度如何影响运行时间。比较 Dijkstra 的单源最短路径算法 (
O(m + n lg n)),它对图中的边数敏感,而 Floyd-Warshall 算法 (O(n^3)) 则不敏感。
标签: python arrays python-3.x performance time-complexity