data structure lesson15

Page 1

!"#

แผนการสอนประจําบทเรียน รายชือ่ อาจารยผจู ดั ทํา อนงคนาฏ ศรีวหิ ค ตอนที่ 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และเขียนอัลกอริทมึ สําหรับหา วิถสี น้ั ทีส่ ดุ

Q=

1 1 0 1

0 0 1 0

0 0 0 1

0 1 0 0

เรื่องที่ 15.1.2 การคํานวณวิถีที่สั้นที่สุด การคํานวณวิถีที่สั้นที่สุดของกราฟมีแนวคิดจากอัลกอริทึมของวอรแชลดังที่ไดกลาวมาแลวในเรื่องที่ 15.1.1 การคํานวณวิถที ส่ี น้ั ทีส่ ดุ ของกราฟมีนาํ้ หนักและระบุทศิ ทางจากกราฟ G ที่กําหนดให


!"& 7 R

4

5

7 S

U 2

1

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

Q0 =

Q1 =

7 5 ∞ ∞

RR

RS

-

-

7 ∞ ∞ 2

SR

-

-

SU

∞ 3 ∞ ∞

-

TS

-

-

4 ∞ 1 ∞

UR

-

UT

-

7 5 ∞ ∞

RR

RS

-

-

7 12 ∞ 2

SR

SRS

-

SU

-

TS

-

-

UR

URS

UT

-

7 5 ∞ 7

RR

RS

-

RSU

7 12 ∞ 2

SR

SRS

-

SU

10 3 ∞ 5

TSR

TS

-

TSU

URS

UT

URSU

∞ 3 ∞ ∞ 4

Q2 =

4

9 1

9

1 11

UR


!&'

Q3 =

Q4 =

7 5 ∞ 7

RR

RS

-

RSU

7 12 ∞ 2

SR

SRS

-

SU

10 3 ∞ 5

TSR

TS

-

TSU

4

UR

UTS

UT

UTSU

7 5 8 7

RR

RS

RSUT RSU

7 11 3 2

SR

SURS SUT

9

3 6 5

TSUR TS

TSUT TSU

4

4 1 6

UR

UT

4

1 6

UTS

SU 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 ใหจงหาวิถีสั้นที่สุดโดยใชอัลกอริทึมของวอรแชล

Q=

1 1 0 1

0 0 1 0

0 0 0 1

0 1 0 0


!&( ตอนที่ 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

5

7

3

NULL

6

7

2

NULL 8

2

NULL

4

7 8 NULL

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

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


!&# (

!

+,--

!

)

+,--

)

(

+,--

*

*

+,--

เรื่องที่ 15.2.2 การแทนกราฟดวยลิงกลิสหลายมิติ การใชลิงกลิสหลายมิติแทนกราฟนั้น มีอยู 2 สวน คือ รายชื่อของบัพ เซตลิงกลสิ ของอารก ขอมูลอารก การเขาไปที่แตละบัพในรายชื่อบัพมีเพียง 1 ชองทางเทานั้น ซึ่งการเขาไปที่รายชื่อของบัพ i นัน้ โดย ชี้ไปที่ลิงกลิสแบบประชิด สําหรับรายชื่อของบัพ i และระเบียนของลิงกลสิ นัน้ ปรากฎบน 2 ลิสทีเ่ ชือ่ มตอกัน NODE1 ID Vi

NODE2

ADJ NEXT1

ID Vj

ADJ 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 1 0 1

0 0 1 0

0 0 0 1

0 1 0 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

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

โดยกราฟนัน้ มีการแทนดวยลิงกลสิ


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.