二分查詢 從酒桌遊戲看二分查詢演算法

2021-10-14 17:44:01 字數 2029 閱讀 6805

(給前端食堂加星標,吃好每一頓)

「觀感度:?????」

「口味:孜然牛肉」

本文已收錄在githubgithub.com/geekhyt,感謝star。

酒桌上曾經玩過這樣乙個小遊戲,遊戲規則是:主持人每次隨機從 1-1000 中選擇乙個數字,比如是 171。只有主持人自己知道並事先寫在紙條上留存,然後分別讓大家來猜,能夠用最少次數猜到的人獲勝並擁有指定乙個人罰酒的權利。

主持人再次挑選數字,讓扒蒜小妹去猜...

最後,童歐巴用的次數最少,童歐巴獲勝!指定扒蒜小妹罰酒。

這個遊戲就是看誰能使用最少的次數猜到主持人選的數字,誰就獲勝。這種在有序資料集合中的查詢用二分查詢再合適不過了。

二分查詢,顧名思義。(看上文歐巴熟練的灌酒操作也可以知道)每次的查詢都是和區間的中間元素對比,將待查詢的區間縮小為一半,直到找到目標元素,或者區間被縮小為 0 (沒找到)。二分查詢的時間複雜度是o(logn)。對比常量級時間複雜度,當常量很大時o(999999),就會比o(1)的演算法要高效。

二分演算法雖然高效,但也存在一定的侷限性。想要使二分查詢發揮威力,需要滿足幾個前置條件才行。

33. 搜尋旋轉排序陣列 

假設按照公升序排序的陣列在預先未知的某個點上進行了旋轉。

( 例如,陣列 [0,1,2,4,5,6,7] 可能變為 [4,5,6,7,0,1,2] )。

搜尋乙個給定的目標值,如果陣列中存在這個目標值,則返回它的索引,否則返回 -1 。

你可以假設陣列中不存在重複的元素。

你的演算法時間複雜度必須是 o(log n) 級別。

示例 1:

輸入: nums = [4,5,6,7,0,1,2], target = 0 輸出: 4

示例 2:

輸入: nums = [4,5,6,7,0,1,2], target = 3 輸出: -1

進行旋轉後的陣列一定有一部分是有序的。而且,題目要求時間複雜度為o(logn),暗示我們使用二分搜尋。

如上圖中的兩種情況,觀察旋轉後的陣列:

接著我們來判斷target在哪乙個部分,捨棄另一部分即可。如上圖的第二種情況,我們假設target黑色的 3mid在右邊也就是[mid, end]target > nums[mid] && target <= nums[end],所以捨棄左邊,start = mid + 1

const search = function(nums, target) 

// 左側有序

if (nums[mid] >= nums[start])  else 

} else  else }}

return -1;

}

1.看到這裡了就點個在看支援下吧,你的「在看」是我創作的動力。

3.本文已收錄在前端食堂githubgithub.com/geekhyt,求個小星星,感謝star。

掘金:童歐巴

知乎:童歐巴

這是乙個終身學習的男人,他在堅持自己熱愛的事情,歡迎加入前端食堂,和這個男人一起開心的變胖~

推薦閱讀:

「種樹專業戶」「樹」業有專攻

你不知道的 typescript 泛型(萬字長文,建議收藏)

在看和**是莫大鼓勵❤️

迭代二分查詢二分查詢

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

1128 二分 二分查詢

時間限制 10000ms 單點時限 1000ms 記憶體限制 256mb 描述nettle最近在玩 艦 因此nettle收集了很多很多的船 這裡我們假設nettle氪了很多金,開了無數個船位 去除掉重複的船之後,還剩下n 1 n 1,000,000 種不同的船。每一艘船有乙個稀有值,任意兩艘船的稀有...

二分查詢及變種二分查詢

二分查詢也稱折半查詢 binary search 它的查詢效率很好。二分查詢有乙個要求是必須採用順序儲存結構,而且表種的元素是有序的。只有滿足這個條件我們才能使用二分查詢。查詢條件 查詢區域的左邊界,小於等於查詢區域的右邊界 查詢過程 1.迴圈條件 查詢條件 2.計算序列中間下標位置 3.如果待查詢...