首先,让我为您定义一下O(N log N)是什么。它意味着程序最多运行N log N次操作,即其上限为~N log N(其中N是输入的大小)。
现在,在这里,您的N是数字或代码的大小:
N = len(numbers)
注意第一个for循环从0到N-1运行,总共进行N次操作。这就是第一个N的来源。
-
那么,log N 是从哪里来的呢?它来自于 while 循环。
在 while 循环中,你不断将 2 乘以 j,直到 j 大于或等于 N。
这将在我们执行循环 ~log2(N) 次后完成,描述了我们必须将 j 乘以 2 多少次才能到达 N。例如,log2(8) = 3,因为我们将 j 乘以 2 三次以获得 8:
#ofmult. j oldj
1 2 2 <- 1 * 2
2 4 4 <- 2 * 2
3 8 8 <- 4 * 2
为了更好地说明这一点,我在您的代码中添加了一个打印语句,用于 i 和 j:
def complex(numbers):
N = len(numbers)
result = 0
for i in range(N):
j = 1
while j < N:
print(str(i) + " " + str(j))
result += numbers[i]*numbers[j]
j = j*2
return result
当运行以下代码时:
>>> complex([2,3,5,1,5,3,7,3])
这是输出的内容:
0 1
0 2
0 4
1 1
1 2
1 4
2 1
2 2
2 4
3 1
3 2
3 4
4 1
4 2
4 4
5 1
5 2
5 4
6 1
6 2
6 4
7 1
7 2
7 4
注意我们的 i 从 0...7 (N 次,总共 O(N) ), 第二部分,对于每个 i 总是有 3 ( log2(N) ) j-输出。
因此,代码的时间复杂度为 O(N log2 N)。
此外,我推荐一些好的网站:
https://rob-bell.net/2009/06/a-beginners-guide-to-big-o-notation/
还有,斯坦福大学教授的一堂讲座视频:
https://www.youtube.com/watch?v=eNsKNfFUqFo