3 搜尋演算法

2021-10-02 15:13:22 字數 1898 閱讀 4528

搜尋演算法是利用計算機的高效能來有目的的窮舉乙個問題解空間的部分或所有的可能情況,從而求出問題的解的一種方法。現階段一般有列舉演算法深度優先搜尋廣度優先搜尋、a*演算法、回溯演算法、蒙特卡洛樹搜尋、雜湊函式等演算法。在大規模實驗環境中,通常通過在搜尋前,根據條件降低搜尋規模;根據問題的約束條件進行剪枝;利用搜尋過程中的中間解,避免重複計算這幾種方法進行優化。

重點學習以下演算法:

深度優先搜尋

廣度優先搜尋

回溯演算法

雜湊函式

深度優先搜尋屬於圖演算法的一種,是乙個針對圖和樹的遍歷演算法,英文縮寫為dfs即depth first search。深度優先搜尋是圖論中的經典演算法,利用深度優先搜尋演算法可以產生目標圖的相應拓撲排序表,利用拓撲排序表可以方便的解決很多相關的圖論問題,如最大路徑問題等等。一般用堆資料結構來輔助實現dfs演算法。其過程簡要來說是對每乙個可能的分支路徑深入到不能再深入為止,而且每個節點只能訪問一次。一般地:

1)構造乙個頂點元素型別的棧,初始狀態時其內的元素只有根節點;

2)將棧中的棧頂元素與目標元素比較,如果是,停止尋找;否則,繼續執行程式;

3)移除棧頂元素,並將棧頂元素的後繼節點依次加入棧中,;

4)如果棧為空,查詢失敗;否則,轉向第二步。

//層數固定的情況

void dfs(int k) else }}

}

二叉樹: 

void dfs(treenode* t)

if(stack1.empty())

return;

else

}

類似於樹的按層次遍歷的過程,一般用來求最短路徑最小操作等等

把根結點放到佇列的末尾

每次從佇列的頭部取出乙個元素,檢視這個元素所有的下一級元素,把它們放到佇列的末尾。並把這個元素標記為它下一級元素的前驅

找到所要找的元素時結束程式

如果遍歷整個樹都還沒有找到,則結束程式

void bfs(起始點) 

for(遍歷所有x相鄰點)

} }隊列為空,廣搜結束;

}

二叉樹:

void bfs(treenode *root)

}

回溯法(back tracking)(探索與回溯法)是一種選優搜尋法,又稱為試探法,按選優條件向前搜尋,以達到目標。但當探索到某一步時,發現原先選擇並不優或達不到目標,就退回一步重新選擇,這種走不通就退回再走的技術為回溯法,而滿足回溯條件的某個狀態的點稱為「回溯點」。比較註明的有八皇后問題,全排列問題等。

更多:回溯演算法講解--適用於leetcode絕大多數回溯題目

void backtrack(int i,int n,other parameters)

//下面的意思是求解空間第i個位置上的下乙個解

for(next ans in position i of solution space)

}

雜湊的概念屬於查詢,它不以關鍵字的比較為基本操作,採用直接定址技術。在理想情況下,查詢的期望時間為o(1)。

hash函式就是把任意長的輸入字串變化成固定長的輸出字串的一種函式。輸出字串的長度稱為hash函式的位數。

雜湊(hashing)通過雜湊函式將要檢索的項與索引(雜湊,雜湊值)關聯起來,生成一種便於搜尋的資料結構(雜湊表)。

更多:雜湊函式(雜湊)

兩個重要的知識點:

解決衝突的方法:開放定址法、拉鍊法

構造方法:直接定址法、除留餘數法、平方取中法...

A 搜尋演算法

啟發式搜尋演算法 要理解 a 搜尋演算法,還得從啟發式搜尋演算法開始談起。所謂啟發式搜尋,就在於當前搜尋結點往下選擇下一步結點時,可以通過乙個啟發函式 來進行選擇,選擇代價最少的結點作為下一步搜尋結點而跳轉其上 遇到有乙個以上代價最 少的結點,不妨選距離當前搜尋點最近一次展開的搜尋點進行下一步搜尋 ...

A 搜尋演算法

a 演算法是基於bfs的一種入門級啟發式搜尋演算法,就是將bfs的佇列改為基於估價的優先佇列,可以快速地找到答案。優先隊列為小根堆 while 優先佇列不為空 取出隊頭並擴充套件 將擴充套件節點以估價值 當前值為優先順序入隊 endwhile估價函式越接近真實值演算法越優,但一定不能大於真實值,否則...

搜尋演算法小結

搜尋演算法是利用計算機的高效能來有目的的窮舉乙個問題的部分和所有的可能情況,從而求出問題的解的一種方法。常用的搜尋演算法有 一.回溯法 回溯演算法是所有搜尋演算法中最為基本的一種演算法,其採用了一種 走不通就掉頭 思想作為其控制結構,其相當於採用了先根遍歷的方法來構造解答樹,可用於找解或所有解以及最...