演算法強化 BFS和DFS

2021-10-04 01:31:46 字數 3223 閱讀 2546

演算法過程:

1.首先將根節點放入佇列中

2.從佇列中取出第乙個節點,進行訪問,並將其所有未訪問過的鄰居加入佇列彙總

3.若隊列為空,則演算法結束

時間複雜度

不確定,|v|代表節點數量,|e|代表邊的數量

鄰接表表示時,查詢所有頂點的鄰接點所需時間為o(|e|),訪問頂點的鄰接點所花時間為o(|v|),總的時間複雜度為o(|v|+|e|)

鄰接矩陣表示時,查詢每個頂點的鄰接點所需時間為o(|v|),要查詢整個矩陣,故總的時間度為o(|v|^2)

給定正整數n,找到若干個完全平方數(比如1,4,9,16,…)使得他們的和等於n,你需要讓組成和的完全平方數的個數最少。

示例1輸入n= 12

輸出3解釋 12= 4+4+4

示例2輸入 n= 13

輸出2解釋 13 = 4+9

對問題建模:

整個問題轉化為乙個圖論問題。

從n到0,每個數字表示乙個節點;

如果兩個數字x到y相差乙個完全平方數,則連線一條邊。

我們得到乙個無權圖。

原問題轉化成,求這個無權圖中從n到0的最短路徑

比如 4->3->2->1->0

4->0

class

node()

:def

__init__

(self,value,passed =0)

: self.val = value

self.passed = passed

class

solution()

:def

numsquares

(self,n)

:# 根節點放入佇列中

queue =

[node(n)

] visited =[0

]*n+[1

]while queue:

x = queue.pop(0)

i =1while

true

: temp = x.val - i*i

if temp<0:

break

if temp ==0:

return x.passed+1if

not visited[temp]:1

))visited[temp]=1

i +=

1

演算法過程(非遞迴):

1.首先將根節點放入stack中

2.從stack中取出第乙個節點進行訪問,將它某乙個未訪問過的鄰居加入stack中

3.重複2

4.如果不存在未訪問過的鄰居,將上一級節點加入stack中,重複步驟2

5.若stack為空,表示遍歷結束

遞迴:遞迴終止條件:所有鄰居都被訪問過或者找到需要尋找的節點

遞迴過程:對當前節點的所有未被訪問過的鄰居進行遞迴

時間複雜度與bfs相同

給定乙個包含了一些0 1的費控二維陣列grid,乙個島嶼是由四個方向(水平或垂直)的1(表示土體)構成的組合。你可以假設二維陣列矩陣的四個邊緣都被水包圍著。

找到給定的二維陣列中最大的島嶼面積(如果沒有,則返回面積為0)

[[0,0,1,0,0,0,0,1,0,0,0,0,0],

[0,0,0,0,0,0,0,1,1,1,0,0,0],

[0,1,1,0,1,0,0,0,0,0,0,0,0],

[0,1,0,0,1,1,0,0,1,0,1,0,0],

[0,1,0,0,1,1,0,0,1,1,1,0,0],

[0,0,0,0,0,0,0,0,0,0,1,0,0],

[0,0,0,0,0,0,0,1,1,1,0,0,0],

[0,0,0,0,0,0,0,1,1,0,0,0,0]]

對於上面給定矩陣應返回6,不是11

分析:圖中的每塊陸地(標誌為1的地方)都可以當做乙個節點,兩個1上下貨左右相連視為一條邊

那麼二維陣列可以建模成很多圖

對二維陣列進行遍歷,如果是1,則執行圖的基礎遍歷演算法dfs(bfs),並記錄訪問標誌

注意:在dfs或者bfs中都要注意,當乙個子圖遍歷完成後檢查是否還有未訪問節點,並隨機選擇未訪問節點進行遍歷。

class

solution

:def

maxareaofisland

(self,grid):if

len(grid)==0

:return

0 row , column =

list

.en(grid[0]

),len(grid)

visited =[[

0]*row for _ in

range

(column)

] r =

0for i in

range

(column)

:for j in

range

(row)

:if visited[i]

[j]==

0and grid[i]

[j]==1:

# 向下向左右

area =[0

] self.dfs(i,j,grid,visited,area)

if r : r = area[0]

return r

defdfs(self,i,j,grid,visited,area)

:if i<

0or i >=

len(grid)

or j<

0or j >=

len(grid[0]

):return

if grid[i]

[j]==

0or visited[i]

[j]==1:

return

visited[i]

[j]=

1 area[0]

+=1self.dfs(i-

1,j,grid,visited,area)

self.dfs(i+

1,j,grid,visited,area)

self.dfs(i, j-

1, grid, visited, area)

self.dfs(i, j+

1, grid, visited, area)

DFS和BFS演算法

本質區別 bfs 的重點在於佇列,而 dfs 的重點在於遞迴。這是它們的本質區別。dfs 演算法 是一種利用遞迴 實質上是用棧來儲存未訪問的結點,先進後出 實現的搜尋演算法,直到找到解或走不下去為止。簡單來說,其搜尋過程和 不撞南牆不回頭 樹的先序遍歷 類似。bfs演算法 是一種利用佇列 用佇列來儲...

DFS和BFS演算法

一 深度優先遍歷 深度優先搜尋,是圖論中的經典演算法。其利用深度優先搜尋演算法可以產生目標圖的相應拓撲排序表,利用拓撲排序表可以方便的解決很多相關的圖論問題,如最大路徑問題等等。遞迴定義 圖的深度優先遍歷類似於樹的前序遍歷。採用的搜尋方法的特點是盡可能先對縱深方向進行搜尋。這種搜尋方法稱為深度優先搜...

演算法 dfs和bfs的演算法實現

bfs主要應用於連通圖的遍歷,它的核心思想是從乙個頂點開始,輻射狀地優先遍歷其周圍較廣的區域,即逐層遍歷,bfs最經典的應用場景為最短路徑,很多最短路徑演算法都是基於bfs實現,bfs通常基於佇列的思想實現,其實現過程如下 1 頂點入佇列 2 隊列為空,演算法結束,佇列非空,演算法繼續執行 3 出佇...