所以我知道时间复杂度为:
for(i;i<x;i++){
for(y;y<x;y++){
//code
}
}
is n^2
但会:
for(i;i<x;i++){
//code
}
for(y;y<x;y++){
//code
}
be n+n?
由于大 O 表示法不是比较绝对复杂度,而是比较相对复杂度,因此 O(n+n) 实际上与 O(n) 相同。每次将 x 加倍时,代码所花费的时间将是以前的两倍,这意味着 O(n)。无论您的代码运行 2、4 还是 20 个循环都没有关系,因为无论 100 个元素花费多少时间,无论花费多少时间,200 个元素花费的时间是 200 个元素花费的两倍,10,000 个元素花费的时间是 100 倍其中花费在哪个循环中。
这就是为什么big-O 没有提及绝对速度。谁认为 O(n^2) 函数 f() 总是比 O(log n) 函数 g() 慢,这是错误的。大O表示法只是说,如果你继续增加n,就会有一个点,g()的速度将超过f(),但是,如果n在实践中始终保持在该点以下,那么f()可以在实际程序代码中始终比 g() 更快。
实施例1
假设 f(x) 对于单个元素需要 5 ms,g(x) 对于单个元素需要 100 ms,但 f(x) 是 O(n^2),g(x) 是 O(log2 n)。时间图将如下所示:
Note: Up to 7 elements, f(x) is faster, even though it is O(n^2).
For 8 or more elements, g(x) is faster.
实施例2
二分搜索的时间复杂度为 O(log n),理想的哈希表(无冲突)为 O(1),但相信我,现实中哈希表并不总是比二分搜索更快。使用良好的哈希函数,对字符串进行哈希处理可能比整个二分搜索花费更多的时间。另一方面,使用较差的哈希函数会产生大量冲突,而更多的冲突意味着您的哈希表查找实际上不会是 O(1),因为大多数哈希表以一种使查找复杂度为 O(log2 n) 或 O(log2 n) 的方式解决冲突。甚至O(n)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)