在http://leepoint.net/notes-java/algorithms/big-oh/bigoh.html的文章说Big O表示法用于访问链表中的中间元素是O(N)。不应该是O(N / 2)。假设我们在链表中有100个元素所以要访问它必须从第一个节点到第50个节点的第50个元素。因此操作次数将在50左右。
为二进制搜索定义的另一个大符号是log(N)。假设我们有1000个元素。根据log(N),我们将需要接近3的opeartion。现在让我们手动计算它将是模式
第500个元素,250th,125,63,32,16,8,4,2因此操作大约为9,远大于3。
我在这里找不到任何东西?
答案 0 :(得分:4)
O( n )表示“比例到 n ,对于所有大型 n ”。 1
所以它不必等于 n 。
我上面的解释有点不清楚O( n )中的某些东西是否也在O(n 2 )中。 - 我对“比例”这个词的使用很差,正如其他人试图提到的那样(而且我最初的误解),“收敛”将是一个更好的术语。 > 2
1:实际上意味着“ n 与 n 成比例 n 在最坏的情况下 < / em>“,但书籍通常会考虑”平均“情况,f(n) ~ n
更准确地表示,其中f
是您的职能。
2:对于技术性更强的人:它应该是显而易见的,但我 不 打算在数学上严谨。如果您正在寻找正式证明(有比率,限制等等),Math.SE可能是提出这个问题的更好选择。
答案 1 :(得分:4)
你所缺少的是任何常数倍数对于大O都无关紧要。所以我们得到O(N)= O(N / 2)。
关于问题的日志部分,它实际上是log 2 (N)而不是log 10 (N),所以在这种情况下log(1000)实际上是9(向下舍入时)。此外,如前所述,O(log 2 (N))= O(log 10 (N)),因为这两者只是彼此的常数倍。具体来说,log 2 (N)= log 10 (N)/ log 10 (2)
最后要考虑的是,如果将几个函数加在一起,则较低程度的函数与Big O无关。这是因为较高程度的函数比较低程度的函数生长得更快。所以我们发现像O(N 3 + N)= O(N 3 )和O(e N + N 2 + 1)= O(e N )。
这要考虑两件事:丢弃倍数,降低低度函数。
答案 2 :(得分:1)
从您关联的网页:
同样,忽略常数乘数。所以O(4 * N)算法是 相当于O(N),它应该如何写。最终你 想要在确定时注意这些乘数 性能,但对于使用Big-Oh的第一轮分析,你 简单地忽略常数因素。
答案 3 :(得分:1)
Big O表示法是算法效率的通用表达式。你不应该将它解释为算法的速度,或者需要多少内存的精确等式,而是将其视为近似值。函数的常数乘数被忽略,例如,您可以将示例视为O 1/2(N)或O k (N),删除 k 它给你O(N)。