二分查詢補充

2021-09-26 07:08:23 字數 2514 閱讀 3984

求出序列中第乙個大於等於x的元素的位置l以及第乙個大於x的元素的位置r,這樣元素x在序列中的存在區間就是左閉右開區間l,r)。

例如對下標從0開始、有5個元素的序列來說,如果要查詢3,則應當得到l=1、r=4;如果查詢5,則應當得到l=r=4;如果查詢6,則應當得到l=4、r=5;而如果查詢8,則應當得到l=r=5。顯然,如果序列中沒有x,那麼l和r也可以理解為假設序列中存在x,則x應當在的位置。

程式**:

#include//a為嚴格遞增序列,x為欲查詢的數,函式返回第乙個大於等於x元素的位置 

//二分區間上下界為左閉右閉的[left,right],傳入的初值為[0,n]

int lower_bound(int a,int left,int right,int x) else

} return right;//查詢失敗,返回x應當在的位置}

int main();

printf("%d %d %d %d\n",lower_bound(a,0,n-1,3),lower_bound(a,0,n-1,5),lower_bound(a,0,n-1,6),lower_bound(a,0,n-1,8));

return 0;

}

注意:由於當left= right e時whil迴圈停止,因此最後的返回值既可以是lef,也可以是 right;

二分的初始區間應當能覆蓋到所有可能返回的結果。首先,二分下界是0是顯然的但是二分上界是n-1還是n呢?考慮到欲查詢元素有可能比序列中的所有元素都要大,此時應當返回n(即假設它存在,它應該在的位置),因此二分上界是n,故二分的初始區間為[left,right]=[0,n]。

執行結果:

程式**:

#include//a為嚴格遞增序列,x為欲查詢的數,函式返回第乙個大於x元素的位置 

//二分區間上下界為左閉右閉的[left,right],傳入的初值為[0,n]

int upper_bound(int a,int left,int right,int x) else

} return left;//查詢失敗,返回x應當在的位置}

int main();

printf("%d %d %d %d\n",upper_bound(a,0,n-1,3),upper_bound(a,0,n-1,5),upper_bound(a,0,n-1,6),upper_bound(a,0,n-1,8));

return 0;

}

執行結果:

程式**:

#include//a為嚴格遞增序列,x為欲查詢的數,函式返回第乙個大於等於x元素的位置 

//二分區間上下界為左閉右閉的[left,right],傳入的初值為[0,n]

int lower_bound(int a,int left,int right,int x) else

} return right;//查詢失敗,返回x應當在的位置

}int upper_bound(int a,int left,int right,int x) else

} return left;//查詢失敗,返回x應當在的位置}

int main();

printf("%d %d\n",lower_bound(a,0,n-1,3),upper_bound(a,0,n-1,3));

printf("%d %d\n",lower_bound(a,0,n-1,5),upper_bound(a,0,n-1,5));

printf("%d %d\n",lower_bound(a,0,n-1,6),upper_bound(a,0,n-1,6));

printf("%d %d\n",lower_bound(a,0,n-1,8),upper_bound(a,0,n-1,8));

return 0;

}

執行結果:

上述的問題包括二分查詢,都是在解決這樣乙個問題:尋找有序序列中第乙個滿足某條件的元素的位置,所謂的「某條件」在序列中一定是從左到右先不滿足,然後滿足的(否則將該條件取反即可);

下面是此類問題的固定模板:

//解決「尋找有序序列第乙個滿足某條件的元素的位置」問題的固定模板 

//二分區間為左閉右閉的[left,right],初值必須能覆蓋解的所有可能取值

int solve(int left,int right) {

int mid; //mid為left和right的中點

while(left

二分查詢(待補充)

二分查詢演算法是在有序陣列中用到的較為頻繁的一種演算法,在未接觸二分查詢演算法時,最通用的一種做法是,對陣列進行遍歷,跟每個元素進行比較,其時間為o n 但二分查詢演算法則更優,因為其查詢時間為o lgn 譬如陣列,查詢元素6,用二分查詢的演算法執行的話,其順序為 1.第一步查詢中間元素,即5,由於...

MySQL查詢補充 HTML簡記 6 30

這個筆記主要補充幾個mysql的查詢和html的幾個簡單點。mysql的範圍查詢 查詢某個範圍內的字段。查詢員工編號在7900到7903,工資少於3000的員工編號 eg.select from emp where empno between 7900 and 7903 select from em...

迭代二分查詢二分查詢

在寫這篇文章之前,已經寫過了幾篇關於改迭代二分查詢主題的文章,想要了解的朋友可以去翻一下之前的文章 bentley在他的著作 writing correct programs 中寫道,90 的計算機專家不能在2小時內寫出完整確正的二分搜尋演算法。難怪有人說,二分查詢道理單簡,甚至小學生都能明確。不過...