演算法設計學習筆記(三)

2021-10-08 23:39:20 字數 3724 閱讀 7727

:由結點集合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...