对数级别的时间复杂度分析
时间复杂度中的对数的底数一般都是2,因此通常将对数(㏒₂)简化成log。
以下面的2分查找代码为例
int a[]={1,2,3,4,5,6,7,8};
int len = 100; int left = 0; int right = len-1;
int pos = -1; int x = 1;
while(left < right)
{
int middle = (left + right) / 2;
if (a[middle] == x) return middle;
if (x < a[middle]) right = middle - 1;
else left = middle + 1;
return -1;
}
当使用2分查找法来查找元素的时候。
当数组a[]中有8个元素的时候,最差的情况下,需要进行的查找次数分析如下。
假设x值都位于查找位置的左边。
第一次 left=0;right=7; middle=(0+7)/2 = 3;
第二次 left=0; right=3-1=2; middel=(0+2)/2 = 1;
第三次 left=0; right=1-1=0; middel = 0;
进行到第三次之后,已经完成了整个数组的查找。
那么可以得出,8个元素的数组使用2分查找法进行查找所需要的次数为3。
使用同样的方法可以发现16个元素的数组需要的次数为4,32个元素的数组需要的次数为5。
由此可以推迟出公式
8=2^3;
16=2^4;
32=2^5;
数组数量N= 2^n(查找次数) ,根据对数是求幂的逆运算,可以推导出
n(查找次数) = logN(元素数量)
因此可以得出2分查找法的时间复杂度为O(logN)