【发布时间】:2016-04-12 01:55:01
【问题描述】:
我正在尝试找到该算法的最坏情况复杂度函数,将比较语句视为最相关的操作。那是if和else if总是在循环下执行的时候,所以函数是2*循环执行次数。
由于变量i 每次复杂度可能为 O(log n) 时都会增加一个更大的数字,但我如何找到执行的准确次数?谢谢。
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;
}
【问题讨论】:
-
每次执行循环大小减少一半。所以如果你有 n 个元素,那么 pow(2,x) = n。其中 x = 迭代次数。(因为在最坏的情况下,循环在 i >=n 时终止)。所以 x = log2 (n)。
-
“因为变量 i 每次都增加一个更大的数字” - 不,不是:如果它正在增加(因为
x仍然大于 @987654326 @),每次都会减少一半 - 即每次增加一个较小的数字。无论如何......“可能O(log n)”是正确的......更具体地说是O(log-base-2(N))。 “但是我如何找到确切的执行次数?” 要找到“更糟糕的情况复杂度函数”,您不需要确切的执行次数;复杂性分析忽略了常数因素,需要不断减半搜索是最坏的情况。 -
谢谢各位,当 else if 为真时,你能解释一下为什么 log(2,n) 吗?当 if 语句为真时,我可以看到。
标签: algorithm time-complexity big-o