幾種常見的剪枝方式
本篇隨筆簡單介紹一下信息學奧林匹克競賽中搜索算法的一個重要分支:剪枝。剪枝是提高搜索算法時空效率,使得算法在優越性上大大優化的技巧。有的時候暴力搜索(也叫爆搜)過不了時限的算法,通過各種剪枝+優化之后就能成功通過。可見剪枝的重要性。無論是正解搜索算法還是想不到正解無奈之下選擇的騙分算法,剪枝都是一類不得不學、不得不會的知識點。
本篇隨筆就來簡單介紹一下搜索的幾種剪枝方式。
剪枝的概念
我們知道,所謂深搜和廣搜(寬搜),其本質上都是對一棵搜索樹的深度、廣度優先遍歷。無論是圖論類型的題目,還是正常的傳統性題目都是如此。把握這個性質也是我們設計搜索算法時最重要的思路。
那么,下圖展示了一棵搜索樹:
對於這棵樹來講,以深度優先遍歷為例,從1節點開始深搜,若要完全遍歷,則需要搜索所有的節點。但是在解決實際問題的過程中,我們往往可以發現,有一些點和它們的子節點顯然不符合題意,壓根就沒必要進行搜索。那么我們就在算法中加入一個判斷條件,使得這棵子樹在搜索的時候不會被進入,以此優化時空復雜度。因為這個優化的技巧非常像在樹上砍冗余的枝條,所以起了一個名字叫做:剪枝。
剪枝的幾種常見方式
那么,剪枝如何來實現呢?
我們來看幾種常見的剪枝手段和算法設計思想。
為了方便讀者閱讀,我先把搜索樹掛上:
1、可行性剪枝
所謂可行性剪枝,顧名思義,就是當當前狀態和題意不符,並且由於題目可以推出,往后的所有情況和題意都不符,那么就可以進行剪枝,直接把這種情況及后續的所有情況判負,直接返回。
即:不可行,就返回。
2、排除等效冗余
所謂排除等效冗余,就是當幾個枝椏具有完全相同的效果的時候,只選擇其中一個走就可以了。
即:都可以,選一個。
3、最優性剪枝
所謂最優性剪枝,是在我們用搜索方法解決最優化問題的時候的一種常用剪枝。就是當你搜到一半的時候,已經比已經搜到的最優解要不優了,那么這個方案肯定是不行的,即刻停止搜索,進行回溯。
即:有比較,選最優。
4、順序剪枝
普遍來講,搜索的順序是不固定的,對一個問題來講,算法可以進入搜索樹的任意的一個子節點。但假如我們要搜索一個最小值,而非要從最大值存在的那個節點開搜,就可能存在搜索到最后才出解。而我們從最小的節點開搜很可能馬上就出解。這就是順序剪枝的一個應用。一般來講,有單調性存在的搜索問題可以和貪心思想結合,進行順序剪枝。
即:有順序,按題意。
5、記憶化
記憶化搜索其實是搜索的另外一個分支。在這里簡單介紹一下記憶化的原理:
就是記錄搜索的每一個狀態,當重復搜索到相同的狀態的時候直接返回。
即:搜重了,直接跳。
總結
你會for循環么?會?那這題你就能做。
@\(JZYShurak\)大佬指着一道黑題如是說。
你會if-else么?會?那你就會剪枝了。
假設@\(JZYShurak\)大佬指着一道搜索題如是說。