data structure lesson15

18
!"# แผนการสอนประจําบทเรียน รายชื ่ออาจารยผู จัดทํา อนงคนาฏ ศรีวิหค ตอนที่ 15.1 อัลกอริทึมวิถีสั้นที่สุด (1 คาบ) เรื ่องที 15.1.1 อัลกอริทึมวิถีสั ้นที ่สุด เรื ่องที 15.1.2 การคํานวณวิถีสั ้นที ่สุด ตอนที่ 15.2 การแทนกราฟดวยลิงกลิส (1 คาบ) เรื ่องที 15.2.1 การแทนกราฟดวยลิงกลิสประชิด เรื ่องที 15.2.2 การแทนกราฟดวยลิงกลิสหลายมิติ ตอนที่ 15.3 การแวะผานกราฟ (1 คาบ) เรื ่องที 15.3.1 การแวะผานกราฟแนวกวาง เรื ่องที 15.3.2 การแวะผานกราฟแนวลึก แนวคิด 1. อัลกอริทึมที่ใชคํานวณวิถีที่สั้นที่สุดของกราฟนั้นมีแนวคิดมาจากอัลกอริทึมสของวอรแชลซึ่งใช หลักการของทราซิทีฟโคลสเชอร 2. การคํานวณวิถีที ่สั ้นที ่สุดของกราฟอาจทําไดโดยแทนกราฟดวยเมทริกซและนําอัลกอริทึมสของ วอรแชลมาใช 3. การเก็บกราฟไวในลิงกลิสแบบประชิดและลิงกลิสหลายมิติ เปนการเก็บรายชื ่อบัพทุกบัพของ กราฟ และขอมูลของอารกที่เชื่อมระหวางบัพในกราฟ 4. สามารถแทนกราฟไวในลิงกลิสไดทั้งแบบระบุทิศทางและไมระบุทิศทาง 5. การเขาถึงขัอมูลที่เก็บอยูในกราฟสามารถทําไดโดยการแวะผานบัพที่อยูในกราฟ 6. การแวะผานกราฟสามารถทําได 2 วิธีคือ การแวะผานกราฟแนวกวาง และ การแวะผานกราฟ แนวลึก 7. การแวะผานกราฟแนวกวางกระทําไดโดยการแวะไปที่บัพทุกบัพในระดับเดียวกันจนครบทุกบัพ แลวจึงแวะผานไปที่บัพในระดับถัดไป 8. การแวะผานกราฟแนวลึกกระทําไดโดยการแวะไปที ่บัพละระดับโดยกําหนดวิถีแรกจากรากลง ไปที่ใบและอีกวิถีหนึ่งจากรากไปที่ใบจนกระทั่งมีการแวะผานหมดทุกบัพ

Upload: suhatt-jantorn

Post on 24-Mar-2016

212 views

Category:

Documents


0 download

DESCRIPTION

ตอนที่ 15.3 การแวะผานกราฟ (1 คาบ) เรื่องที่ 15.3.1 การแวะผานกราฟแนวกวาง เรื่องที่ 15.3.2 การแวะผานกราฟแนวลึก แผนการสอนประจําบทเรียน รายชื่ออาจารยผูจัดทํา อนงคนาฏ ศรีวิหค ประเมินผล 1. ประเมินผลจากกิจกรรมที่ทํา 2. ประเมินผลจากคําถามทายบทเรียน เอกสารประกอบการสอน 1. เอกสารชุดวิชา หัวเรื่อง เรื่องที่ 15.1.1 อัลกอริทึมวิถีที่สั้นที่สุด เรื่องที่ 15.1.2 การคํานวณวิถีที่สั้นที่สุด ใน

TRANSCRIPT

!"#

แผนการสอนประจําบทเรียน

รายช่ืออาจารยผูจัดทํา อนงคนาฏ ศรีวิหค

ตอนที ่15.1 อัลกอริทึมวิถีสั้นที่สุด (1 คาบ) เร่ืองท่ี 15.1.1 อัลกอริทึมวิถีส้ันท่ีสุด เร่ืองท่ี 15.1.2 การคํานวณวิถีส้ันท่ีสุด

ตอนที ่15.2 การแทนกราฟดวยลิงกลิส (1 คาบ) เร่ืองท่ี 15.2.1 การแทนกราฟดวยลิงกลิสประชิด เร่ืองท่ี 15.2.2 การแทนกราฟดวยลิงกลิสหลายมิติ

ตอนที ่15.3 การแวะผานกราฟ (1 คาบ) เร่ืองท่ี 15.3.1 การแวะผานกราฟแนวกวาง เร่ืองท่ี 15.3.2 การแวะผานกราฟแนวลึก

แนวคดิ 1. อัลกอริทึมที่ใชคํานวณวิถีที่สั้นที่สุดของกราฟนั้นมีแนวคิดมาจากอัลกอริทึมสของวอรแชลซึ่งใชหลักการของทราซิทีฟโคลสเชอร

2. การคํานวณวิถีท่ีส้ันท่ีสุดของกราฟอาจทําไดโดยแทนกราฟดวยเมทริกซและนําอัลกอริทึมสของวอรแชลมาใช

3. การเก็บกราฟไวในลิงกลิสแบบประชิดและลิงกลิสหลายมิติ เปนการเก็บรายช่ือบัพทุกบัพของกราฟ และขอมูลของอารกที่เชื่อมระหวางบัพในกราฟ

4. สามารถแทนกราฟไวในลิงกลิสไดทั้งแบบระบุทิศทางและไมระบุทิศทาง 5. การเขาถึงขัอมูลที่เก็บอยูในกราฟสามารถทําไดโดยการแวะผานบัพที่อยูในกราฟ 6. การแวะผานกราฟสามารถทําได 2 วิธีคือ การแวะผานกราฟแนวกวาง และ การแวะผานกราฟแนวลึก

7. การแวะผานกราฟแนวกวางกระทําไดโดยการแวะไปที่บัพทุกบัพในระดับเดียวกันจนครบทุกบัพแลวจึงแวะผานไปที่บัพในระดับถัดไป

8. การแวะผานกราฟแนวลึกกระทําไดโดยการแวะไปท่ีบัพละระดับโดยกําหนดวิถีแรกจากรากลงไปที่ใบและอีกวิถีหนึ่งจากรากไปที่ใบจนกระทั่งมีการแวะผานหมดทุกบัพ

!"$

วัตถุประสงค 1. เพื่อใหผูเรียนเขาใจถึงหลักการคํานวณหาวิถีสั้นที่สุดของกราฟ 2. เพื่อใหผูเรียนเขาใจถึงหลักการของอัลกอริทึมการแวะผานกราฟ

กิจกรรมการเรียนการสอน กิจกรรมท่ีนักศึกษาตองทําสําหรับการเรียนการสอน ไดแก 1. ศึกษาเอกสารชดุวิชา/โฮมเพจชุดวิชา ตอนที่ 15.1 ตอนที่ 15.2 และตอนที ่15.3 2. ทํากิจกรรมของบทเรียนที่ 15 3. ทําแบบประเมินผลของบทเรียนที่ 15

เอกสารประกอบการสอน 1. เอกสารชดุวิชา

สื่อการสอน 1. โฮมเพจชุดวิชา 2. สไลดประกอบการบรรยาย (Powerpoint) 3. โปรแกรมคอมพิวเตอร

ประเมินผล 1. ประเมินผลจากกิจกรรมที่ทํา 2. ประเมินผลจากคําถามทายบทเรียน

!"%

ตอนท่ี 15.1 วิถีท่ีส้ันท่ีสุด

หัวเรื่อง เร่ืองท่ี 15.1.1 อัลกอริทึมวิถีท่ีส้ันท่ีสุด เร่ืองท่ี 15.1.2 การคํานวณวิถีท่ีส้ันท่ีสุด

แนวคดิ 1. อัลกอริทึมที่ใชคํานวณวิถีที่สั้นที่สุดของกราฟนั้นมีแนวคิดมาจากอัลกอริทึมสของวอรแชลซึ่งใชหลักการของทราซิทีฟโคลสเชอร

2. การคํานวณวิถีท่ีส้ันท่ีสุดของกราฟสามารถทําไดโดยแทนกราฟดวยเมทริกซและนําอัลกอริทึมสของวอรแชลมาใช

วัตถุประสงค หลังจากที่ศึกษาตอนที่ 15.1.1 แลว

1. นักศึกษาเขาใจหลักการทํางานของอัลกอริทึมวิถีท่ีส้ันท่ีสุด 2. นักศึกษาสามารถเขียนอัลกอริทึมวิถีท่ีส้ันท่ีสุด 3. นักศึกษาสามารถคํานวณวิถีส้ันท่ีสุดของกราฟ

เรื่องที่ 15.1.1 อัลกอริทึมของวิถีที่สั้นที่สุด

ให G เปนกราฟระบุทิศทางประกอบดวย บัพ v1, v2, ... vm จํานวน m บัพ สมมติวา G เปนกราฟนํ้าหนัก กําหนดใหอารกของกราฟ G ประกอบดวยนํ้าหนัก หรือ ความยาวของอารก เทากับ w(e) ซ่ึงเปนจํานวนเต็มบวก ดังน้ัน สามารถเก็บ G ในหนวยความจําโดย เมทริกซนํ้าหนัก W = (wij) ดังตอไปน้ี

กําหนด wij = w(e) ถามี อารก e จาก vi ไปยัง vj

0 ถาไมม ีอารกจาก vi ไปยัง vj

เมทริกซวิถี P ให รายละเอียดวามีวิถีระหวางบัพ ปจจุบันสามารถเขียนเมทริกซ Q ซึ่งบอกความยาวของวิถีที่สั้นที่สุดระหวางบัพในกราฟ G ซ่ึงเมทริกซ Q = (qij)

เมื่อ qij = ความยาววิถีสั้นที่สุดจาก vi ไปยัง vj

ข้ันตอนตอไปคือการนําอัลกอริทึมของวอรแชลคํานวณเมทริกซ Q ในท่ีน้ีกําหนดลําดับของเมทริกซคือ Q0, Q1, ..., Qm (คลายกับเมทริกซ P0, P1, ..., Pm) ซ่ึง

!""

Qk[i,j] = MIN (Qk-1[i,j],Qk-1[i,k]+Qk-1[k,j]) เมื่อ MIN เปนฟงกชันหาคาต่ําสุด

เมทริกซเริ่มตน Q0 เหมือนกับเมทริกซน้ําหนัก W ยกเวนเลข 0 แตละตัวใน W ถูกแทนดวย ∞ ในท่ีสุดเมทริกซสุดทาย Qm จะเปนเมทริกซท่ีบอกระยะทางท่ีส้ันท่ีสุดตามตองการ

ให G เปนกราฟนํ้าหนักประกอบดวย n บัพ และมีน้ําหนัก w อัลกอริทึมในการคํานวณหา เมทริกซ Q ซ่ึง Q[I,J] คือความยาวของวิถีที่สั้นที่สุดจากบัพ vi ไปยังบัพ vj กําหนด INFINITY เปนจํานวนเต็มขนาดใหญมาก

1. Repeat for I,J = 1,2,…,M : [กําหนดคาเริ่มตน Q] If W[I,J] = 0, Then : Q[I,J] := INFINITY; Else : Q[I,J] := W[I,J] 2. วนซํ้าข้ันตอนท่ี 3 และ 4 for K = 1,2,…,M : [เปล่ียนแปลงQ] 3. วนซํ้าข้ันตอนท่ี 4 for I = 1,2,…,M : 4. วนซํ้าข้ันตอนท่ี 4 for J = 1,2,…,M Q[I,J] := MIN(Q[I,J],Q[I,K]+Q[K,J]) [จบวนซ้ําขั้นตอน 4] [จบวนซ้ําขั้นตอน 3] [จบวนซ้ําขั้นตอน 2] 5. จบ

กิจกรรม 15.1 กําหนดเมทริกซประชดิ Q ใหจงเขียนกราฟ คํานวณหาวิถีของเมทริกซ Qและเขียนอัลกอริทึมสําหรับหาวิถีส้ันท่ีสุด

1 0 0 01 0 0 10 1 0 01 0 1 0

Q =

เรื่องที่ 15.1.2 การคํานวณวิถีที่สั้นที่สุด

การคํานวณวิถีที่สั้นที่สุดของกราฟมีแนวคิดจากอัลกอริทึมของวอรแชลดังที่ไดกลาวมาแลวในเรื่องที่ 15.1.1

การคํานวณวิถีท่ีส้ันท่ีสุดของกราฟมีนํ้าหนักและระบุทิศทางจากกราฟ G ที่กําหนดให

!"&

7 R 4 U 5 7 2 1 S 3 T

กราฟ G ให v1 = R, v2 = S, v3 = T และ v4 = U ดังน้ันเมทริกซนํ้าหนัก W ของ G เขียนได ดังน้ี

7 5 0 0 W = 7 0 0 2

0 3 0 0 4 0 1 0

7 5 ∞ ∞ RR RS - -

Q0 = 7 ∞ ∞ 2 SR - - SU ∞ 3 ∞ ∞ - TS - - 4 ∞ 1 ∞ UR - UT -

7 5 ∞ ∞ RR RS - -

Q1 = 7 12 ∞ 2 SR SRS - SU ∞ 3 ∞ ∞ - TS - - 4 9 1 ∞ UR URS UT -

7 5 ∞ 7 RR RS - RSU Q2 = 7 12 ∞ 2 SR SRS - SU

10 3 ∞ 5 TSR TS - TSU 4 9 1 11 UR URS UT URSU

!&'

7 5 ∞ 7 RR RS - RSU

Q3 = 7 12 ∞ 2 SR SRS - SU 10 3 ∞ 5 TSR TS - TSU 4 4 1 6 UR UTS UT UTSU

7 5 8 7 RR RS RSUT RSU Q4 = 7 11 3 2 SR SURS SUT SU

9 3 6 5 TSUR TS TSUT TSU 4 4 1 6 UR UTS UT UTSU

Q1[4,2] = MIN(Q0[4,2], Q0 [4,1]+ Q0 [1,2]) = MIN (∞,4+5) =9 Q2[1,3] = MIN(Q1 [1,3], Q1 [1,2]+ Q1 [2,3]) = MIN (∞,5+∞) =∞ Q3[4,2] = MIN(Q2 [4,2], Q2 [4,3]+ Q2 [3,2]) = MIN (9,1+3) =4 Q4[3,1] = MIN(Q3 [3,1], Q3 [3,4]+Q3 [4,1]) = MIN (10,5+4) =9 จากการคํานวณขางตน ซึ่งใชอัลกอริทึมของวอรแชลที่ จะไดเมทริกซ Q0, Q1, Q2, Q3, และ Q4 ซ่ึง Q4 เปน

เมทริกซที่ตองการ

กิจกรรม 5.2 กําหนดเมทริกซประชดิ Q ใหจงหาวิถีสั้นที่สุดโดยใชอัลกอริทึมของวอรแชล

1 0 0 01 0 0 10 1 0 01 0 1 0

Q =

!&(

ตอนท่ี 15.2 การแทนกราฟดวยลิงกลิส

หัวเรื่อง เร่ืองท่ี 15.2.1 การแทนกราฟดวยลิงกลิสประชิด เร่ืองท่ี 15.2.2 การแทนกราฟดวยลิงกลิสหลายมิติ

แนวคดิ 1. การเก็บกราฟไวในลิงกลิสแบบประชิด เปนการเก็บรายช่ือบัพทุกบัพของกราฟ และอารกท่ีเชื่อมระหวางบัพในกราฟ

2. สามารถแทนกราฟไวในลิงกลิสไดทั้งแบบระบุทิศทางและไมระบุทิศทาง

วัตถุประสงค เมือ่ศึกษาตอนท่ี 15.2 จบแลวนักศึกษาสามารถ

1. วาดภาพการเก็บขอมูลของกราฟทั้งแบบระบุทิศทางและไมระบุทิศทางไวในลิงกลิสได 2. สามารถวาดภาพการเก็บขอมูลของกราฟมีนํ้าหนักไวในลิงกลิสได 3. สามารถวาดภาพการเก็บขอมูลของกราฟไวในลิงกลิสหลายมิติ

เรื่องที่ 15.2.1 การแทนกราฟดวยลิงกลิส ประชิด

การใชลิงกลิสเพ่ือประหยัดเน้ือท่ีในการเก็บขอมูลของกราฟน้ัน มีผูนิยมใชกันแพรหลาย ตัวอยาง เชน โครงสรางเครือขายระบบคอมพิวเตอรเพ่ือควบคุมการจราจรของเมืองหลวง การสรางโปรแกรมเพ่ือควบคุมปริมาณการจราจรบนถนนหลวง โดยบัพของกราฟใชแทนสี่แยก อารกใชแทนถนน น้ําหนักของอารกใชแทนปริมาณการจราจร อารกสําหรับถนนเดินทางเดียวน้ันมีนํ้าหนัก 1 ตัว อารกสําหรับถนนท่ีมีรถว่ิงสวนทางมีน้ําหนัก 2 ตัว ในกรณีนี้ถาใชเมทริกซประชิดแลว สําหรับกราฟท่ีมี n บัพเขียนโดยใชเมทริกซขนาด N2 แตถาใชลิงกลิส โปรแกรมใชบัพเทาที่จําเปนเทานั้น คือ ในกราฟประกอบดวยอารกที่ใชเก็บขอมูลเทานั้น โครงสรางพ้ืนฐานของลิงกลิส ที่นํามาใชกับกราฟ มี 2 แบบ คือ

การแทนโดยใชรายชื่อบัพ การแทนลิสหลายมติิ การแทนโดยใชรายชื่อบัพ

วิธีการน้ีแบงออกเปน 2 สวน คือ รายชื่อ เซตของลิงกลิส

!&!

เมื่อพิจารณากราฟแลวพบวา มีวิถีเขาไปยังรายชื่อบัพของแตละบัพในกราฟ การเขาไปที่บัพ i โดยชี้ไปที่ลิงกลิส ซึ่งแทนบัพที่เชื่อมกับบัพ i ซ่ึงอันท่ีจริงระเบียนท่ีนํามาประกอบเปนลิงกลิส นั้นม ี2 เขต คือ 1. ชื่อบัพ 2. ตัวชี้ที่เชื่อมกับสมาชิกตัวตอไปในลิส

!

()

$

* # ภาพประกอบ 15.1 กราฟไมระบุทิศทาง

เมื่อเขียนรายชื่อบัพแทนกราฟไมระบุทิศทางของรูป 11-15 ไดดังน้ี รายชื่อ ขอมูลเก่ียวกับอารก (

!

)

*

#

$

+,--!

!(

!

)

)

)

*

)

#

+,--

+,--

+,--

+,--

+,--$

ภาพประกอบ 15.2 2 ลิงกลิส ใชเก็บขอมูลของกราฟไมระบุทิศทาง

กราฟไมระบุทิศทางขนาด N ที่มีจํานวน A อารก การเขาไปในรายชื่อ N คร้ัง และการเขาไปลิงกลิส 2*A คร้ัง

!

()

* #

$

!&)

ภาพประกอบ 15.3 กราฟระบุทิศทาง

รายชื่อ ขอมูลเก่ียวกับอารก (

!

)

*

#

$

+,--!

!

#

)

)

+,--

+,--

+,--$

+,--

+,-- ภาพประกอบ 15.4 ลิงกลิสใชเก็บขอมูลของกราฟระบุทิศทาง

จะเห็นไดวา กราฟระบุทิศทางขนาด N ที่มีจํานวน A อารก ดําเนินการเขาไปในรายช่ือ N คร้ัง และเขาไปในลิงกลิสจํานวน N คร้ัง ลิงกลิสสวนหัวประกอบดวยรายชื่อของบัพจํานวน i บัพที่สัมพันธกับเมทริกซประชิดจํานวน i แถว สําหรับการจัดรายช่ือน้ัน มีการเรียงลําดับตามชื่อบัพ

กราฟแบบน้ําหนักและระบุทิศทาง

การแทนกราฟซ่ึงประกอบดวยอารกมีนํ้าหนักใชโครงสรางขอมูลท่ีสามารถเก็บนํ้าหนักได *

!

(

!

$

(

#*

))

)

"

!

%

!

$&

ภาพประกอบ 15.5 กราฟแบบน้ําหนักและระบุทิศทาง

รูปน้ีกราฟระบุทิศทาง และอารกมีนํ้าหนัก แตละบัพแทนเหตุการณท่ีเกิดข้ึนและอารกแทนงานท่ีไดทําไปเสร็จสมบูรณ จากเหตุการณหนึ่งไปยังเหตุการณหนึ่ง สําหรับน้ําหนักคือเวลาที่ใช การแทนรายชื่อบัพของกราฟนี ้ โครงสรางขอมูลสําหรับอารกน้ันประกอบดวยช่ือของบัพปลายทาง นํ้าหนักของอารก และตัวชี้ที่ชี้ไปยังอารกเสนตอไปที่มีแหลงกําเนิดจากบัพเดียวกัน NODE WEIGHT NEXT

!&*

รายชื่อบัพ ขอมูลของอารก 1 2 6 3 3 NULL 2 4 2 5 4 NULL 3 6 9 NULL 8 1 NULL 4 5 7 3 NULL 6 7 2 NULL 7 8 2 NULL 8 NULL

ภาพประกอบ 15.6 ลิงกลิสเก็บขอมูลของกราฟแบบน้ําหนักและระบุทิศทาง

เมื่อตองการหาระดับของบัพในกราฟไมระบุทิศทางสามารถทําไดโดยนับจํานวนของการเขา ในลิงกลิสสําหรับระดับนอกของบัพในกราฟระบุทิศทางน้ัน สามารถพิจารณาไดโดยนับจํานวนของการเขาลิงกลิส การหาระดับในของบัพ i ซับซอนกวาการหาระดับนอกแตละสวนของลิงกลิสน้ันไดรับการนํามาใชเพื่อจะตรวจดูวามีบัพ i ที่ตองการหรือไม เพ่ืออํานวยความสะดวกในการคนหาบัพท่ีอยูกอนหนาและพิจารณาระดับใน จึงตองมีรายชื่อชวยของอารกที่เชื่อมกับบัพดวย เมื่อเปรียบเทียบขอดีขอเสียของการใชลิงกลิสกับการใชเมทริกซประชิด แลวจะพบวาการนําโครงสรางขอมูลชนิดใดไปใชงานใดนั้น ขึ้นกับลักษณะและเปาหมายของงานนั้น ๆ เชน เมื่อกําหนดใหเนื้อที่ในการเก็บขอมูลนั้นเปนปจจัยหลักของการเลือกในโครงสรางขอมูล การใชลิงกลิส น้ันเหมาะสมกวา เพราะใชเน้ือท่ีนอยกวาซึ่งมีขอยกเวนในกรณีที่กราฟนั้นมีการเชื่อมตอกันมาก กรณีท่ีกราฟประกอบดวยโครงสรางท่ีเปล่ียนแปลงไปไดงายคือ มีการเพิ่มหรือลดอารกมากซึ่งเหมาะสมที่จะใชเมทริกซประชิดมากกวาใชรายชื่อบัพเพราะการเปลี่ยนการเขาเมทริกซนั้นงายกวาการเพิ่ม (หรือลด) การเขาไปยังลิงกลิส

กิจกรรม 15.3 จากกลิสแบบประชิดที่กําหนดใหจงวาดกราฟแบบระบุทิศทาง รายชื่อบัพ ขอมูลของอารก

!&#

(

)

!

*

!

)

(

*

+,--

+,--

+,--

+,--

เรื่องที่ 15.2.2 การแทนกราฟดวยลิงกลิสหลายมิต ิ

การใชลิงกลิสหลายมิติแทนกราฟนั้น มีอยู 2 สวน คือ รายชื่อของบัพ

เซตลิงกลิสของอารก ขอมลูอารก

การเขาไปที่แตละบัพในรายชื่อบัพมีเพียง 1 ชองทางเทานั้น ซึ่งการเขาไปที่รายชื่อของบัพ i น้ันโดยชี้ไปที่ลิงกลิสแบบประชิด สําหรับรายชื่อของบัพ i และระเบียนของลิงกลิสน้ันปรากฎบน 2 ลิสท่ีเช่ือมตอกัน NODE1 NODE2 ID ADJ ID ADJ Vi NEXT1 Vj NEXT2

ภาพประกอบ 15.7 การเก็บขอมูลของอารกโดยวิธีลิสหลายมิต ิ

การแทนลิสหลายมิตินั้นไดจากกราฟไมระบุทิศทางรูป 15-1 ซ่ึงการสราง ลิงกลิสหลายมิติน้ันไดจากเซตของอารก {(1,2), (2,2), (2,3), (4,3), (3,5), (3,6)}

!&$

รายชื่อ ขอมลูอารก (!)*

$#

(

!

*

!

)

)

'

.

'

'

.

'

!

!

)

)

#

$

.

'

.

.

'

'

ภาพประกอบ 15.8 ลิงกลิสเก็บขอมูลของกราฟไมระบุทิศทางวิธีที่ 1

รายชื่อ ขอมลูอารก

(

!

)

*

$

#

!

!

#

!

)

)

.

.

'

'

'

.

(

!

)

)

$

*

'

'

'

.

'

'

ภาพประกอบ 15.9 ลิงกลิสเก็บขอมูลของกราฟไมระบุทิศทางวิธีที่ 2

การสรางลิสหลายมิติในรูปท่ี 15-1 ไดจากเซตจาํกัดของอารก {(2,1), (2,2), (2,3), (3,4), (5,3), (3,6)} สําหรับนํ้าหนักของอารกน้ันสามารถเก็บไวในระเบียนของอารก ซึ่งไดอธิบายในตัวอยางที่กลาวไปแลว การกําหนดกราฟน้ําหนักใหมีจํานวน 24 บัพ และประกอบดวยตัวแปรชนิดตัวชี้ สามารถทําได คือ

!&%

type

nodeid = 0..24;

nodetype = ^arcinfo;

arcptr = ^arcinfo;

arcinfo = record

node1 : nodeid;

node2 : nodeid;

adjlist1 : arcptr;

adjlist2 : arcptr;

weight : integer

end;

var

graph : array[1..24] of nodetype;

กิจกรรม 15.4 กําหนดเมทริกซประชดิ Q ใหจงเขียนกราฟ และเขียนแทนกราฟของเมทริกซ Q ดวยลิงคลิสหลายมิต ิ

1 0 0 01 0 0 10 1 0 01 0 1 0

Q =

!&"

ตอนท่ี 15.3 การแวะผานกราฟ

หัวเรื่อง เร่ืองท่ี 15.3.1 การแวะผานกราฟแนวกวาง เร่ืองท่ี 15.3.2 การแวะผานกราฟแนวลึก

แนวคดิ 1. การเขาถึงขัอมูลที่เก็บอยูในกราฟสามารถทําไดโดยการแวะผานบัพที่อยูในกราฟ 2. การแวะผานกราฟสามารถทําได 2 วิธีคือ การแวะผานกราฟแนวกวาง และ การแวะผานกราฟแนวลึก

3. การแวะผานกราฟแนวกวางกระทําไดโดยการแวะไปที่บัพทุกบัพในระดับเดียวกันจนครบทุกบัพแลวจึงแวะผานไปที่บัพในระดับถัดไป

4. การแวะผานกราฟแนวลึกกระทําไดโดยการแวะไปท่ีบัพละระดับโดยกําหนดวิถีแรกจากรากลงไปที่ใบและอีกทางหนึ่งจากรากไปที่ใบจนกระทั่งมีการแวะผานหมดทุกบัพ

วัตถุประสงค เมือ่ศึกษาตอนท่ี 15.3 จบแลวนักศึกษา

1. เขาใจหลักการของการแวะผานกราฟแนวลึกและการแวะผานกราฟแนวกวาง 2. สามารถบอกความแตกตางระหวางการแวะผานกราฟแนวลึกและการแวะผานกราฟแนวกวาง 3. สามารถเขียนโปรแกรมของการแวะผานกราฟแนวลึกและการแวะผานกราฟแนวกวาง

เรื่องที่ 15.3.1 การแวะผานกราฟแนวกวาง

การแวะผานกราฟ คือขบวนการที่แวะไปที่ทุกๆ บัพของกราฟ สําหรับเทคนิคในการการแวะผานมี 2 แบบ ดังน้ี

1. แนวกวาง (Breadth first traversal) 2. แนวลึก (Depth first traversal)

หลักการทํางานของการแวะผานกราฟน้ันคือ การไปที่แตละบัพเพียง 1 คร้ัง สําหรับการไปที่บัพในตนไมนั้นมีเพียง 1 วิถีจากรากไปยังบัพ แตสําหรับในกราฟนั้นมีหลายวิถีระหวางคูของบัพ ดังน้ันเพ่ือปองกันการไปที่บัพซ้ําซอนจึงจําเปนตองทําเครื่องหมาย(มารคบิต) บริเวณบัพท่ีไดรับการแวะผานเสร็จเรียบรอยแลวจึงไมสามารถไปแวะไดอีก นอกจากนี้ยังมีการทําเครื่องหมายใหกับอารกที่ตามหลังมา สําหรับอารกท่ีทําเครื่องหมายไปแลวไมสามารถใชเปนวิถีอีก ดังน้ันมารค บิต จึงสามารถเก็บใชขอมูลของบัพ หรืออารกวาไดรับการแวะผานแลว

!&&

การแวะผานในแนวกวาง (Depth first traversal) วิธีการน้ีทําข้ึนโดยเลือก 1 บัพ เปนจุดเริ่มตน หลังจากนั้นไปแวะผานและทําเครื่องหมายที่บัพนั้น ตอมาบัพอื่นที่เชื่อมกับบัพนั้นจะไดรับการแวะผาน และทําเคร่ืองตามลําดับ ในที่สุดบัพที่ยังไมไดแวะผานซึ่งประชิดกับบัพที่ไดแวะผานไปแลว ไดรับการแวะและทําเครื่องหมาย จนกระทั่งทุก ๆ บัพในกราฟไดรับการแวะผานครบถวน การแวะผานในแนวลึก ของกราฟในรูปที่ 15-5 น้ัน จะไปที่บัพแบบเรียงตามลําดับ ดังน้ีคือ 1, 2, 3, 4, 5, 6, 8, 7 หรือการไปที่บัพเรียงตามลําดับอีกแบบหนึ่ง ดังน้ีคือ 1, 3, 2, 6, 5, 4, 7, 8 อัลกอริท่ึมการแวะผาน ใชคิวเพื่อเก็บบัพในกราฟแตละระดับที่ไดผานไปแวะผานบัพที่นําไปเก็บไวน้ัน จะไดรับการดําเนินงานทีละบัพและบัพประชิดก็ไดรับการแวะผานจนกระท่ังทุกบัพไดรับการแวะผานเง่ือนไขจบการทํางานของอัลกอริทึมนี้ คือการที่คิววาง

โปรแกรมการแวะผานกราฟแบบแนวกวาง

อัลกอริทึมตอไปน้ีกลาวถึงกระบวนงานท่ีทําการเพ่ิมและลบสมาชิกออกจากคิวโดยกระบวนงานท้ัง 2 นี้จะนําไปใชในอัลกอริทึมของการแวะผานกราฟที่จะกลาวตอไป

type queuestruct =

record

queue : array[1..100] of integer;

r,f : integer;

end;

var

q : queuestruct;

(*F = R for empty q*)

(*F point to front element of queue*)

(*queue is full when R = (F+1) mod N*)

(*max number of element in queue is N-1*)

procedure insert (con : integer);

begin

if (q.f <> (q.r+1) mod n)

then begin q.r := (q.r+1) mod n:

q.queue[q.r] := con

else

OVERFLOW

end;

procedure remove (var eoff : integer);

begin

if q.r = q.f

then UNDERFLOW - CONDITION

else begin

q.f := (q.f+1) mod n;

eoff := q.queue[q.f]

)''

end;

end;

{อัลกอริทึมน้ี แสดงการแวะผานกราฟแบบกวาง โดยมีการเก็บบัพที่ไดรับการแวะผานแลวไวในคิว และแวะไปที่บัพที่อยูประชิดกับบัพที่อยูในคิว ดูรูป 15-5 ประกอบ}

(*global data typed used for the graph*)

type nodeid = 0..ordergraph;

edgeptr = ^edgeinfo;

nodetype = record

mark : 0..1;

adjlist : edgeptr

end;

edgeinfo = record

node : nodeid;

weight : integer;

next : edgeptr;

end;

graphtype = array[1..ordergraph] of nodetype;

var

graph : graphtype;

firstnode : nodeid;

procedure breadth (firstnode : nodeid);

var

q : queuestruct;

savenode : nodeid;

adjptr : edgeptr;

begin

(*visit firstnode here*)

graph [firstnode].mark := 1;

insert (firstnode);

while q.f <> 0 do

begin

remove (savenode);

adjptr := graph[savenode].adjlist;

(*visit nodes adjacent to savenode*)

while adjptr <> nil do

begin

savenode := adjptr^.node;

if (graph[savenode].mark = 0)

then begin

insert(savenode);

(*visit savenode here*)

graph[savenode].mark := 1

end;

adjptr := adjptr^.next

end

)'(

end

end;

กิจกรรม 15.5 จงเขียนโปรแกรมที่สามารถแวะผานกราฟระบุทิศทางแนวกวาง โดยกราฟน้ันมีการแทนดวยเมทริกซประชิด

จากกราฟที่กําหนดให จงเขียนรายชื่อของบัพที่ไดจากการแวะผานกราฟระบุทิศทางแนวกวาง

/ 0

1 2

เรื่องที่ 15.3.2 การแวะผานกราฟแนวลึก

การแวะผานแนวลึก (Depth-first Traversal) ทํางานคลายกับการแวะผานทีละระดับของตนไม โดยกําหนดวิถีแรก จากรากลงไปที่ใบและอีกทางหนึ่งจากรากไปที่ใบจนกระทั่งมีการแวะผานหมดทุกบัพ การแวะผานแบบลึกของกราฟใน รูปที่ 15-5 ใหผลในการแวะผานบัพแบบเรียงลําดับ จาก 1,2,4,8,5,7,3,6 การแวะผานดําเนินงานจนกระท่ังไมมีบัพท่ีสามารถแวะไดหลงเหลืออยูเลย อัลกอริทึมน้ีก็กลับไปที่บัพสุดทายที่ไดรับการเยี่ยมซึ่งเชื่อมกับบัพถัดไปที่ยังไมไดรับการไปเยี่ยม ดังน้ัน จากรูปที่ 15-5 สามารถไปเยี่ยมบัพอีกวิธีหนึ่งไดตามลําดับดังนี้ คือ 1,3,6,7,8,2,5,4 สําหรับ การแวะผานแนวลึกใชเงื่อนไขแบบรีเคอรซีฟ สามารถเขียนเปนกระบวนงาน ไดดังน้ี คือ

procedure depth (var thisnode : nodeid);

var savenode : nodeid;

adjptr : edgptr;

begin (*visit thisnode here*)

graph[thisnode].mark := 1;

adjptr := graph[thisnode].adjlist;

while adjptr <> nil do

begin savenode := adjptr^.node;

if (graph[savenode].mark = 0)

then depth(savenode);

adjptr := adjptr^.next

end;

end;

)'!

กิจกรรม 15.6 จากกราฟที่กําหนดให จงเขียนรายชื่อของบัพที่ไดจากการแวะผานกราฟระบุทิศทางแนวลึก

/ 0

1 2

จงเขียนโปรแกรมที่สามารถแวะผานกราฟระบุทิศทางแนวลึก โดยกราฟน้ันมีการแทนดวยลิงกลิสหลายมิต ิ