圖在解決許多重要的數(shù)學(xué)難題中是非常有用的數(shù)據(jù)結(jié)構(gòu)。 例如計算機(jī)網(wǎng)絡(luò)拓?fù)浠蚍治龌瘜W(xué)化合物的分子結(jié)構(gòu)。 它們還用于城市交通或路線規(guī)劃,甚至用于人類語言和語法。 所有這些應(yīng)用程序都有遍歷圖的共同挑戰(zhàn),并確保圖的所有節(jié)點(diǎn)都被訪問。 有兩種常見的已建立的方法來進(jìn)行這種遍歷,下面將對其進(jìn)行描述。
也稱為深度優(yōu)先搜索(DFS),該算法使用堆棧記住在任何迭代中發(fā)生死角時開始搜索的下一個頂點(diǎn)。 使用設(shè)置的數(shù)據(jù)類型在python中實現(xiàn)DFS圖,因為它們提供了跟蹤訪問和未訪問節(jié)點(diǎn)所需的功能。
參考以下代碼的實現(xiàn) -
class graph:
def __init__(self,gdict=None):
if gdict is None:
gdict = {}
self.gdict = gdict
# Check for the visisted and unvisited nodes
def dfs(graph, start, visited = None):
if visited is None:
visited = set()
visited.add(start)
print(start)
for next in graph[start] - visited:
dfs(graph, next, visited)
return visited
gdict = { "a" : set(["b","c"]),
"b" : set(["a", "d"]),
"c" : set(["a", "d"]),
"d" : set(["e"]),
"e" : set(["a"])
}
dfs(gdict, 'a')
執(zhí)行上面示例代碼,得到以下結(jié)果 -
a
b
d
e
c
也稱為廣度優(yōu)先搜索(BFS),該算法使用隊列記住當(dāng)任何迭代中發(fā)生死角時,獲取下一個頂點(diǎn)以開始搜索。
我們使用之前討論的隊列數(shù)據(jù)結(jié)構(gòu)在python中實現(xiàn)BFS。 當(dāng)繼續(xù)訪問相鄰的未訪問節(jié)點(diǎn)并繼續(xù)將其添加到隊列中。然后,開始只出現(xiàn)沒有未訪問節(jié)點(diǎn)的節(jié)點(diǎn)。 當(dāng)沒有下一個相鄰節(jié)點(diǎn)被訪問時,停止程序。
參考以下代碼的實現(xiàn) -
import collections
class graph:
def __init__(self,gdict=None):
if gdict is None:
gdict = {}
self.gdict = gdict
def bfs(graph, startnode):
# Track the visited and unvisited nodes using queue
seen, queue = set([startnode]), collections.deque([startnode])
while queue:
vertex = queue.popleft()
marked(vertex)
for node in graph[vertex]:
if node not in seen:
seen.add(node)
queue.append(node)
def marked(n):
print(n)
# The graph dictionary
gdict = { "a" : set(["b","c"]),
"b" : set(["a", "d"]),
"c" : set(["a", "d"]),
"d" : set(["e"]),
"e" : set(["a"])
}
bfs(gdict, "a")
執(zhí)行上面示例代碼,得到以下結(jié)果 -
a c b d e