快速排序裡的學問 從猜數字開始 猜數字裡的演算法思想

2021-09-06 19:27:10 字數 1101 閱讀 8117

我們先來玩乙個猜數字遊戲:

我心裡默念乙個1~64之間的數,你來猜(你只能問答案是「是」或「否」的問題)。為了保證不論在什麼情況下都能以盡量少的次數猜中,你應該採取什麼策略呢?

很顯然,二分。先是猜是不是位於1~32之間,排除掉一半可能性,然後對區間繼續二分。這種策略能夠保證無論數字怎麼跟你捉迷藏,都能在log2n次以內猜中。用演算法的術語來說就是它的下界是最好的。(演算法的下界 :乙個問題的下界是用來解決該問題的任意演算法所需要的最小時間複雜度。 )

我們再來回顧一下這個遊戲所蘊含的本質:為什麼這種策略具有最優下界?

答案也很簡單,這個策略是平衡的。反之如果策略不是平衡的,比如問是不是在1~10之間,那麼一旦發現不是在1~10之間的話就會剩下比n/2更多的可能性需要去考察了。

這種策略的本質可以概括成「讓未知世界無機可乘」。它是沒有「弱點的」,答案的任何乙個分支都是等概率的。反之,一旦某個分支蘊含的可能性更多,當情況落到那個分支上的時候你就鬱悶了。比如猜數字遊戲最糟糕的策略就是乙個乙個的猜:是1嗎?是2嗎?… 因為這種猜法最差的情況下需要64次才能猜對,下界非常糟糕。二分搜尋為什麼好,就是因為它每次都將可能性排除一半並且無論如何都能排除一半(它是最糟情況下表現最好的)。

猜數字的時間複雜度

猜數字的時間複雜度其實就是二分查詢的複雜度。

所以二分查詢的時間複雜度無非就是while迴圈的次數。

我們可以跟著迴圈去想。總共有n個元素,跟下去就是n, n/2, n/4, ...., n/2k,其中k就是迴圈的次數。

每比較一次,查詢範圍被縮短為原來1/2,當範圍長度被縮短為1的時候,就完成查詢了,然後要比較多少次,高中時的數學問題了。

另 n/2k = 1,即 2k = n,所以 k = log2n。

k 為次數,時間複雜度可以表示o()=o(logn)。

延伸閱讀

快速排序裡的學問:從猜數字開始

快速排序裡的學問:再看看稱球問題

快速排序裡的學問:資訊熵

快速排序裡的學問:快速排序的過程

快速排序裡的學問:霍爾與快速排序

快速排序裡的學問:霍爾快排的實現

快速排序裡的學問:樞紐元選擇與演算法效率

快速排序裡的學問:隨機化快排

快速排序裡的學問 從猜數字開始 猜數字裡的演算法思想

我們先來玩乙個猜數字遊戲 我心裡默念乙個1 64之間的數,你來猜 你只能問答案是 是 或 否 的問題 為了保證不論在什麼情況下都能以盡量少的次數猜中,你應該採取什麼策略呢?很顯然,二分。先是猜是不是位於1 32之間,排除掉一半可能性,然後對區間繼續二分。這種策略能夠保證無論數字怎麼跟你捉迷藏,都能在...

快速排序裡的學問 樞紐元選擇與演算法效率

選擇首尾元素做樞紐元 通常的 沒有經過充分考慮的選擇是將第乙個或最後乙個元素用作樞紐元。選擇第乙個元素作為樞紐元的程式例子可以參考專題的前一篇 快速排序裡的學問 霍爾快排的實現 而選擇最後乙個元素用作樞紐元的程式例子則可以參考 快速排序裡的學問 快速排序的過程 這個演算法導論裡的例子。選擇最後乙個元...

快速排序演算法裡的partition函式

快速排序演算法裡的partition函式用來解決這樣乙個問題 給定乙個陣列arr和陣列中任意乙個元素a,重排陣列使得a左邊都小於它,右邊都不小於它。實現 arr為陣列,start end分別為陣列第乙個元素和最後乙個元素的索引 povitindex為陣列中任意選中的數的索引 int partitio...