Download as pdf or txt
Download as pdf or txt
You are on page 1of 12

Outline

Overview of Graph
ELEMENTARY GRAPH ALGORITHMS 1 แนะนําโครงสร้างข้อมูลกราฟ
02204231 Data Structures and Algorithms I Representation of a Graph
2 การแทนกราฟในหน่วยความจํา
Graph Traversal Algorithms
3 การท่องไปในกราฟ
Graph Applications
4 การประยุกต์ใช้กราฟ

Computer Engineering, Kasetsart University Kamphaeng Sean Campus

Overview of Graph Overview of Graph


Graph Terminology
 กราฟ (Graph) เป็นโครงสร้างข้อมูลแบบไม่เชิงเส้น เช่นเดียวกับ  โหนด (Vertex) เก็บค่าข้อมูลหรือสมาชิกของกราฟ
โครงสร้างข้อมูลต้นไม้ (Tree) กราฟประกอบด้วย  เส้นเชื่อมของโหนด (Edge) โดยแต่ละเส้นเชื่อม e = (u,v)
o เซตของโหนด (Node) หรือจุด (Vertex) หมายถึง คู่ลําดับของ u และ v ที่แทนโหนดใดๆ ในกราฟที่มี
o เซตของเส้นเชื่อม (Edge) ระหว่างโหนด B เส้นเชื่อมโยงถึงกัน Edge
F G A B
A
G = (V, E) C โหนด โหนด
E
 ขนาดของกราฟ คือ จํานวนโหนดในกราฟ
D
V = {A,B,C,D,E,F,G}  ดีกรี (Degree) หมายถึง จํานวนเส้นเข้าและออก ของโหนดแต่ละโหนด
E = {AB,AC,AD,CD,CF,DE,EF,FG,EG} o In-degree/Out-degree (ชี้เข้าหา/ชี้ออกจากโหนด)
3 4
Overview of Graph Overview of Graph
Types of graphs
Graph Terminology
 โหนดประชิด (Adjacent Nodes) คือ กลุ่มโหนดที่มีเส้นเชื่อมถึงกัน  ประเภทกราฟตามลักษณะทิศทางของเส้นเชื่อม แบ่งเป็น 2 ลักษณะดังนี้
A กับ B ใช่ A กับ E ไม่ใช่ o กราฟแบบไม่มีทิศทาง (Undirected Graph) เส้นเชื่อม A ไป B
D กับ F ไม่ใช่ D กับ E ใช่ กราฟที่ไม่ระบุทิศทางของความสัมพันธ์ระหว่างสองโหนด เหมือนกันกับ
ใดๆ ซึ่งสามารถทําให้สามารถเดินทางไปมาระหว่างกันได้ B ไป A
 เส้ น ทาง (Path) ระหว่ า งสองโหนด คื อ A Edge B
ลํ า ดั บ ของโหนดที่ มี เ ส้ น เชื่ อ มต่ อ กั น จาก เส้นเชื่อม
โหนดต้นไปถึงโหนดปลาย o กราฟแบบมีทิศทาง (Directed Graph-Digraph)
เส้นทางจาก A  F P ={A,B,E,F} B ไป A
P2={A,B,C,E,F} กราฟที่เส้นเชื่อมมีทิศทางกํากับความสัมพันธ์ระหว่างสอง
1 เท่านั้น
P3={A,B,C,D,E,F} โหนดใดๆ A Arcs B
5 6

Overview of Graph Quick Check1


Types of graphs จงระบุจํานวน In-degree และ Out-degree ของแต่ละโหนดในกราฟต่อไปนี้
Node In-degree Out-Degree
A
I I
· 3 3

C 3 3
2 2
&
& &
E

# %
(

Node In-degree Out-Degree


I
A ·

I
Undirected Graph Directed Graph
(
·
2
%
C
2 ·
7 · 8

2 2
E
·
#
%
Overview of Graph Overview of Graph
Types of graphs Types of graphs

 ประเภทกราฟตามการกําหนดค่าของเส้นเชื่อม แบ่งเป็น 2 ลักษณะดังนี้ Unweighted
o กราฟแบบไม่มีน้ําหนัก (Unweighted Graph) & Undirected Graph
ไม่ ศ

กราฟที่ไม่มีการระบุข้อมูลหรือค่าบางอย่างของเส้นเชื่อมระหว่างโหนดใดๆ Unweighted
หรือ คิดว่าข้อมูลเหล่านั้นมีค่าเท่ากัน เช่น กราฟแผนการเรียนในหลักสูตร & Directed Graph
o กราฟแบบมีน้ําหนัก (Weighted/labeled Graph) ห นา ท ศท
Weighted
กราฟที่มีการระบุข้อมูลหรือค่าบางอย่างของเส้นเชื่อมระหว่างโหนดใดๆ เช่น & Directed Graph
ไม้ ศท
ถนนที่เชื่อมเมือง 2 เมืองพร้อมระบุระยะทางระหว่างเมือง ม

อาจเป็นกราฟแบบมีทิศทาง หรือ ไม่มีทิศทางก็ได้ Weighted


& Undirected Graph
9 10
ไ ่ ศ

Overview of Graph Representation of a Graph


Graph VS Tree
 ต้นไม้เป็นเซตย่อยของกราฟ  การสร้างกราฟด้วยอาเรย์ a b c d
a a 0 1 1 1 b
 โหนดในโครงสร้างข้อมูลต้นไม้ มีโหนดแม่ได้เพียงโหนดเดียวเท่านั้น แต่ Adjacency b 1 0 1 0
โหนดในโครงสร้างข้อมูลกราฟมีโหนดแม่ได้มากกว่าหนึ่งโหนด Matrix c 1 1 0 1
 บางโหนดในกราฟอาจะไม่มีเส้นเชื่อมไปยังโหนดอื่นก็ได้ d 1 0 1 0 c d
 การสร้างกราฟด้วยลิงค์ลิสต์
a b d c

b a c Adjacency
c d a b List
(1) Binary tree (2) Tree d a c
(3) Graph
11 12
มี
มีน้
มีนี้
ทิ
มี
ม่
ม่

มี
ทิ
ม่
มี
น้
น้
ที

ทิ
ทิ
Representation of a Graph Representation of a Graph
Adjacency Matrix 1 2 Adjacency Matrix
 การแทนกราฟด้วยเมตริกซ์ประชิด a b
1 2 3 4
เก็บข้อมูลความสัมพันธ์ของโหนด ในอาเรย์ 2 มิติ A ขนาด V * V (เมื่อ 1 0 1 1 1
พื้นที่หน่วยความจําที่ใช้:
V คือ จํานวนโหนด) โดยค่าของสมาชิกแต่ละตัวในอาเรย์ Aij เก็บค่าดังนี้ c d4 2 0 0 1 0
3 Unweighted
3 0 0 0 1 (V2)
A[i][j] = 0 เมื่อโหนด vi ไม่ประชิดกับโหนด vj & directed Graph 4 0 0 0 0 เค้อโหน
1 2
1 2 3 4
= w เมื่อโหนด vi ประชิดกับโหนด vj a b
1 0 1 1 1 เมตริกซ์สมมาตร
2 1 0 1 0 A = AT
กราฟแบบไม่มีน้ําหนัก w มีค่าเป็น 1 c d
3 1 1 0 1
กราฟแบบมีน้ําหนัก w เท่ากับค่าของเส้นเชื่อมระหว่างโหนด 3
Unweighted
4 4 1 0 1 0
13 14
& Undirected Graph

423

&- U Representation of a Graph Quick Check2


Adjacency Matrix จงแทนกราฟต่อไปนี้ด้วยเมตริกซ์ประชิด
A BCY
#

A E
-

A · 100 · อ

% I 0 ⑧
10 1
&
1 อ 1 1 อ
·
·10 1 0

& + 1 1 8 1
#

· ·. 7

A- B
Weighted
& Undirected Graph
จะหาว่ามีเส้นเชื่อมระหว่าง B -E

ห โหนดใดๆ ได้อย่างไร ใช้เวลา?


แถว
B- C

โดยการอ้างอาเรย์ที่ A[i][j] B- A

จะหาค่าดีกรีในแต่ละโหนด ได้อย่างไร ่า กร ์ในแแ


·C1
ใช้เวลา ………… ค
ละโหนด
จา
นนจ น นว วน ไ 15 16
สมา กใ ในแ ราว Lu เค
ทก หน
ท าไม่เ นใ เ
ดี
นิ
ดู
ที่
ที่มี
ช้

ค่
ลั
ต่
ป็
ค่

ชิ
Quick Check2 Representation of a Graph
จงแทนกราฟต่อไปนี้ด้วยเมตริกซ์ประชิด Adjacency List
A B & D E
=

 การแทนกราฟด้วยรายการประชิด
A * อ

· ·
&
& I
·

·
&

1
·
ใช้โครงสร้างของลิงค์ลิสต์มาเก็บข้อมูลความสัมพันธ์ของกราฟ
· · ·
· & 1 0
o ใช้อาเรย์ของลิงค์ลิสต์ในการเก็บข้อมูล โดยสมาชิกแต่ละตัวใน
1 ·อ ·.

Eอ · 0 1 0/
อาเรย์ V[i] จะเก็บพอยน์เตอร์ที่อ้างอิงไปยังลิงค์ลิสต์สําหรับเก็บ
#

& · · · ·
โหนดประชิดของแต่ละโหนดในกราฟ 0
1
แต่ละโหนดมี หนึ่งลิงค์ลิสต์
2

V-1
17 18

Representation of a Graph Representation of a Graph


Adjacency List
Adjacency List
a b b d c Weighted
a
& Undirected Graph

c d
b c
พื้นที่หน่วยความจําที่ใช้:
Unweighted c d (V+E)
& directed Graph d
a b a b d c

a c
b
c d c d a b
Unweighted
& Undirected Graph
d a c
19 20
Quick Check3 Representation of a Graph
จงแทนกราฟต่อไปนี้ด้วยรายการประชิด Adjacency Matrix vs Adjacency List

-htEpntertainerAt
A
 พื้นที่หน่วยความจําที่ใช้ (Usage Space)
o Adjacency Matrix: (V2)
เหมาะกับกราฟที่มีเส้นเชื่อมจํานวนมาก (dense graph), |E|  |V |2
-L
o Adjacency List: (V+E)
เหมาะกับกราฟที่มีเส้นเชื่อมจํานวนน้อยๆ (sparse graph), |E| << |V |2

21 22

Representation of a Graph Representation of a Graph


Adjacency Matrix vs Adjacency List Adjacency Matrix vs Adjacency List
a b g a b c d e f g h i j  เวลาในการตรวจสอบว่ามีเส้นเชื่อม ระหว่างคู่โหนดหรือไม่
a
b d /
b
c f /
a
b
1
1
1
1 (Time for determining edge)
d c f h c
a d e / c 1
d e / d
1 1
1
o Adjacency Matrix: O(1)
↓ e
e j i f
null
c /
e
f 1
โดยการเข้าถึงสมาชิกในอาเรย์ A[i][j], i และ j แทนหมายเลขโหนด
แทนกราฟนี้ด้วยวิธีไหนดี g
h
f h / g 1 1 ที่ต้องการพิจารณา
Adjacency Matrix f j / h 1 1

/ Adjacency List
i h / i
j
1
1
o Adjacency List: O(degree (vi))
j i /
โดยการท่องไปลิงค์ลิสต์ของโหนด ที่ต้องการตรวจสอบ

- อ
แราว ต

23 24
ดู
สั
Representation of a Graph Representation of a Graph
Adjacency Matrix vs Adjacency List Adjacency Matrix vs Adjacency List
 เวลาในการเพิ่ม/ลบโหนด (Insert/Remove vertex)  เวลาในการเพิ่ม/ลบเส้นเชื่อมระหว่างโหนด (Insert/Remove edge)
o Adjacency Matrix: o Adjacency Matrix:
- เพิ่มท้ายแถว และท้ายคอลัมภ์ในอาเรย์ และให้ค่าเริ่มต้นเป็น 0 ·Cr กําหนดค่าสมาชิกในอาเรย์ A[i][j] ให้เท่ากับ w (การเพิ่ม)/เท่ากับ 0 (การลบ)
- ลบแถวและคอลัมภ์ในอาเรย์ (มีการเลื่อนแถว/คอลัมภ์อื่นมาแทน) ·Cut
o Adjacency List:
o Adjacency List: - เพิ่มโหนดประชิด (Node j) ที่……….ลิงค์ลิสต์
- เพิ่มโหนดท้าย อาเรย์ของลิงค์ลิสต์ 0C1) ของโหนดต้นทาง (Node i)
- ลบอาเรย์ของลิงค์ลิสต์ (มีการเลื่อนโหนดอื่นมาแทน) - ท่องไปในลิงค์ลิสต์ของโหนดที่ต้องการลบ (Node i)
และการจัดการพอยน์เตอร์ เพื่อค้นหาโหนดที่จะลบเส้นเชื่อม (Node j) และทําการลบลิงค์ลิสต์
1 1 · I + 1 °


· -

-ออ
25 26

·'อ
" ·

%
·

·ออ

Graph Traversal Algorithms Graph Traversal Algorithms


 การท่องเข้าไปในกราฟ สามารถทําได้ 2 วิธี ใช้ stack
ช่วยในการท่องกราฟ  เพื่อป้องกันไม่ให้มีการเยือนโหนดที่เคยเยือนไปแล้ว แต่ละโหนด
1. แนวลึก : Depth-first Traversal ใช้ queue ในกราฟจะมีค่า status ที่บอกถึงสถานะของโหนด ดังนี้
2. แนวกว้าง : Breath-first Traversal ช่วยในการท่องกราฟ
Status ความหมาย รายละเอียด
 การท่องเข้าไปในกราฟ คือการเข้าถึง/เยือน (Visit) แต่ละโหนดในกราฟ
o โดยจะท่องเข้าไปเฉพาะโหนดที่มีการเชื่อมโยงกันเท่านั้น 1 ค่าเริ่มต้น (Ready) โหนดยังไม่ถูกเยือน
o แต่ละโหนดจะถูกเยือนเพียงครั้งเดียว 2 ระหว่างดําเนินการ โหนดอยู่ใน queue/stack
สําหรับการท่องไปในต้นไม้นั้นแต่ละโหนดจะมีเส้นทางเดียว แต่ในกราฟเส้นทาง (Waiting) รอการดําเนินการเพื่อเยือน
ระหว่างโหนดอาจจะมีหลายเส้นทาง ดังนั้นเพื่อป้องกันการเยือนโหนดที่ซ้ําจึง
จําเป็นต้องทําเครื่องหมายกํากับว่าได้เยือนเสร็จเรียบร้อยแล้ว เพื่อไม่ให้เข้าไปเยือนอีก 3 เยือนแล้ว (Processed) โหนดถูกเยือนแล้ว
27 28
Graph Traversal Algorithms Graph Traversal Algorithms
Depth-first Traversal Depth-first Traversal
 การท่องกราฟแนวลึกก่อน: เป็นการท่องกราฟจากโหนดเริ่มต้น แล้วเยือน  ขั้นตอนหลัก
โหนดประชิด (Adjacency Nodes) ของโหนดเริ่มต้น ในแนวลึกลงไปเรื่อยๆ 0. กําหนด status เริ่มต้นของทุกโหนดให้มีค่าเป็น 1
ทําต่อไปจนกระทั่งไม่มีโหนดประชิด จึงย้อนกลับมายังโหนดก่อนหน้า และเข้า 1. Push โหนดเริ่มต้นในสแตค และ เปลี่ยน status เป็น 2
เยือนโหนดอีกด้านด้วยรูปแบบเดียวกันจนครบ เทียบได้กับการท่องเข้าไปใน 2. Pop โหนดออกจากสแตค
ต้นไม้แบบก่อนลําดับ(Preorder) A มาประมวลผล และเปลี่ยน status เป็น 3
A–B–E -F–G–C–D–H–I-J 3. Push โหนดประชิดทั้งหมดของ โหนดในข้อ 2 ที่มี status=1
B C D ในสแตค และ เปลี่ยน status เป็น 2
E F G H I J
4. ทําซ้ําข้อ 2-3 จนกว่าจะครบทุกโหนดและ สแตคว่าง
29 30

Graph Traversal Algorithms Graph Traversal Algorithms


Depth-first Traversal Depth-first Traversal
Step 0: SET STATUS = 1 (ready state) for each node in G A X H P E Y M J G

Step 1: Push the starting node on the stack and set its STATUS = 2 Status: 1
3
2 1
2 1 1 1 1 1 1 1

(waiting state)
Step 2: while stack is not empty
2.1 Pop the top node N.
Process it and set its STATUS = 3 (processed state)
2.2 Push on the stack all the adjacency nodes of N that are in Push โหนด A ในสแตค Pop โหนด A ออกจากสแตค A
the ready state (whose STATUS = 1) and set their STATUS = 2 Push โหนดประชิดของ A (status=1) ลงสแตค
(waiting state) X

31 32

Ant
Graph Traversal Algorithms Graph Traversal Algorithms
Depth-first Traversal Depth-first Traversal
A X H P E Y M J G A X H P E Y M J G
Status: 3 3
2 1
2 1 1 1 1 1 12 Status: 3 3 2
3 1
23 1
2 1 1 1 2

Pop โหนด X ออกจากสแตค A-X Pop โหนด H ออกจากสแตค A-X-H -P X,G,P,E


Push โหนดประชิดของ X (status=1) ลงสแตค Push โหนดประชิดของ H (status=1) ลงสแตค
H,G Pop โหนด P ออกจากสแตค H,G
33
Push โหนดประชิดของ P (status=1) ลงสแตค 34

Graph Traversal Algorithms Graph Traversal Algorithms


Depth-first Traversal Depth-first Traversal
A X H P E Y M J G A X H P E Y M J G
Status: 3 3 3 3 1
3 1
3
2 1
2 1 2 Status: 3 3 3 3 3 3 3
2 1
3
2 2
3

Y,,J
Pop โหนด E ออกจากสแตค H,Y,M Pop โหนด M ออกจากสแตค
A-X-H-P-E -Y A-X-H-P-E-Y-M -J -G
Push โหนดประชิดของ E (status=1) ลงสแตค Push โหนดประชิดของ M (status=1) ลงสแตค
Pop โหนด Y ออกจากสแตค E, M Pop โหนด J ออกจากสแตค M
Push โหนดประชิดของ Y (status=1) ลงสแตค Push โหนดประชิดของ J (status=1) ลงสแตค
35 36
Graph Traversal Algorithms Graph Traversal Algorithms
Breath-first Traversal Breath-first Traversal
 การท่องกราฟแนวกว้างก่อน: วิธีนี้ทําโดยเลือกโหนดที่เป็นจุดเริ่มต้น  ขั้นตอนหลัก
ต่อมาให้เยือนโหนดประชิดกับโหนดเริ่มต้นทีละตัวจนครบ แล้วจึงมาตั้ง 0. กําหนด status เริ่มต้นของทุกโหนดให้มีค่าเป็น 1
ต้นที่โหนดประชิดแรกที่เยือนไปแล้วเพื่อเริ่มเยือนโหนดประชิดของโหนด 1. Enqueue โหนดเริ่มต้นในคิว และ เปลี่ยน status เป็น 2
นั้นในลักษณะเดิมอีก การท่องในแบบนี้จึงเป็นเสมือนกับการกวาดเยือน 2. Dequeue โหนดออกจากคิว
โหนดในแนวกว้างตามชื่อวิธีการท่อง มาประมวลผล และเปลี่ยน status เป็น 3
A
A–B–C–D–E–F–G–H–I-J 3. Enqueue โหนดประชิดทั้งหมดของ โหนดในข้อ 2 ที่มี status=1
B C D
ในคิว และ เปลี่ยน status เป็น 2
4. ทําซ้ําข้อ 2-3 จนกว่าจะครบทุกโหนดและคิวว่าง
E F G H I J
37 38

Graph Traversal Algorithms Graph Traversal Algorithms


Breath-first Traversal Breath-first Traversal
Step 0: SET STATUS = 1 (ready state) for each node in G A X H P E Y M J G

Step 1: Enqueue the starting node and set its STATUS = 2 Status: 1
3
2 3
1
2 12 1 1 1 1 1 1
2

(waiting state)
Step 2: while Queue is not empty A -X
2.1 Dequeue a node N.
Process it and set its STATUS = 3 (processed state)
2.2 Enqueue all the adjacency nodes of N that are in the ready Enqueue โหนด A X G,H
state (whose STATUS = 1) and set their STATUS = 2 Dequeue ,Enqueue โหนดประชิดของ A (status=1) ในคิว
(waiting state) Dequeue ,Enqueue โหนดประชิดของ X
39
(status=1) ในคิว 40
Graph Traversal Algorithms Graph Traversal Algorithms
Breath-first Traversal Breath-first Traversal
A X H P E Y M J G A X H P E Y M J G
Status: 3 3 3
2 1
2 1
2 1 1 1 3
2 Status: 3 3 3 2
3 3
2 1
2 1
2 1 3

A-X-G -H A-X-G-H -P -E
X,H,P G,H
H,M,Y
Dequeue ,Enqueue โหนดประชิดของ G (status=1) ในคิว X,G,P,E Dequeue ,Enqueue โหนดประชิดของ P (status=1) ในคิว
Dequeue ,Enqueue โหนดประชิดของ H Dequeue ,Enqueue โหนดประชิดของ E
(status=1) ในคิว (status=1) ในคิว
41 42

Graph Traversal Algorithms Graph Traversal Algorithms


Breath-first Traversal Analysis of Depth-first & Breath-first Traversal
A X H P E Y M J G
ขั้นตอนวิธีในการท่องไปในกราฟ ทั้ง 2 แบบ แบ่งเป็น
Status: 3 3 3 3 3 2
3 3
2 3
2
1 3
 การกําหนดค่าเริ่มต้น status ในแต่ละโหนด
 การวนลูปเยือนโหนด
·
degree ios
OE

A-X-G-H-P-E -M -Y -J
 หาโหนดประชิดของแต่ละโหนดในกราฟ  จํานวนเส้นเชือ่ ม
E,Y,J
Dequeue ,Enqueue โหนดประชิดของ M (status=1) ในคิว E,M ทั้งหมดในกราฟ
Dequeue ,Enqueue โหนดประชิดของ Y  การดําเนินการ push/pop stack หรือ enqueue/dequeue
(status=1) ในคิว = …………..
OC1

Dequeue Time complexity: ~+ E

43 44
หู
Graph Applications Summary
 กราฟถูกนําไปประยุกต์ใช้ในการแก้ปัญหาหลายปัญหา  กราฟ (Graph) เป็นโครงสร้างในการเก็บข้อมูลแบบไม่เป็นเชิงเส้น
o การหาเส้นทางที่สั้นที่สุดระหว่างจุด 2 จุดในกราฟ (Shortest Path) o กราฟเป็นโครงสร้างที่เก็บการเชื่อมความสัมพันธ์ระหว่างสองโหนด
 Dijkstra’s algorithm การเชื่อมต่อของสายการบิน o กราฟแบ่งตามทิศทางของเส้นเชื่อม ได้แก่ มีทิศทาง และไม่มีทิศทาง
 การแทนกราฟในคอมพิวเตอร์ มี 2 วิธี
o การหาเส้นทางที่สั้นที่สุดเพื่อเชื่อมต่อแต่ละโหนด
o Adjacency Matrix เหมาะกับ dense graph
ในกราฟ (Minimum Spanning Tree)
 Prim’s algorithm o Adjacency List เหมาะกับ sparse graph
 Kruskal’s algorithm  การท่องไปในกราฟ มี 2 วิธี
การนําไปใช้ เช่น การเดินสายเชื่อมต่อระบบ o Depth-first transversal - ใช้ Stack ช่วยในการท่องกราฟ
เครือข่ายคอมพิวเตอร์ หรือการเดินสายโทรศัพท์ o Breath-first transversal - ใช้ Queue ช่วยในการท่องกราฟ
45 46

You might also like