漫話二分(上)

2021-05-10 07:49:06 字數 1134 閱讀 1520

如果真的叫乙個課講的好的老師來說二分,課程可以變得相當有意思。每次回我們高中時我都講了很多次課,我最喜歡聊到的話題之一就是二分。從猜數遊戲引入二分查詢有序佇列中的指定元素,然後提出一些標準的有序佇列二分搜尋的實際應用,比如解方程x^x=100一類的問題。緊接著提出二分的各種有趣的變形,例如如何在有序整數序列中查詢a_i=i的元素。提出這些問題的目的就在於告訴大家,二分的思想不僅僅是用在猜數遊戲一類的情況下。二分判斷並不只限於「比目標值大/比目標值小」,只要能判斷出目標值在哪邊都行,例如在這裡,a_ii則表明目標元素在左邊。

i  =    1   2   3   4   5   6   7   8   9   10

a_i = -100 -20  -3   0   2   6  13  14  27  298

另乙個經典的變形則是分段有序佇列中的二分查詢。假如有這麼乙個數列,它可以分為前後兩個部分,兩段各是乙個遞增數列,並且後一段的最大值比前一段的最小值還要小。比如說,數列12, 15, 19, 3, 6, 7, 9, 10就是這樣乙個數列。這相當於是乙個有序數列迴圈移動之後的結果。如何在這個數列中查詢指定的元素呢?事實上,這種「有序序列」雖然經過了變形,但絲毫不影響二分法的應用,因為我們依舊能判斷出目標值在當前值的哪一邊(這是很顯然的,我不多解釋了),這就已經足夠了。

不結合實際應用的話,這些似乎沒有實用價值的理論會變得乏味。其實,只要仔細思考,生活中對應的現象總是有的。我的秘方就是,想不出例子就想mm,愛情的複雜性保證其蘊含了各種千奇百怪的數學模型。一想到愛情,分段有序佇列就能用上了。不妨為戀愛前後的「愉悅程度」建乙個簡單的模型:在戀愛之前,你會為找不到mm而越來越難過;一旦開始熱戀愉悅值瞬間達到極大;之後熱情會慢慢減小,但愉悅值始終比戀愛前要大。好啦,如果你想出一道題的話,問題背景已經是現成的了,不妨再定義乙個符合這個模型的且不能直接解出來的分段函式,編幾句形如「科學家發現戀愛前的愉悅值以a減某某某的速度遞減,戀愛後則變為曲線a加某某某」的話,然後就來看看有多少人還能想到二分法吧。一般說來,好的題目背景起到了乙個很強的干擾作用:題目背景越順理成章,問題描述越是簡單,看清問題背後隱藏的演算法障礙就越大。另外,如果你給的函式巧妙到還需要大家先證明它的單調及有界,那這題目就真的絕了。

然而,上面這些二分題都還太「正統」了一些。拼完了noi之後,我便在網上自由瀟灑地學習各種自己感興趣的演算法,看到了不少真正另類而絕妙的二分……

漫話二分(下)

很多問題並不完全符合二分的模型。最常見的乙個情況估計應該是無窮長的有序佇列中的二分查詢問題。例如,前文所提到的求解x x a實際上就是這樣的問題,這裡x的取值範圍可以是大於0的所有實數。當然,這裡的x明顯有乙個上界,比如x明顯要比a小。但是,如果有什麼二分問題,它沒有乙個明確的上界呢?比如,我們再玩...

矩陣上的二分查詢

今天做了一道題,矩陣上的二分查詢,居然做錯了。是考慮簡單了。一維上的演算法擴充套件到二維的時候,需要仔細分析矩陣中的資料的相互聯絡,然後調整演算法。前些時候,樹狀陣列那篇部落格。在擴充套件到二維後,求子矩陣的區間和,就沒有考慮清楚誰減去誰。這次二分查詢擴充套件到二維後,也沒有考慮清楚比arr x y...

二分思想(整數數列上的二分 實數域上的二分)

其實對於二分來說,我們可以分為兩類 1 整數域上的二分 2 實數域上的二分 但是總的二分的條件都是一樣的 需要序列具有單調性。1 整數域上的二分,分三步 其中mid最好是 1 而不是 2,因為 1 是向下取整,而 2是向0取整,在負數時很有用 1 通過分析具體問題,確定左右半段哪乙個是可行區間,以及...