-
折半搜索是非常常用的一種剪枝方法。它可以把某些搜索的時間複雜度降至原來的根號級別。
-
舉個例子,比如我們現在要從 個東西中選擇幾個東西,最後的總價值爲所有東西的價值和,總費用也爲所有東西的價值和,求當總費用 時的最大價值。
- 我們可以直接用一個 的暴力搜索,然而直接
TLE
。 - 但是,我們可以先搜索出前一半的東西的所有可能的總價值和總費用,然後我們在搜索後半段,時間複雜度各自爲 。
- 然後我們可以對前半段所有的可能解排序,然後枚舉後半段的價值,可以直接通過二分來求解。總時間複雜度爲 。
- 這樣,我們可以通過原題目的數據範圍了!!!上述方法即折半搜索。總的時間複雜度爲 ,幾乎是直接暴力算法的時間複雜度的根號級別。
- 我們可以直接用一個 的暴力搜索,然而直接
-
在現實生活中,折半搜索也非常常用,比如我們著名的折半攻擊
(雖然是黑客玩的,不是什麼好東西)。
細心的讀者可能會發現,這不就是我舉的例子嗎?是的,直接套就好了。
但是,,就是用上面的方法也會 TLE
啊!!!
我們發現題目中有這麼一句話:
這一行中從第3個砝碼開始,每個砝碼的質量至少等於前面兩個砝碼(也就是質量比它小的砝碼中質量最大的兩個)的質量的和。
也就是說,最多砝碼的情況是前兩個砝碼都是 ,而後面的砝碼都是前兩個砝碼的和(即斐波那契數列)。重量 的砝碼鐵定沒用,所以我們可以編程看看最多的砝碼個數是多少(代碼是 Python
的):
結果爲:
也就是說,最多才 個砝碼(可能更少),題目的數據範圍是吹出來的,我們的算法不用 TLE
。
折半搜索真的非常常用!!!大家可以多找找類似的題目做做。