深搜的剪枝技巧

2021-10-07 13:11:57 字數 829 閱讀 7171

【概述】

搜尋演算法的時間複雜度大多是指數級的,難以滿足對程式執行時間的限制要求,為使降低時間複雜度,對深度優先搜尋可以進行一種優化的基本方法——剪枝。

搜尋的程序可以看做是從樹根出發,遍歷一顆倒置樹(搜尋樹)的過程,所謂剪枝,就是通過某些判斷,避免一些不必要的遍歷過程,形象的說,就是減去搜尋樹中的某些枝條。

剪枝的原則:正確、準確、高效

【優化技巧】

1、優化搜尋順序

在不同的搜尋問題中,搜尋樹的各個層次,各個分支之間的順序不是固定的。不同的搜尋順序會產生不同的搜尋樹形態,其規模大小也相差甚遠。

2、排除等效冗餘

在搜尋過程中,如果我們能夠判定從搜尋樹的當前節點上沿著某幾條不同分支到達的子樹是等效的,那麼只需要對其中的一條分支執行搜尋。

3、可行性剪枝

在搜尋過程中,及時對當前狀態進行檢查,如果發現分支已經無法到達遞迴邊界,就執行回溯。這好比我們在道路上行走時,遠遠看到前方是乙個死胡同,就應該立即折返繞路,而不是走到路的盡頭再返回。

某些題目條件的範圍限制是乙個區間,此時可行性剪枝也被稱為」上下界剪枝「

4、最優化剪枝

在最優化問題的搜尋過程中,如果當前花費的代價已經超過當前搜到的最優解,那麼無論採取多麼優秀的策略到達遞迴邊界,都不可能更新答案。此時可以停止對當前分支的搜尋,執行回溯。

5、記憶化

可以記錄每個狀態的搜尋結果,在重複遍歷乙個狀態時直接檢索並返回。這好比我們對圖進行深度優先遍歷時標記乙個節點是否已經被訪問過。

【例題】

①數的劃分(可行性剪枝)(資訊學奧賽一本通t1440)

②生日蛋糕(資訊學奧賽一本通t1441)

題目還沒整理好,慢慢補充。

深搜的剪枝技巧

首先是深搜的模板 int ans 最壞情況,now now為當前答案 void dfs 傳入數值 1.剪枝的概念 實際上,對於搜尋,其實就是一棵樹 樹醜,莫要介意 那麼對於沒有剪枝的dfs,需要搜尋整棵樹,而剪枝,就是將其中一部分枝幹減掉,使時間複雜度降低。2.剪枝的原則 三個原則 正確性 這是剪枝...

深搜的剪枝技巧 小木棍

時間限制 1 sec 記憶體限制 128 mb 喬治有一些同樣長的小木棍,他把這些木棍隨意砍成幾段,直到每段的長都不超過50。現在,他想把小木棍拼接成原來的樣子,但是卻忘記了自己開始時有多少根木棍和它們的長度。給出每段小木棍的長度,程式設計幫他找出原始木棍的最小可能長度。輸入檔案共有二行。第一行為乙...

深搜的剪枝

深搜前面已經講過,對於剪枝,就是把沒必要的步驟進行if特判剪枝,用好了可以大大的優化複雜度 這裡就根據兩個例題來講吧 詳情見 include include include intn,k int f 210 7 int main printf d n f n k 輸出最大值 return0 詳情見 ...