按复杂性对 Big O 函数进行排名
Ranking Big O Functions By Complexity
我正在尝试对这些函数进行排序 — 2n, n100, (n + 1)2, n·lg(n ), 100n, n!, lg(n), 和 n99 + n98——所以每个函数都是下一个功能,但我不知道确定一个功能是否是另一个功能的方法。如果有人能解释我将如何做这件事,我将不胜感激。
假设您有一定的编程背景。假设您有以下代码:
void SomeMethod(int x)
{
for(int i = 0; i< x; i++)
{
// Do Some Work
}
}
请注意循环运行了 x 次迭代。一般而言,我们说您将在 N 次迭代后得到解决方案(其中 N 将是 x ex 的值:array/input 中的项目数等)。
所以这种类型的 implementation/algorithm 据说具有 N 阶的时间复杂度写为 O(n)
同样,一个嵌套的 For (2 Loops) 是 O(n-squared) => O(n^2)
如果您做出了二元决策,并且将可能性减少了两半,并且只选择了一半作为解决方案。那么复杂度是 O(log n)
发现 this link 很有趣。
供:喜满树
虽然 Link 很好地解释了 log(base2)N 复杂度是如何出现的,但让我用我的话来说。
假设您有一个预排序列表,例如:
1,2,3,4,5,6,7,8,9,10
现在,您被要求查找列表中是否存在 10。想到的第一个解决方案是循环遍历列表并找到它。这意味着 O(n)。可以做得更好吗?
方法一:
我们知道 List 已经按升序排序 所以:
- 中间的中断列表(比如 5)。
- 将中心值 (5) 与搜索值 (10) 进行比较。
- 如果中心值 == 搜索值 => 找到项目
- 如果中心 < 搜索值 => 对列表的右半部分执行上述步骤
- 如果中心 > 搜索值 => 对列表的左半部分执行上述步骤
对于这个简单的例子,我们会在休息 3 或 4 次后找到 10(在:5 然后 8 然后 9)(取决于你如何实施)
这意味着对于 N = 10 个项目 - 搜索时间为 3(或 4)。把一些数学放在这里;
2^3 + 2 = 10 为了简单起见,假设
2^3 = 10(几乎等于 --- 这只是做以 2 为底的简单对数)
这可以重写为:
Log-Base-2 10 = 3(又差不多)
我们知道 10 是物品的数量,3 是我们为找到物品必须做的 breaks/lookup 的数量。变成了
log N = K
这就是上面算法的复杂度。 O(log N)
通常当循环嵌套时,我们将值乘以 O(outerloop max value * innerloop max value)
n 等等。例如for (i to n){ for(j to k){}}
这里的意思是如果你说 for i=1 j=1 to k 即 1 * k next i=2,j=1 to k 所以即 O(max(i)*max(j)) implies O(n*k).
。此外,如果你想找到顺序,你需要回忆起对数用法的基本操作,比如 O(n+n(addition)) <O(n*n(multiplication)) for log it minimizes the value in it saying O(log n) <O(n) <O(n+n(addition)) <O(n*n(multiplication)) and so on.
通过这种方式你也可以实现其他功能。
Approach should be better first generalised the equation for calculating time complexity. liken! =n*(n-1)*(n-2)*..n-(n-1)
so somewhere O(nk) would be generalised formated worst case complexity like this way you can compare if k=2 then O(nk) =O(n*n)
我正在尝试对这些函数进行排序 — 2n, n100, (n + 1)2, n·lg(n ), 100n, n!, lg(n), 和 n99 + n98——所以每个函数都是下一个功能,但我不知道确定一个功能是否是另一个功能的方法。如果有人能解释我将如何做这件事,我将不胜感激。
假设您有一定的编程背景。假设您有以下代码:
void SomeMethod(int x)
{
for(int i = 0; i< x; i++)
{
// Do Some Work
}
}
请注意循环运行了 x 次迭代。一般而言,我们说您将在 N 次迭代后得到解决方案(其中 N 将是 x ex 的值:array/input 中的项目数等)。 所以这种类型的 implementation/algorithm 据说具有 N 阶的时间复杂度写为 O(n)
同样,一个嵌套的 For (2 Loops) 是 O(n-squared) => O(n^2)
如果您做出了二元决策,并且将可能性减少了两半,并且只选择了一半作为解决方案。那么复杂度是 O(log n)
发现 this link 很有趣。
供:喜满树
虽然 Link 很好地解释了 log(base2)N 复杂度是如何出现的,但让我用我的话来说。
假设您有一个预排序列表,例如:
1,2,3,4,5,6,7,8,9,10
现在,您被要求查找列表中是否存在 10。想到的第一个解决方案是循环遍历列表并找到它。这意味着 O(n)。可以做得更好吗?
方法一:
我们知道 List 已经按升序排序 所以:
- 中间的中断列表(比如 5)。
- 将中心值 (5) 与搜索值 (10) 进行比较。
- 如果中心值 == 搜索值 => 找到项目
- 如果中心 < 搜索值 => 对列表的右半部分执行上述步骤
- 如果中心 > 搜索值 => 对列表的左半部分执行上述步骤
对于这个简单的例子,我们会在休息 3 或 4 次后找到 10(在:5 然后 8 然后 9)(取决于你如何实施)
这意味着对于 N = 10 个项目 - 搜索时间为 3(或 4)。把一些数学放在这里;
2^3 + 2 = 10 为了简单起见,假设
2^3 = 10(几乎等于 --- 这只是做以 2 为底的简单对数)
这可以重写为:
Log-Base-2 10 = 3(又差不多)
我们知道 10 是物品的数量,3 是我们为找到物品必须做的 breaks/lookup 的数量。变成了
log N = K
这就是上面算法的复杂度。 O(log N)
通常当循环嵌套时,我们将值乘以 O(outerloop max value * innerloop max value)
n 等等。例如for (i to n){ for(j to k){}}
这里的意思是如果你说 for i=1 j=1 to k 即 1 * k next i=2,j=1 to k 所以即 O(max(i)*max(j)) implies O(n*k).
。此外,如果你想找到顺序,你需要回忆起对数用法的基本操作,比如 O(n+n(addition)) <O(n*n(multiplication)) for log it minimizes the value in it saying O(log n) <O(n) <O(n+n(addition)) <O(n*n(multiplication)) and so on.
通过这种方式你也可以实现其他功能。
Approach should be better first generalised the equation for calculating time complexity. like
n! =n*(n-1)*(n-2)*..n-(n-1)
so somewhere O(nk) would be generalised formated worst case complexity like this way you can compare if k=2 thenO(nk) =O(n*n)