Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 理解大O复杂性_Algorithm_Sorting_Time Complexity_Big O_Complexity Theory - Fatal编程技术网

Algorithm 理解大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

我很难理解大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)倍。(对于插入排序,它可以更小,但Big-O只给出上限)

解释 将一个算法形式化并不是那么容易,这样您就可以正式应用Big-O,它是一个数学概念,不容易转化为算法。通常,您会根据输入的大小测量执行操作所需的“计算步骤”数量

  • 因此,
    f
    是衡量算法执行多少计算步骤的函数
  • n
    是输入的大小,例如,对于类似
    [4,2,9,8,2]
    的列表,输入的大小为
    5
  • g
    是您测量的函数,因此如果您检查
    O(n^2)
    ,g=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