概述
搜尋演算法
搜尋演算法大致可以分為以下幾類:
- DFS 深度優先搜尋
- BFS 廣度優先搜尋
- 迭代加深搜尋
- A*搜尋
- IDA* 啟發式迭代加深搜尋
- meet in the middle 折半搜尋
- 雙向 DFS
- 雙向 BFS
- Dancing Links 舞蹈鏈
Dancing Links 演算法是省選內容,在此不進行說明。
剪枝技巧
剪枝是搜尋題常用的最佳化方式,有時能大幅提升程式執行效率,常見剪枝技巧如下:
- 可行性剪枝
- 最優性剪枝
- 排序剪枝(最佳化搜尋順序)
- 搜尋位置剪枝(記錄上一層搜尋到的位置,下一層接著搜,不重新來)
- 逆向操作剪枝(兩個相反的操作避免重複做)
- 重複剪枝(vis陣列)
- 層數剪枝(必須證明到某一層時一定不優)
- 列舉剪枝(只利用上一層新加的數來和前面的陣列合,避免重複搜上一層搜過的)
以下是常見的玄學剪枝技巧,考場上用來搏更高分的,按資料大小分段來解決,不保證正確性:
- 搜尋次數剪枝(cnt>1e7,cout<<ans),本質是最優性剪枝
注意事項
注意事項:
- 迭代加深等搜尋演算法不見得總是比普通的 DFS 和 BFS 快,還是要根據具體情形判斷。
- 搜尋題的常數必須小到極致,可以使用 unordered_map 或二分等思路最佳化。