演算法學習 二分查詢的學習

2022-08-26 04:39:07 字數 2187 閱讀 3377

1、二分查詢使用場景

在有序陣列中,快速查詢某個數字或者某個範圍,最終都是對某個 target的查詢,隸屬於search演算法的一種

2、二分使用要求

1) 必須能夠隨機儲存,o(1)常數時間訪問,比如陣列或者vector等或者底層依靠順序儲存結構實現的資料結構

2) 必須有序,或者在區域性範圍內有序,可以進行左右範圍的判定

3、時間複雜度

二分的時間複雜為o(logn),遞推公式為o(n) = o(n/2) + o(1),通過常熟時間內將原有的問題規模減少到原來的一半;

4、二分的分析步驟

1) 明確對誰使用二分,

2) 二分後如何選擇下乙個要處理的範圍

5、二分經典模版

二分邊界採用相鄰即退出,然後再去根據題目要求判斷先返回end還是先返回start 

int binarysearch(vector& nums, int tartget, int start, int end)

while(start + 1 < end)

else if(nums[mid] > target)

else

}if(nums[start] == target)

if(nums[end] == target)

return -1;

}

二分模版的變形,返回第乙個target出現的位置或者返回最後乙個target的位置等,就是在內部判斷向左向右時,等於的情況怎麼辦,下面採用例題說明。

6、 二分經典題目

1) 經典二分查詢問題

直接使用模版,不解釋;

2) 查詢目標最後乙個位置

給乙個公升序陣列,找到target最後一次出現的位置,如果沒出現過返回-1;當中間的陣列值等於target的時候,應該將此時的start值更新成mid;

class solution 

int start = 0;

int end = vectorlen - 1;

while(start + 1 < end)

else if(a[mid] < target)

else

}if(a[end] == target)

if(a[start] == target)

return -1;

}};

3) 查詢target出現的第乙個位置

給定乙個排序的整數陣列(公升序)和乙個要查詢的整數target,用o(logn)的時間查詢到target第一次出現的下標(從0開始),如果target不存在於陣列中,返回-1。此時和題目2中的分析類似,當nums[mid] == target時,此時應該更新end的值,因為前面還可能存在target;

class solution 

int start = 0;

int end = arraylen - 1;

while(start + 1 < end)

if(array[mid] < target)

}if(array[start] == target)

if(array[end] == target)

return -1;

}};

4) 找到排序陣列中最接近的元素

在乙個排好序的陣列 a 中找到 i 使得 a[i] 最接近 target

//還是標準的二分程式,就是在返回值時的判斷不一樣了,比較誰距離target近

class solution

//標準二分模版定義開始和結束變數

int begin = 0;

int end = size - 1;

while(begin + 1 < end)

else

}return abs(a[begin] - target) < abs(a[end] - target) ? begin : end;

}};

5) 最大連續陣列的最大平均值

給定乙個有正有負的陣列,返回長度大於k的子陣列的最大的平均值;

對於使用二分的兩個條件來說,滿足隨機儲存,但是這個陣列不是排序的陣列,那麼對與這道題來說就不是對陣列本身進行二分;乙個陣列的的子陣列的平均值必然大於陣列元素的最小值,小於陣列的最大值,其他的必然存在這個範圍內,那麼可以對答案進行二分進行查詢;

演算法學習之路 二分查詢

描述 給定乙個單調遞增的整數序列,問某個整數是否在序列中。輸入 第一行為乙個整數n,表示序列中整數的個數 第二行為n n不超過10000 個整數 第三行為乙個整數m m不超過50000 表示查詢的個數 接下來m行每行乙個整數k。輸出 每個查詢的輸出佔一行,如果k在序列中,輸出yes,否則輸出no。輸...

經典演算法學習 二分查詢

在所有的查詢演算法中,二分查詢是最簡單一種。二分查詢要求原先的序列是已經排序的,每次都是以序列中間的數字作為比較,如果小於中間的數字,那麼就在序列左邊繼續遞迴查詢 如果大於中間的數字,那麼就在序列右邊繼續遞迴查詢。直到找到該數字,或者直到序列中只有乙個數字的時候都還沒找到,則查詢失敗。查詢的時間複雜...

二分查詢演算法學習札記

二分查詢演算法學習札記 說明blog 二分查詢演算法基本思想 二分查詢演算法的前置條件是,乙個已經排序好的序列 在本篇文章中為了說明問題的方便,假設這個序列是公升序排列的 這樣在查詢所要查詢的元素時,首先與序列中間的元素進行比較,如果大於這個元素,就在當前序列的後半部分繼續查詢,如果小於這個元素,就...