理论基础 —— 查找 —— 二分查找
【概述】
二分查找又稱折半查找,其要求線性表中的記錄必須按關鍵碼有序,且必須采用順序存儲。
其基本思想是:用給定值 k 先與中間結點的關鍵字比較,中間結點把線形表分成兩個子表,若相等則查找成功;若不相等,再根據 k 與該中間結點關鍵字的比較結果確定下一步查找哪個子表,這樣遞歸進行,直到查找到或查找結束發現表中沒有這樣的結點。
【實現】
1.查找元素
int binarySearch(int a[], int value, int n) {int left=0, right=n-1;int res = -1;while (left <= right) {int mid = (left + right) / 2; //設置中值if (a[mid] == value) { //查找到符合元素valueres = mid;return res;} else if (a[mid] < value) //value在右邊部分left = mid + 1; //調整集合下界else //value在左邊部分right = mid - 1; //調整集合上界}return res; //若未找到value,則res= -1 }圖例
2.查找連續函數
bool cal(int x){... } int BinarySearch(double low,double high){//low為區間下界,high為區間上界double left,right,mid;left=low;//設置當前查找區間上界的初值right=high;//設置當前查找區間下界的初值while(right-left>1.0e-6){mid=(right+left)/2;//設置中值if(cal(mid)<x)//函數結果小于帶查找的值left=mid;//說明在右邊部分,調整集合下界elseright=mid;//說明在左邊部分,調整集合上界}return mid; }【二分查找判定樹】
對表中每個記錄的查找過程,可用二叉樹來描述,樹中的每個結點對應有序表中的一個記錄,結點的值為該記錄在表中的位置,常將這個描述二分查找過程的二叉樹稱為二分查找判定樹。
1.構造
當 n=0 時,折半查找判定樹為空
當 n>0 時,折半查找判定樹的根結點為 mid=(n+1)/2,根結點的左子樹是與有序表 r[1] ~ r[mid-1] 相對應的折半查找判定樹,根結點的右子樹是與 r[mid+1] ~ r[n] 相對應的折半查找判定樹。?
2.性質
- 任意兩棵折半查找判定樹,若它們的結點個數相同,則它們的結構完全相同
- 具有n個結點的折半查找樹的高度為?
- 任意結點的左右子樹中結點個數最多相差 1
- 任意結點的左右子樹的高度最多相差 1
- 任意兩個葉子所處的層次最多相差 1
【復雜度分析】
最壞情況下,關鍵碼比較次數為 log2(n+1),時間復雜度為 O(logn)
在表中查找任一記錄的過程,即是折半查找判定樹中從根結點到該記錄結點的路徑,和給定值的比較次數等于該記錄結點在樹中的層數。
具有 n 個結點的二分查找判定樹的深度為?,因此當查找成功時,所進行的關鍵碼比較次數至多為?,而查找不成功時,就是走了一條從根結點到外部結點的路徑,和給定值進行的關鍵碼的比較次數等于該路徑上內部結點的個數,即失敗情況下的平均查找長度等于樹的高度。
以深度為 k 的滿二叉樹為例,其深度為:,樹上的第 i 層有??個結點,假設表中的每條記錄查找概率相等,即:
則有:
故平均時間復雜度為:O(logn)
總結
以上是生活随笔為你收集整理的理论基础 —— 查找 —— 二分查找的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 信息学奥赛C++语言:顺序输出
- 下一篇: 哥德巴赫猜想(信息学奥赛一本通-T115