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执行次数?”要找到“更糟糕的情况复杂度函数”,您不需要执行的确切次数;复杂性分析忽略了常量因素,需要