NOIP 搜尋與動態規劃 搜尋的知識點歸納

2022-06-28 02:33:08 字數 1500 閱讀 5222

1.    概論

搜尋演算法是利用計算機的高效能來有目的的窮舉乙個問題解空間的部分或所有的可能情況,從而求出問題的解的一種方法。在競賽中,搜尋法還被當做「救命稻草」——大多數問題都可以使用搜尋來謀取部分分數。        

搜尋策略有很多,常見的有:深度優先搜尋、寬度優先搜尋、迭代加深搜尋等。搜尋演算法的設計主要是一下幾個步驟:確定狀態和擴充套件方式、選用合適的搜尋方式、優化。

2.    知識點歸納

2.1  深度優先搜尋與寬度優先搜尋        搜尋演算法設計過程中,主要需要考慮的問題有兩個:狀態與狀態之間的關係(即擴充套件方式)。如果將狀態對應頂點,狀態之間的關係對應邊,原搜尋問題可抽象成一棵搜尋樹。初始狀態對應根節點,目標狀態對應目標節點,搜尋演算法即找到一條從根節點到目標節點的路徑(乙個可行解)。詳見下圖:

不同的搜尋演算法相當於搜尋樹的不同遍歷方式。最常見的深度優先搜尋(dfs -- depth first search)和寬度優先搜尋(bfs -- breadth first search)對應著搜尋樹的兩種遍歷方式,如下圖:

深度優先搜尋所遵循的搜尋策略是盡可能「深」地遍歷搜尋樹,對應樹的前序遍歷。在深度優先搜尋中,對於當前節點,如果有可行子節點,則向下遍歷,否則回溯。        寬度優先搜尋所遵循的搜尋策略是盡可能「廣」的遍歷搜尋樹,對應樹的分層遍歷。在寬度優先搜尋中,每次都先將搜尋樹某一層的所有結點全部訪問完畢後再訪問下一層,首次達到的目標節點通常就是最優解。        深度優先搜尋與寬度優先搜尋有不同的應用,大致如下表:

2.2  迭代加深搜尋        

迭代加深搜尋是權衡深度優先搜尋和寬度優先搜尋的利弊後的搜尋策略。迭代加深搜尋實質是限定下界的深度優先搜尋,即首先允許深度優先搜尋搜尋k層搜尋樹,若沒有發現可行解,則增加搜尋樹深度至k+1,再次執行深度優先搜尋。迭代加深搜尋演算法比起寬度優先搜尋犧牲了時間,但節約了空間。迭代加深搜尋的時間不會超過等效bfs占用時間的兩倍,當資料規模增大時,二者的差距還會逐漸減小,而迭代加深搜尋的空間占用和dfs一樣小。另外迭代加深搜尋跟dfs一樣,在某些問題上需要判斷重複。

2.3 搜尋演算法的優化       

沒有任何優化的搜尋演算法又被稱為「裸搜」,其時間複雜度通常很高,通常由以下兩方面的影響:搜尋時產生了無用節點、重複搜尋。搜尋演算法的優化主要也基於這兩方面進行。

解決重複搜尋問題,不論深度優先搜尋還是寬度優先搜尋,都使用狀態記錄來解決。在搜尋的過程中,記錄搜尋狀態,當搜尋到與之前的狀態相同的狀態時,即可捨去該子樹。記錄狀態通常由兩種方式,一種是將狀態按照一定的策略進行排序;另一種則是用雜湊(hash)表。

解決搜尋時產生了無用節點問題,大致有兩種策略,一種是剪枝,另一種是改進搜尋順序。

NOIP 搜尋與動態規劃 動態規劃重難點習題詳解

1.動態規劃習題講解 例題2 6 過河 noip2005 問題描述 在河上有一座獨木橋,乙隻青蛙想沿著獨木橋從河的一側跳到另一側。在橋上有一些石子,青蛙很討厭踩在這些石子上。由於橋的長度和青蛙一次跳過的距離都是正整數,我們可以把獨木橋上青蛙可能到達的點看成數軸上的一串整點 0,1,l 其中l是橋的長...

NOIP模擬 記憶化搜尋 動態規劃 遊戲

題目描述 題目大意 有n個物品排成一排,從左往右第i個價值為a i 有兩個人從左往右輪流取物品。第乙個人可以拿一或兩個物品。如果前乙個人拿了k個,下乙個人只能拿k或k 1個。如果剩下的物品不夠拿,就結束。問如果大家都採取最優策略,那麼先手拿的物品的價值最多能比後手多多少。1 n 20000 樣例輸入...

動態規劃與搜尋遞推的區別

動態規劃是解決某一類的問題,而不在於糾結遞推還是遞迴,記憶體換時間。cpu記憶體裡儲存的所有資料構成了當前狀態,cpu只能利用當前狀態計算出下乙個狀態。下乙個狀態只能由當前狀態計算出來。斐波那契,每求乙個新數隻需要之前的兩個狀態,只需要依照固定的模式從舊狀態計算出新狀態就行。不需要考慮是不是需要更多...