二分法
阿新 • • 發佈:2017-08-06
每次 http 最大的 return 定義 最大 代碼 基本思想 ont
一、定義
二分查找 又稱為折半查找 , 是一種查找效率較高的方法 。
要求 : 1 . 所查找的序列為有序序列
2. 只能在順序存儲結構上實現
二、基本思想
每次將給定的 key 值與有序表中間位置上記錄的數據進行比較 ,確定待查記錄所在的範圍 , 然後逐漸縮小查找範圍 , 直到確定找到或找不到 。
三、查找過程
每次執行的操作是將 key 依次與 mid 對應的數據進行比較 。
代碼示例 :
非遞歸版本
/*******************************/ // 非遞歸版的二分法 void search ( int low , int high , int key ) { while ( low <= high ) { int mid = ( low + high ) / 2 ; if ( key == a[mid] ) { cout << "找到" ; return ; // return 的作用是為了跳出函數,並且返回值為空類型 } if ( key > a[mid] ) low = mid + 1 ; else high = mid - 1 ; } cout << "未找到" ; // 若前面所要找的數未找到,則函數不會返回,此時會執行到這一步。 }
遞歸版本
/*******************************/ // 遞歸版的二分法 void search ( int low , int high , int key ) { int mid = ( low + high ) / 2 ; if ( low >= high ) { cout << "未找到" ; return ; } if ( a[mid] == key ) { cout << "找到" ; return ; } if ( a[mid] > key ) search ( low , mid - 1 , key ) ; else search ( mid + 1 , high , key ) ; }
時間復雜度:
由於二分法每次是折半分 , 設復雜度為 k , 二分的所有數據總數為 n , 則 2^k = n , 復雜度 k = lg n 。
例題 :
問題描述
有N個城市,每個城市有Ai個人。
現在要開始投票,每個人有一張票。
作為領導者,你有B個箱子,你必須要將這B個箱子分發到N個城市去,每個城市至少需要一個箱子。
每個人都必須要投票,不能棄票,也就是說要把票丟進箱子裏去(每個城市有Ai張票)。
現在問你,怎麽分配這B個箱子才能使這些所有箱子裏中票數最大的那個箱子裏的票最少?
輸入
輸入包含一個數N(1<=N<=500,000)和B(N<=B<=2,000,000)。
接下來N行包含N個數,每個數Ai(1<=Ai<=5,000,000)表示每個城市的人數。
輸入N為-1,B為-1時結束。
輸出
輸出那個帶兵量最多的將領所帶的士兵數。
樣例輸入
2 7
200000
500000
4 6
120
2680
3400
200
-1 -1
樣例輸出
100000
1700
二分法