二分查詢是乙個非常常用且簡潔的查詢演算法,相信很多人也知道它的時間複雜度是logn,但是我看網上的大多數部落格給出的所謂推導過程都十分不嚴謹,於是我花了些時間自己寫了推導過程。
首先上二分查詢的**:
public下面是推導過程:int find(int x, int
data)
/*** 查詢元素下標,沒找到返回-1
* @param
x 待查詢元素
* @param
data 有序的元素陣列
* @createtime:2023年3月4日
* @author
: gaojiabao
*/private
int find(int x, int data, int low, int
high)
else
if (x >data[mid])
else
if (x
if (low ==high)
else
} else
}
假設資料的規模為n(即每次呼叫時的high-low),程式執行的比較次數表示為c(n),假設程式查詢的是乙個不存在的資料,則此時執行的次數是最多的:
執行第一次時,有:
1代表執行了一次x和data[mid]的比較過程,
代表下一次遞迴呼叫find方法時high-low的值,也就是新的資料規模每次較少一半以上。
遞迴上面的公式,有:
我們知道每乙個整數都可以表示為2i+k的形式,如1=20+0,5=22+1,10=23+2,因此
設n=2i+k
令上面公式的n=i,則有:
因為n=2i+k,則有i=⌊lgn⌋,因此:
因為我們一直以來的假設是要查詢到的元素是找不到的,所以現在的情況是c(n)最大的情況,對於一般情況,則有:
因此二分查詢的時間複雜度是logn。
二分查詢時間複雜度的計算
時間複雜度無非就是while迴圈的次數!總共有n個元素,漸漸跟下去就是n,n 2,n 4,n 2 k,其中k就是迴圈的次數 由於你n 2 k取整後 1 即令n 2 k 1 可得k log2n,是以2為底,n的對數 所以時間複雜度可以表示o o logn 二分查詢的時間複雜度是o log n 最壞情況...
二分查詢時間複雜度的計算
時間複雜度無非就是while迴圈的次數!總共有n個元素,漸漸跟下去就是n,n 2,n 4,n 2 k,其中k就是迴圈的次數 由於你n 2 k取整後 1 即令n 2 k 1 可得k log2n,是以2為底,n的對數 所以時間複雜度可以表示o o logn 二分查詢的時間複雜度是o log n 最壞情況...
查詢(時間複雜度 二分法)
package day52 因為最近開始做專案時間就顯得很緊張了,停了乙個禮拜了快,有點兒偷懶了 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。note 給出的所有元素都大於0,...