c 實現二分查詢 折半查詢 演算法

2021-10-01 05:29:00 字數 1499 閱讀 4769

二分查詢是一種常用的查詢演算法,它不難理解,但是在解決一些問題的時候由於邊界問題的處理不當,經常會出現一些錯誤,比如說死迴圈。首先我們介紹乙個基礎應用,在乙個排序好的線性表中查詢目標。

問題描述:給定乙個整數x和整數

解決思路:一種自然而然的想法是從左到右掃瞄,它的執行時間是線性的,但是對於乙個龐大的資料量來說,這種方法不是最好的。如果我們合理地使用這個線性表已經排好序這一條件,將大大提高效率,二分查詢就是這樣的一種演算法。

二分查詢:首先驗證

int search(vector& nums, int target) 

return -1;

}

上面這個問題不難,下面讓我們看看leetcode第34題。題意如下:

給定乙個按照公升序排列的整數陣列nums,和乙個目標值target。找出給定目標值在陣列中的開始位置和結束位置。如果陣列中不存在目標值,返回[-1, -1]

示例1:

輸入:nums = [5,7,7,8,8,10], target = 8輸出:[3,4]

這個問題不難思索,是要用2次二分查詢。它的難度在於設定好每次left、right還有mid的更新。對於尋找目標開始位置的問題,如果當前的數小於目標,則left = mid + 1,否則right = mid,結束後mid = (left + right)/ 2;對於尋找目標結束位置的問題,如果當前的數大於目標,則r = mid-1,否則left = mid,結束後mid = (left + right+1)/ 2,這裡為何mid的更新與前者不一樣了呢,其實是乙個常用的二分技巧,是為了避免出現邊界上的死迴圈,讀者若不相信,可以將後者的加1去掉試一試。那麼更新mid時如何判斷要不要加1呢,使用的原則如下:

如果left = mid + 1,則left = (left + right )/ 2;

否則,mid = (left + right + 1) / 2;

class solution ;

if(nums.empty())

return result;

int tem = getleftrange(nums,target);

if(nums[tem] != target)

return result;

result[0] = tem;

result[1] = getrightrange(nums,target);

return result;

}int getleftrange(vector& nums,int target)

return l;

}int getrightrange(vector& nums,int target)

return l;}};

二分查詢 折半查詢 演算法

二分查詢也稱折半查詢 binary search 它是一種效率較高的查詢方法。但是,折半查詢要求線性表必須採用順序儲存結構,而且表中元素按關鍵字有序排列。首先,假設表中元素是按公升序排列,將表中間位置記錄的 關鍵字與查詢關鍵字比較,如果兩者相等,則查詢成功 否則利用中間位置 記錄將表分成前 後兩個子...

演算法 二分查詢(折半查詢)

二分查詢也稱折半查詢 binary search 它是一種效率較高的查詢方法。使用二分查詢的條件 1.必須採用順序儲存結構。2.必須按關鍵字大小有序排列。通俗一點的說 如果資料是乙個陣列,那麼這個陣列必須是有序的 時間複雜度 o log2n 如圖所示 下面我們來看c語言 include非遞迴實現 v...

演算法 二分查詢(折半查詢)

一.二分查詢基本思想 在有序的序列裡,先將目標和中間的數值比較,如果大於中間數值,則在後半段的中間繼續比對 如果小於中間數值,則在前半段的中間繼續比對。以此類推,直至找到目標,或者結束查詢沒有找到。二.關鍵條件 1 有序序列 2 順序儲存結構 三.時間複雜度 o logn 四.優點和不足 優點是比較...