搜尋演算法總結

KS_Fszha發表於2024-06-08

概述

搜尋演算法

搜尋演算法大致可以分為以下幾類:

  • DFS 深度優先搜尋
  • BFS 廣度優先搜尋
  • 迭代加深搜尋
  • A*搜尋
  • IDA* 啟發式迭代加深搜尋
  • meet in the middle 折半搜尋
  • 雙向 DFS
  • 雙向 BFS
  • Dancing Links 舞蹈鏈

Dancing Links 演算法是省選內容,在此不進行說明。

剪枝技巧

剪枝是搜尋題常用的最佳化方式,有時能大幅提升程式執行效率,常見剪枝技巧如下:

  • 可行性剪枝
  • 最優性剪枝
  • 排序剪枝(最佳化搜尋順序)
  • 搜尋位置剪枝(記錄上一層搜尋到的位置,下一層接著搜,不重新來)
  • 逆向操作剪枝(兩個相反的操作避免重複做)
  • 重複剪枝(vis陣列)
  • 層數剪枝(必須證明到某一層時一定不優)
  • 列舉剪枝(只利用上一層新加的數來和前面的陣列合,避免重複搜上一層搜過的)

以下是常見的玄學剪枝技巧,考場上用來搏更高分的,按資料大小分段來解決,不保證正確性:

  • 搜尋次數剪枝(cnt>1e7,cout<<ans),本質是最優性剪枝

注意事項

注意事項:

  • 迭代加深等搜尋演算法不見得總是比普通的 DFS 和 BFS 快,還是要根據具體情形判斷。
  • 搜尋題的常數必須小到極致,可以使用 unordered_map 或二分等思路最佳化。

相關文章