1. 程式人生 > >二分法

二分法

每次 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

  

  

 

  

二分法