圖:由結點集合v和邊集合e構成,其中每條邊與兩個結點相交。
有向圖可以表示不對稱的關係
圖的例子:運輸網路,通訊網路,資訊網路,社會網路,依賴網路。
路徑與連通性:存在一條從u到v的路徑,稱乙個無向圖是連通的
如果對每兩個結點u與v,都存在一條從u到v的路徑和一條從v到u的路徑,我們說乙個有向圖是強連通的。
樹:乙個無向圖如果是連通的,且不包含乙個圈,我們就說它是一顆樹。
樹是最簡單的連通圖,刪除樹中的任意一條邊將使得它不再連通。
命題3.1每棵n個結點的樹恰好由n-1條邊。
定理3.2設g是具有n個結點的無向圖,下面任意兩個語句都可以推出第三個語句。
(i)g是連通的
(ii)g不包含乙個圖
(iii)g有n-1條邊。
s-t連通性問題也可以叫做迷宮求解問題。
1 寬度優先搜尋
確定s-t連通性最簡單的演算法——寬度優先搜尋(bfs)
定理3.3對每個j≥1,由bfs產生的層 lj 恰好由所有到s距離為j的結點組成,存在一條從s到t的路徑,當且僅當t出現在某個層中。
(層 lj 恰好是所有到s結點距離為j的結點的集合)
(bfs不僅確定了s可以達到的結點,也計算了他們的最短路徑)
定理3.4設t是一顆寬度優先搜尋樹,設x和y是t中分別屬於層 li 和 lj 的結點,並且設(x,y)是g的一條邊,那麼i與j至多差1。
探查乙個連通分支:
從始點s可達的結點,將把這個集合r看作g的包含s的連通分支。(可回答s-t連通性問題)
定理3.5在演算法結束產生的集合r恰好是g的包含s的連通分支。
2 深度優先搜尋
探查方式:盡可能深的前進並且只有必要的時候才撤退。
dfs——一般性分支擴張演算法的實現方式。可用遞迴形式表述。
命題3.6對於給定的遞迴呼叫dfs(u),在這次啟用和這個遞迴呼叫結束之間唄標記為「exprored」的所有的結點都是u在t中的後代。
定理3.7設t是一顆深度優先搜尋樹,x與y是t中的結點,且(x,y)是g中不屬於t的一條邊,那麼x或y之中乙個是另乙個的祖先。
定理3.8對圖中任兩個結點s與t,它們的連通分支或者相等, 或者不相交。
1 圖的表示
圖的兩種表示方式:鄰接矩陣與鄰接表(稀疏圖更有效)。
定理3.10乙個圖的鄰接矩陣表示需要o(n2)的空間,而鄰接表表示只需要o(m+n)的空間。
2 佇列與棧
佇列:先進先出 ——適用於bfs
棧:後進先出——適用於dfs
3 寬度優先搜尋的實現
bfs(s):
置discovered[s]
= true 且對所有其他的v,discovered[v]
= false
初始化l[
0]由單個元素s構成
置層計數器i=
0 置當前的bfs樹t=φ
while l[i] 不空
初始化乙個空表l[i+1]
for 每個結點u∈l[i]
考慮每條關聯到u的邊(u,v)
if discovered[v]
= false then
置discovered[v]
= true
把邊(u,v)加到樹t上
把v加到表l[i+1]
endif
endfor
層計數器++
endwhile
定理3.11如果圖是由鄰接表表示給出的,bfs演算法的上述實現將以o(m+n)時間(即以輸入規模的線性時間)執行
4 深度優先搜尋的實現
dfs(s):
初始化s為具有乙個元素s的棧
while s非空
從s中取乙個結點u
if explored[u]
=false then
置 explored[u]
= true
for 每條與u關聯的邊(u,v)
把v加到棧 s
endfor
endif
endwhile
定理3.12上述演算法在下面的意義上實現dfs:它按照與遞迴的dfs過程恰好相同的次序(除了每個鄰接表是按照相反的次序處理之外)訪問結點。
定理3.13如果圖是由鄰接表表示給出的,那麼上述dfs演算法的實現將以o(m+n)時間(即輸入規模的線性時間)執行。
二部圖:是乙個圖,其結點集v可以用下述方式劃分成集合x與y,每條邊的一端在x中而另一端在y中。
1 問題
定理3.14如果乙個圖是二部圖,那麼它不可能包含乙個奇圈。
問題:確定乙個圖是二部圖。
2 設計演算法
給結點著色,如結點s為紅色,則與s相鄰的結點必須著藍色
如果存在一條邊兩端顏色相同,則g不為二部圖
bfs —— 一層為藍一層為紅。
3 分析演算法
定理3.15設g是乙個連通圖,令l1,l2,……是由始於結點s的bfs所產生的層,那麼下面兩件事一定恰好成立其一:
(i)g中沒有邊與同一層的兩個結點相交,在這種情況下g是二部圖,其中偶數層的結點可以著紅色,奇數層結點可以著藍色。
(ii)g中有一條邊與同一層的兩個結點相交,在這種情況下,g包含乙個奇數長度的圈,且因此不可能是二部圖。
1 有向圖的表示
鄰接表2 圖搜尋演算法
與無向圖類似,可使用bfs、dfs
3 強連通性
命題3.16如果u和v是相互可達的,v和w是相互可達的,那麼u和w也是相互可達的。
命題3.17對有向圖中的任何兩個結點s和t,它們的強連通分支或者相等,或者不相交。
4 有向無圈圖與拓撲排序
無向圖沒有圈——樹
有向圖沒有圈——有向無圈圖(dag)
1) 問題
定理3.18如果g有乙個拓撲排序,那麼g是乙個dag。
**問題:**每個dag都有乙個拓撲排序嗎?怎樣有效找到乙個。(將證明對任務集上的任意五圈的優先關係,存在乙個有效計算的執行任務的次序)。
2) 設計與分析演算法
命題3.19在每個dag中,存在乙個沒有輸入邊的結點。
定理3.20如果g是乙個dag,那麼g有乙個拓撲排序。
拓撲排序:
計算g的拓撲排序:
找到乙個沒有進入邊的結點v並且將它排在第一
從g中刪除v
遞迴計算g-
的拓撲排序並把這個序接在v的後面
Apriori演算法學習筆記 三
apriori演算法的python實現from future import print function import pandas as pd 頻繁規則的產生 用於實現l 到c k的連線 deffind freq set x,ms x list map lambda i sorted i.spli...
設計模式學習筆記(三) 工廠模式
工廠模式的定義 假如你有乙個類a,要例項化這個類,最簡單的方法就是a a new a 如果要做一 些初始化的工作,通常會把這些操作寫在a的構造方法裡例如 a a new a parmeter 但是,也許有很多的初始化內容,如果把所有內容都放在建構函式裡面,就很不合適。在這種情境下就可以使用工廠模式,...
java 設計模式學習筆記三 Builder模式
設計模式 builder 將乙個複雜的物件構建與他的表示分離,使同樣的構建過程可以建立不同的表示 把建立和部件的建立分別開來 示例 部件實體 time 下午11 03 52 author retacn yue email zhenhuayue sina.com public inte ce part...