与Big O符号一样,“O(1)”可以描述以下代码:
O(1):
for (int i = 0; i < 10; i++) {
// do stuff
a[i] = INT;
}
O(n):
for (int i = 0; i < n; i++) {
// do stuff
a[i] = INT;
}
O(n^2):
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
// do stuff
a[i][j] = INT;
}
}
另一个问题:
答案 0 :(得分:37)
经典示例:
while (x > 0) {
x/=2;
}
这将是:
Iteration | x
----------|--------
0 | x
1 | x/2
2 | x/4
... | ...
... | ...
k | x/2^k
2 k = x→将记录应用于双方→k = log(x)
答案 1 :(得分:3)
对于O(logn),请查看涉及分而治之策略的任何代码 示例:合并排序&amp;快速排序(在这些情况下,预期运行时间为O(nlogn))
答案 2 :(得分:3)
从定义来看,log(n)(我的意思是这里用基数2登录,但基数无关紧要),是你必须自己乘以2得到n的次数。所以,O(log(n))代码示例是:
i = 1
while(i < n)
i = i * 2
// maybe doing addition O(1) code
在实际代码示例中,您可以在二分搜索,平衡二叉搜索树,许多可靠算法,优先级队列中满足O(log(n))。
答案 3 :(得分:1)
二进制搜索是一个例子OF(log(n))。 http://en.wikipedia.org/wiki/Binary_search_algorithm
答案 4 :(得分:1)
带有for循环的最简单的代码,您可以用来表示:
O(1):
function O_1(i) {
// console.log(i);
return 1
}
O(n)
function O_N(n) {
count = 0;
for (i = 0; i < n; i++) {
// console.log(i);
count++;
}
return count
}
O(n²):
function O_N2(n) {
count = 0;
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
// console.log(i, j);
count++;
}
}
return count
}
O(Log_2(n)):
function O_LOG_2(n) {
count = 0;
for (var i = 1; i < n; i = i * 2) {
count++;
}
return count
}
O(Sqrt(n)):
function O_SQRT(n) {
count = 0;
for (var i = 1; i * i < n; i++) {
// console.log(i);
count++;
}
return count
}
答案 5 :(得分:0)
值得强调的是,您描述的较低复杂度算法是较高复杂度算法的子集。换句话说,
for (int i = 0; i < 10; i++) {
// do stuff
a[i] = INT;
}
在O(1)中,但在O(n),O(n²)中,如果你想要聪明,O(log(n))。为什么?因为所有常数时间算法都受到一些线性,二次等函数的限制。
“大O问题”有什么解决方案(当将大量数据作为输入时该怎么做?)
这个问题对我来说没有多大意义。 “很多数据”是相当武断的。不过,请记住,大O并不是时间复杂度的唯一衡量标准;除了测量最坏情况时间复杂度之外,我们还可以检查最佳情况和平均情况,尽管这些可能有点难以计算。
答案 6 :(得分:0)
在二进制搜索的情况下,您试图找到最大迭代次数,因此搜索空间可以分成两半的最大次数。这是通过将搜索空间的大小n重复除以2来实现的,直到达到1。
让我们给出你需要将n除以标签x的次数。除以2,x倍相当于除以2 ^ x,你最终必须求解这个等式:
n / 2 ^ x = 1,变为n = 2 ^ x,
所以使用对数,x = log(n),所以二元搜索的BIG - O是O(log(n))
重申:x是在将范围缩小到1之前将大小为n的空间分成两半的次数。
http://www.quora.com/How-would-you-explain-O-log-n-in-algorithms-to-1st-year-undergrad-student