Algorithm 理解大O复杂性
我很难理解大O时间复杂性 大O的正式定义:Algorithm 理解大O复杂性,algorithm,sorting,time-complexity,big-o,complexity-theory,Algorithm,Sorting,Time Complexity,Big O,Complexity Theory,我很难理解大O时间复杂性 大O的正式定义: f(n)=O(g(n))表示存在正常数c和k,因此0≤ f(n)≤ cg(n)适用于所有n≥ k。函数f的c和k的值必须是固定的,并且不能依赖于n 插入排序的最差时间复杂度是O(n^2) 我想了解插入排序时这里的f(n)、g(n)、c和k。插入排序时,排序f(n)是处理器执行排序时的实际操作数。g(n)=n2。c和k的最小值将由实现定义,但它们并不重要。这个Big-O表示法的主要思想是,如果将数组的大小增加一倍,插入排序工作所需的时间将增加大约4(22
f(n)=O(g(n))
表示存在正常数c
和k
,因此0≤ f(n)≤ cg(n)
适用于所有n≥ k
。函数f
的c
和k
的值必须是固定的,并且不能依赖于n
插入排序的最差时间复杂度是O(n^2)
我想了解插入排序时这里的
f(n)
、g(n)
、c
和k
。插入排序时,排序f(n)是处理器执行排序时的实际操作数。g(n)=n2。c和k的最小值将由实现定义,但它们并不重要。这个Big-O表示法的主要思想是,如果将数组的大小增加一倍,插入排序工作所需的时间将增加大约4(22)倍。(对于插入排序,它可以更小,但Big-O只给出上限)解释
将一个算法形式化并不是那么容易,这样您就可以正式应用Big-O,它是一个数学概念,不容易转化为算法。通常,您会根据输入的大小测量执行操作所需的“计算步骤”数量
- 因此,
是衡量算法执行多少计算步骤的函数f
是输入的大小,例如,对于类似n
的列表,输入的大小为[4,2,9,8,2]
5
是您测量的函数,因此如果您检查g
,g=n^2O(n^2)
和c
在很大程度上取决于特定的算法以及k
的精确程度f
例子 将算法形式化的最大问题是,您无法真正准确地说出执行了多少计算步骤。假设我们有以下Java代码:
public static void printAllEven(int n) {
for (int i = 0; i < n; i++) {
if (i % 2 == 0) {
System.out.println(i);
}
}
}
但是,由于常数实际上并没有起任何作用(它们在c
中消失),我们也可以忽略这一点并简化
例如,现在只剩下证明
n/2
在O(n^2)
中。通过这样做,您还将得到c
和k
的具体数字。例如:
n / 2 <= n <= 1 * n^2 // for all n >= 0
这里我们选择了c=5
和k=20
你也可以用完整的公式玩同样的游戏,得到类似的结果
n * A + n * B + n/2 * C
<= n * (A + B + C)
= D * n
<= D * n^2 // for all n > 0
n*A+n*B+n/2*C
n / 2 <= 100 * n <= 5 * n^2 // for all n >= 20
n * A + n * B + n/2 * C
<= n * (A + B + C)
= D * n
<= D * n^2 // for all n > 0