dfs和bfs


1.dfs(深度優先搜索)是兩個搜索中先理解並使用的,其實就是暴力把所有的路徑都搜索出來,它運用了回溯,保存這次的位置,深入搜索,都搜索完了便回溯回來,搜下一個位置,直到把所有最深位置都搜一遍,要注意的一點是,搜索的時候有記錄走過的位置,標記完后可能要改回來;

回溯法是一種搜索法,按條件向前搜索,以達到目標。但當探索到某一步時,發現原先選擇達不到目標,就退回一步重新選擇,這種走不通就退回再走的技術為回溯法;

例如這張圖,從1開始到2,之后到5,5不能再走了,退回2,到6,退回2退回1,到3,一直進行;

理解這種方法比較簡單,難的是要怎么用

void dfs(int deep)
{
	int x=deep/n,y=deep%n;
	if(符合某種要求||已經不能在搜了)
	{
		做一些操作;
		return ;
	}
	if(符合某種條件且有地方可以繼續搜索的)//這里可能會有多種條件,可能要循環什么的
	{
		a[x][y]='x';//可能要改變條件,這個是瞎寫的
	        dfs(deep+1,sum+1);//搜索下一層
		a[x][y]='.';//可能要改回條件,有些可能不用改比如搜地圖上有多少塊連續的東西
	}
}

2.bfs(寬度/廣度優先搜索),這個一直理解了思想,不會用,后面才會的,思想,從某點開始,走四面可以走的路,然后在從這些路,在找可以走的路,直到最先找到符合條件的,這個運用需要用到隊列(queue),需要稍微掌握這個才能用bfs。


一張圖,bfs就是和它類似,很好的幫助理解,雷從上往下,同時向四面八方的延長(當然不是很嚴謹的),然后找到那個最近的建築物,然后劈了它;

還是這張圖,從1開始搜,有2,3,4幾個點,存起來,從2開始有5,6,存起來,搜3,有7,8,存起來,搜4,沒有了;現在開始搜剛剛存的點,從5開始,沒有,然后搜6.。。一直進行,直到找到;

int visit[N][N]//用來記錄走過的位置
int dir[4][2]={0,-1,0,1,-1,0,1,0};
struct node
{
	int x,y,bits;//一般是點,還有步數,也可以存其他的
};
queue<node>v;
void bfs1(node p)
{
	node t,tt;
	v.push(p);
	while(!v.empty())
	{
		t=v.front();//取出最前面的
		v.pop();//刪除
		if(找到符合條件的)
		{
			做記錄;
			while(!v.empty()) v.pop();//如果后面還需要用,隨手清空隊列
			return;
		}
		visit[t.x][t.y]=1;//走過的進行標記,以免重復
		rep(i,0,4)//做多次查找
		{
			tt=t;
			tt.x+=dir[i][0];tt.y+=dir[i][1];//這里的例子是向上下左右查找的
			if(如果這個位置符合條件)
			{
				tt.bits++;//步數加一
				v.push(tt); //把它推入隊列,在后面的時候就可以用了
			}
		}
	}
}

3.dfs和bfs的區別

其實有時候兩個都可以用,不過需要其他的東西來記錄什么的,各自有各自的優勢

bfs是用來搜索最短徑路的解法是比較合適的

比如求最少步數的解,最少交換次數的解,最快走出迷宮等等,因為bfs搜索過程中遇到的第一個解一定是離最初位置最近的,所以遇到第一個解,一定就是最優解,此時搜索算法可以終止
而如果用dfs,會搜一些其他的位置,需要花相對比較多的時間,需要搜很多次,然后如果找到還不一定是最優解,還要記錄這次找的位置,與之后找到的答案進行比較,看看誰才是最優解,這樣就比較麻煩

dfs應用比較廣泛,用起來比較簡單原答案:適合搜索全部的解 。。現在看來比較蠢,其實也沒有很適合,只是我當初比較會用dfs而已,來着其實是一樣的

如果要搜索全部的解,在記錄路徑的時候會簡單一點,只需要把每一次找的點,放進去答案中就好;並且,相對而言dfs在做很多題目可以用上,比如分治、數位dp,其實就是遞歸啦,而bfs用的比較少。因為我做的題目比較少,沒遇見
原答案:因為要搜索全部的解,在記錄路徑的時候也會簡單一點,而bfs搜索過程中,遇到離根最近的解,並沒有什么用,也必須遍歷完整棵搜索樹。

bfs是浪費空間節省時間,dfs是浪費時間節省空間。

因為dfs要走很多的路徑,可能都是沒用的,(做有些題目的時候要進行剪枝,就是確定不符合條件的就可以結束,以免浪費時間,否則有些題目會TLE);
而bfs可以走的點要存起來,需要隊列,因此需要空間來儲存,便是浪費了空間,假設有十層,各個結點有2個子節點,那么儲存到第10層就要存 2^10-1 個數據,而dfs只需要存10個數據,但是找到答案的速度相對快一點。

稍微理解之后就可以了,不一定要糾結怎么用,先去做題目,很多都是做着就突然明白怎么用了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM