深搜廣搜概念

廣度優先搜索(BFS)
目的是系統地展開並檢查圖中的所有節點,它不考慮結果的可能位置,徹底地遍歷整張圖,直到找到結果爲止。類似樹的按層遍歷,其過程爲:首先訪問初始點Vi,並將其標記爲已訪問過,接着訪問Vi的所有未被訪問過可到達的鄰接點Vi1、Vi2……Vit,並均標記爲已訪問過,然後再按照Vi1、Vi2……Vit的次序,訪問每一個頂點的所有未被訪問過的鄰接點,並均標記爲已訪問過,依此類推,直到圖中所有和初始點Vi有路徑相通的頂點都被訪問過爲止。
廣度優先搜索使用隊列(queue)來實現
僞代碼

BFS(頂點v)
{
	
  	v點入隊
	while(隊列不爲空)
  	{
		取隊首點v,並把該點出隊
		for(對於每一個鄰接該點且未標記遍歷的點u)
		{
			if(符合題目條件)
			{
				標記u點;
				u點入隊;
			}
		}
	}
	return 結果
}

廣搜:搜索過程沒有回溯,是一種犧牲空間換取時間的方法。

深度優先搜索(DFS)

深度優先搜索所遵循的搜索策略是儘可能“深”地搜索樹。它的基本思想是:爲了求得問題的解,在探索過程中,一旦發現原來的選擇不符合要求,就回溯至父親結點重新選擇另一結點,繼續向前探索,如此反覆進行,直至求得最優解。深度優先搜索的實現方式可以採用遞歸或者棧來實現。由此可見,把通常問題轉化爲樹的問題是至關重要的一步,完成了樹的轉換基本完成了問題求解。
在深度優先搜索的過程當中,往往有很多走不通的“死路”。假如我們把這些“死路”排除在外,不是可以節省很多的時間嗎?打一個比方,前面有一個路徑,別人已經提示:“這是死路,肯定不通”,而你的程序仍然很“執着”地要繼續朝這個方向走,走到頭來才發現,別人的提示是正確的。這樣,浪費了很多的時間。針對這種情況,我們可以把“死路”給標記一下不走,就可以得到更高的搜索效率。
遞歸實現代碼思路:

DFS(頂點v)
{
	if(滿足答案條件)
	{
		記錄或更改
		return
	}
  	for(對於每一個鄰接v且未標記遍歷的點u)
	{
		if(剪枝)
		{
			標記v爲已遍歷;
			 DFS(u);
			恢復標記;
		}
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章