Algorithm 该算法的复杂度函数

Algorithm 该算法的复杂度函数,algorithm,time-complexity,big-o,Algorithm,Time Complexity,Big O,考虑到比较语句是最相关的操作,我试图找到该算法的最坏情况复杂度函数。此时,if和else if始终在循环下执行,因此函数是循环执行次数的2倍 由于变量i每次都会增加一个更大的数字,因此复杂性可能是O(logn),但我如何找到exac执行数?谢谢 int find ( int a[], int n, int x ) { int i = 0, mid; while ( i < n ) { mid = ( n + i ) / 2; if ( a[mid]

考虑到比较语句是最相关的操作,我试图找到该算法的最坏情况复杂度函数。此时,
if
else if
始终在循环下执行,因此函数是循环执行次数的2倍

由于变量
i
每次都会增加一个更大的数字,因此复杂性可能是O(logn),但我如何找到exac执行数?谢谢

  int find ( int a[], int n, int x ) {    
  int i = 0, mid;
  while ( i < n ) {
     mid = ( n + i ) / 2;
     if ( a[mid] < x )
        n = mid;
     else if ( a[mid] > x )
        i = mid + 1;
     else return mid;
     }
return 0;
}
intfind(inta[],intn,intx){
int i=0,中间;
而(ix),则为else
i=中间+1;
否则返回中间;
}
返回0;
}
定性理解
让我们看看循环不变量,看看这个函数将运行多长时间

我们可以看到,函数将继续执行代码,直到满足(i条件为止

我们还要注意,在这个
循环中,
i
n
总是被变异为
mid

if ( a[mid] < x )        # Condition 1:
    n = mid;             #   we set n to mid
else if ( a[mid] > x )   # Condition 2:
    i = mid + 1;         #   we set i to mid+1
else return mid;         # Condition 3: we exit loop (let's not worry about this)
因此,在查看函数的这些部分之后,我们可以有效地看到这里发生了什么:

该函数将在
i
时执行代码,并且在每次循环迭代后,
i
n
的值设置为平均值,有效地将
i
n
之间的空间在每次循环迭代时减少一半

这种算法被称为a,其背后的思想是每次循环时,我们都会将数组边界切成一半

所以你可以把它想象成我们一直把
n
切成两半,直到我们不能再切成两半为止


定量分析
从数学角度来看,我们每次迭代都有效地将
n
除以2,直到
i
n
彼此相等(或
n

让我们把它想象成,我们能用n除以2多少次,直到它等于1?在这种情况下,我们希望n等于1,因为此时我们无法进一步拆分列表

我们剩下一个等式,
x
是执行
循环所需的时间量:

n/2^x = 1
n = 2^x
lg(n) = lg(2^x)
lg(n) = x lg(2)
lg(n) = x
如您所见,
x=lg(n)
,因此我们可以得出结论,您的算法运行在
O(lgn)

定性理解中
让我们看看循环不变量,看看这个函数将运行多长时间

我们可以看到,函数将继续执行代码,直到满足(i
条件为止

我们还要注意,在这个
循环中,
i
n
总是被变异为
mid

if ( a[mid] < x )        # Condition 1:
    n = mid;             #   we set n to mid
else if ( a[mid] > x )   # Condition 2:
    i = mid + 1;         #   we set i to mid+1
else return mid;         # Condition 3: we exit loop (let's not worry about this)
因此,在查看函数的这些部分之后,我们可以有效地看到这里发生了什么:

该函数将在
i
时执行代码,并且在每次循环迭代后,
i
n
的值设置为平均值,有效地将
i
n
之间的空间在每次循环迭代时减少一半

这种算法被称为a,其背后的思想是每次循环时,我们都会将数组边界切成一半

所以你可以把它想象成我们一直把
n
切成两半,直到我们不能再切成两半为止


定量分析
从数学角度来看,我们每次迭代都有效地将
n
除以2,直到
i
n
彼此相等(或
n

让我们把它想象成,我们能用n除以2多少次,直到它等于1?在这种情况下,我们希望n等于1,因为此时我们无法进一步拆分列表

我们剩下一个等式,
x
是执行
循环所需的时间量:

n/2^x = 1
n = 2^x
lg(n) = lg(2^x)
lg(n) = x lg(2)
lg(n) = x

如您所见,
x=lg(n)
,因此我们可以得出结论,您的算法在
O(lgn)

中运行,每次执行循环大小都会减少一半。如果有n个元素,那么pow(2,x)=n。其中x=迭代次数。(因为在最坏的情况下,循环在i>=n时终止),所以x=log2(n)。“因为变量i每次都增加了一个更大的数字”-不,不是:如果它增加了(因为
x
仍然大于
a[mid]
),每次将增加一半,即每次增加一个较小的数字。无论如何“可能是O(对数n)”是正确的。。。更具体地说,O(log-base-2(N))。“但是我如何找到exac执行次数?”要找到“更糟糕的情况复杂度函数”,您不需要执行的确切次数;复杂度分析忽略了常量因素,需要将搜索减半是最糟糕的情况。谢谢各位,你们能解释一下为什么当else if为真时会出现log(2,n)吗?我可以看出,当if语句为true时,每次执行循环的大小都会减少一半。如果有n个元素,那么pow(2,x)=n。其中x=迭代次数。(因为在最坏的情况下,循环在i>=n时终止),所以x=log2(n)。“因为变量i每次都增加了一个更大的数字”-不,不是:如果它增加了(因为
x
仍然大于
a[mid]
),每次将增加一半,即每次增加一个较小的数字。无论如何“可能是O(对数n)”是正确的。。。更具体地说,O(log-base-2(N))。“但是我如何找到exac执行次数?”要找到“更糟糕的情况复杂度函数”,您不需要执行的确切次数;复杂性分析忽略了常量因素,需要