2.廣度優先搜尋
剪枝經典例題
搜尋演算法是利用計算機的高效能來有目的的窮舉乙個問題解空間的部分或所有的可能情況,從而求出問題的解的一種方法。現階段一般有列舉演算法、深度優先搜尋、廣度優先搜尋、a
∗a^*
a∗演算法、回溯演算法、蒙特卡洛樹搜尋、雜湊函式等演算法。
深度優先搜尋,又叫dfs
dfsdf
s,顧名思義就是按照深度優先的順序對於「問題狀態空間」進行搜尋的演算法。
舉例說明一下:下圖是乙個無向圖,如果我們從a點發起深度優先搜尋,則我們可能得到如下的乙個訪問過程:a
−>b−
>
ea->b->e
a−>b−
>
e(沒有路了!回溯到a
aa)−
>c−
>f−
>h−
>g−
>
d->c->f->h->g->d
−>c−
>f−
>h−
>g−
>
d(沒有路,最終回溯到a
aa,a
aa也沒有未訪問的相鄰節點,本次搜尋結束)。純粹的不撞南牆不回頭。
}回溯:主要是在搜尋嘗試過程中尋找問題的解,當發現已不滿足求解條件時,就「回溯」返回,嘗試別的路徑。不能把當前的條件保留下來影響後面的搜尋(當然,有一些條件是可以不用改的,只要你能保證它不會影響後續的搜尋或者它在後續會被覆蓋掉)。
廣度優先搜尋,又稱寬度優先搜尋或者bfs
bfsbf
s,是一種最簡便的圖的搜尋演算法之一。
從初始節點開始,應有算符生成第一層節點,檢查目標節點是否在這些節點中,若沒有,再用產生規則將所有的第一層的節點逐一延展,得到第二層節點,並逐一檢查第二層中是否有目標節點,若沒有…依次檢查下去,直到發現目標節點。
舉個例子:我們從(bx
,by)
(bx,by)
(bx,by
)開始,要在乙個長寬分別為n
nn和m
mm的矩陣中搜尋乙個節點(xx
,yy)
(xx,yy)
(xx,yy
)。
int ex[4]
=;int ey[4]
=;void
bfs(
int bx,
int by)
for(
int i=
0;i<
4;i++)}
}printf
("no");
return
;}
dfs
dfsdf
s可以說是碰運氣似的亂搜尋,可能會出現答案就在身邊,而卻在其他地方搜尋了很久,而且第一時間找到的答案不一定就是最佳答案,所以必須要將所有的路徑都搜尋完。
而b fs
bfsbf
s就完全不同了,它就是穩打穩紮,一步一步慢慢向前。而且第一時間搜尋到的答案一定是最佳答案。但當答案離初始節點很遠時,時間和空間就會大幅度提高。
在一些搜尋問題中,搜尋樹的各個層次、各個分支之間的順序是不固定的。不同的搜尋順序會產生不同的搜尋樹,會導致搜尋效率變高。
當我們能判斷從當前節點的不同分支搜尋下去結果是一樣的,那我們搜尋一次就可以了。
如果我們可以判斷當前節點搜尋下去絕對找不到結果,我們就不用找了。
在最優化問題中,如果當前花費的代價已經超過了當前搜尋到的最優解,我們就可以不在搜尋下去了。
可以記錄每個狀態的搜尋結果,再重複搜尋的時候直接檢索並返回。這就好比我們用dfs時,標記乙個節點是否已經被訪問過。
傳送門傳送門
傳送門
演算法筆記 搜尋初步
把這幾天學的搜尋做乙個初步總結。一 深度優先搜尋 dfs 從起點出發,走過的點要做標記,發現有沒走過的點,就隨意挑乙個往前走,走不動了就回退。不能走已經走過的點 需要判重 舉幾個栗子 1.判斷從v出發是否能走到終點 bool dfs v return false 判斷從v出發是否能走到終點時,返回值...
溢位初步(1)
溢位初步 1 2006 11 28 07 43 41 發表 2006 11 24 22 28 00 第 緩衝區溢位 審查 是否存在緩衝區溢位時,將審查工作主要放在通過 p invoke 或者 com 互操作層呼叫非託管 的 上。託管 本身受到緩衝區溢位攻擊的可能性很小,因為無論是否訪問陣列,系統都將...
caioj 1040 搜尋初步
因為按字典序排序 且頭尾相接 可理解成是乙個圈 所以第一位一定是1 prim 判斷素數的函式裡可以加上記憶化 因為函式裡i i x寫成了n debug了很久 邊寫邊輸出除錯比較好 可以定義debug函式 霧 以及 什麼時候要寫一下線性篩呀 includeusing namespace std tem...