[英]Big O - O(log(n)) code example
像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;
}
}
另一个问题:
经典示例:
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)
根据定义,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))。
对于O(logn),请看一下涉及分而治之策略的任何代码示例:合并排序和快速排序(在这种情况下,预期运行时间为O(nlogn))
二进制搜索是一个示例O(log(n))。 http://en.wikipedia.org/wiki/Binary_search_algorithm 。
具有for循环的最简单的代码,您可以用来表示:
O(1):
function O_1(i) {
// console.log(i);
return 1
}
上):
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(平方(n)):
function O_SQRT(n) {
count = 0;
for (var i = 1; i * i < n; i++) {
// console.log(i);
count++;
}
return count
}
可能需要强调的是,您描述的较低复杂度算法是较高复杂度算法的子集。 换一种说法,
for (int i = 0; i < 10; i++) {
// do stuff
a[i] = INT;
}
在O(1)中,也在O(n),O(n²)中,并且,如果您想变得聪明一点,也可以在O(log(n))中。为什么? 因为所有恒定时间算法都受某些线性,二次函数等限制。
对于“大O问题”有什么解决方案(当获取大量数据作为输入时该怎么办)?
这个问题对我来说没有多大意义。 “大量数据”是相当武断的。 不过,请记住,Big O不是衡量时间复杂度的唯一方法; 除了测量最坏情况下的时间复杂度之外,我们还可以检查最佳情况和平均情况,尽管计算起来有些棘手。
在二进制搜索的情况下,您尝试查找最大迭代次数,因此将查找空间可以分成两半的最大次数。 这是通过将搜索空间的大小n重复除以2直到达到1来完成的。
让我们给出将标签x的n除以2所需的次数。 由于除以2,x倍等于除以2 ^ x,因此最终必须解决以下方程:
n / 2 ^ x = 1,变成n = 2 ^ x,
因此,使用对数,x = log(n),因此二元搜索的BIG-O为O(log(n))
重申一下:x是在将大小为n的空间缩小为大小1之前可以将其分成两半的次数。
http://www.quora.com/How-would-you-explain-O-log-n-in-algorithms-to-1st-year-undergrad-student
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.