ผลต่างระหว่างรุ่นของ "204512/บรรยาย 5"
Noonsri (คุย | มีส่วนร่วม) (→Graph) |
|||
(ไม่แสดง 24 รุ่นระหว่างกลางโดยผู้ใช้ 3 คน) | |||
แถว 1: | แถว 1: | ||
+ | {{หัวคำบรรยาย|204512}} | ||
+ | '''จดบันทึกคำบรรยายโดย:''' | ||
+ | '' ทวีศักดิ์ อัชรางกูร รหัส : 50653807'' | ||
== ทบทวน == | == ทบทวน == | ||
=== Graph === | === Graph === | ||
แถว 4: | แถว 7: | ||
เซตของโหนด <math>V</math><br> | เซตของโหนด <math>V</math><br> | ||
เซตของเส้นเชื่อม <math>E \subseteq VxV</math><br /> | เซตของเส้นเชื่อม <math>E \subseteq VxV</math><br /> | ||
− | ตัวอย่าง <br> | + | '''ตัวอย่าง'''<br> |
[[ภาพ:MST1.png]]<br /> | [[ภาพ:MST1.png]]<br /> | ||
:จะกล่าวว่าเส้นเชื่อม (u,v) ติดกับโหนด u และ v<br> | :จะกล่าวว่าเส้นเชื่อม (u,v) ติดกับโหนด u และ v<br> | ||
แถว 34: | แถว 37: | ||
== Spanning tree == | == Spanning tree == | ||
+ | :ให้กราฟ G = (V,E) เรียก tree ว่าเป็น spanning tree ถ้า <math>E' \sube E</math><br> | ||
[[ภาพ:MST3.png]]<br /> | [[ภาพ:MST3.png]]<br /> | ||
---- | ---- | ||
=== ปัญหา minimum spanning tree === | === ปัญหา minimum spanning tree === | ||
+ | :ให้กราฟ G = (V,E) พร้อมด้วยฟังก์ชั่นน้ำหนัก w บนเส้นเชื่อม ต้องการหา spanning tree <br> | ||
+ | T ที่ผลรวมของ weight บนเส้นเชื่อมน้อยที่สุด<br> | ||
[[ภาพ:MST4.png]]<br /> | [[ภาพ:MST4.png]]<br /> | ||
---- | ---- | ||
=== Greedy framework === | === Greedy framework === | ||
+ | :ทุกๆ เส้นเชื่อมจะมี | ||
+ | ::*ไม่มีสี(unknow) | ||
+ | ::*สีน้ำเงิน(accept) | ||
+ | ::*สีแดง(reject) | ||
---- | ---- | ||
=== Invariant === | === Invariant === | ||
+ | :จะมี minimum spanning tree ที่มีเส้นเชื่อมสีน้ำเงินทั้งหมดและไม่มีเส้นเชื่อมสีแดง<br> | ||
+ | cut คือ partition ของเซตของโหนดออกเป็นสองส่วน<math>(X,\overline X) </math><br> | ||
[[ภาพ:MST5.png]]<br /> | [[ภาพ:MST5.png]]<br /> | ||
+ | :เส้นเชื่อม e ข้าม Cut <math>(X,\overline X) </math> ถ้าจุดปลายด้านหนึ่งของ edge อยู่ใน X อีกช่วงอยู่ใน <math>\overline X</math> | ||
---- | ---- | ||
+ | |||
=== Blue Rule และ Red Rule === | === Blue Rule และ Red Rule === | ||
+ | :'''blue rule''' พิจารณา Cut ใดๆ ที่ไม่มีเส้นเชื่อมสีน้ำเงินข้าม cut นั้น เลือกเส้นเชื่อมที่มีน้ำหนักน้อยสุด และให้ e มีสีน้ำเงิน | ||
+ | :'''red rule''' พิจารณา Cycle ใดๆ ที่ไม่มี edge สีแดงอยู่เลือกเส้น e ที่น้ำหนักมากสุดให้ e มีสีแดง | ||
+ | '''ตัวอย่าง'''<br> | ||
[[ภาพ:MST6.png]]<br /> | [[ภาพ:MST6.png]]<br /> | ||
+ | '''Thm.'''<br> | ||
+ | :สามารถทำตาม blue rule/red rule ได้จนกระทั่งทุกๆ edge มีสีและตลอดการทำงาน invariant เป็นจริง<br> | ||
+ | '''Proof'''<br> | ||
+ | :เมื่อเริ่มต้น (ทุกๆ edge ไม่มีสี)ทุกๆ เส้นเชื่อมไม่มีสี invariant เป็นจริง | ||
+ | :assume ว่า invariant จริงมี minimum spanning tree ตาม invariant | ||
+ | '''blue rule''' ถ้า apply blue rule กับ edge e,บน cut<math>(X,\overline X)</math> ถ้า <math>e \in T</math> assume ว่า <math>e \notin T</math> ดังรูป | ||
[[ภาพ:MST7.png]]<br /> | [[ภาพ:MST7.png]]<br /> | ||
+ | :เนื่องจาก T เป็น Spanning tree มี path จาก u ไป v บน T <br> | ||
+ | path นี้จะต้องข้าม <math>(X,\overline X)</math> จะมี <math>e' \in T</math> ที่ข้าม cut <math>(X,\overline X)</math><br> | ||
+ | '''Claim''' <br> | ||
+ | :ให้ <math>T' = T \cup \{ e\} - \{ e'\}</math> T' เป็น Minimum Spanning Tree<br> | ||
+ | '''Proof'''<br> | ||
+ | :1)T' ไม่มี Cycle T' เป็น tree และวิ่งผ่านทุกโหนดในกราฟ | ||
+ | :2)T' Connected เป็น tree และวิ่งผ่านทุกโหนดในกราฟ | ||
+ | :เราทราบว่า e มีน้ำหนักน้อยสุดใน cut<math>(X,\overline X)</math> | ||
+ | :น้ำหนัก <math>e \le </math> น้ำหนักของ e' imply ว่า น้ำหนักของ <math>T' \le </math>น้ำหนักของ T | ||
+ | :นั่นคือ invariant ยังจริงอยู่หลังทำ Blue rule<br> | ||
[[ภาพ:MST8.png]]<br /> | [[ภาพ:MST8.png]]<br /> | ||
+ | '''Red rule'''<br> | ||
+ | :ให้ทำ red rule ให้ edge <math>e \in (u,v)</math> เป็นสีแดงบน Cycle C | ||
+ | :ถ้า <math>e \notin T</math> assume <math>e \in T'</math> ดังรูป | ||
[[ภาพ:MST9.png]]<br /> | [[ภาพ:MST9.png]]<br /> | ||
+ | '''พิจารณารูปข้างล่าง'''<br> | ||
[[ภาพ:MST10.png]]<br /> | [[ภาพ:MST10.png]]<br /> | ||
+ | :พิจารณา <math>T' = T \cup \{ e\} - \{ e'\}</math> | ||
+ | :น้ำหนักของ <math>T' \le </math>น้ำหนักของ T | ||
+ | :นอกจากนี้ T' เป็น spanning tree ดังนั้นหลังจากการทำ red rule,จะมี minimum spanning tree <br> | ||
+ | T' ที่มี edge สีน้ำเงินทั้งหมด และไม่มี edge สีแดงเลย แสดงว่า invariant จริงอยู่ | ||
---- | ---- | ||
+ | |||
=== Blue Forest === | === Blue Forest === | ||
[[ภาพ:MST11.png]]<br /> | [[ภาพ:MST11.png]]<br /> | ||
---- | ---- | ||
=== Buruvka === | === Buruvka === | ||
+ | :ห้าม edge weight ซ้ำกัน | ||
+ | :ทำงาน <math>O(m\log n)</math> <br> | ||
[[ภาพ:MST12.png]]<br /> | [[ภาพ:MST12.png]]<br /> | ||
+ | :2,1,2 และ 2,3,4 | ||
+ | :เริ่มต้นเรามีกราฟ ทุกๆโหนดมองรอบตัวเองและเลือก edge ที่น้ำหนักน้อยที่สุดออกมา และทำเช่นนี้จนกว่าจะเชื่อมทุกโหนดได้ ดังรูป<br> | ||
[[ภาพ:MST13.png]]<br /> | [[ภาพ:MST13.png]]<br /> | ||
+ | '''ตัวอย่างการยุบ'''<br> | ||
[[ภาพ:MST14.png]]<br /> | [[ภาพ:MST14.png]]<br /> | ||
+ | :'''Comment''' ข้อเสียของวิธีนี้คือ กรณีที่ edge เท่ากันจะทำให้เกิด Cycle เพราะว่าการเลือกแต่เฉพาะส่วนที่ใกล้ตัวเองไม่ได้คำนึงถึงตัวอื่น | ||
---- | ---- | ||
+ | |||
=== Prim's Algorithm === | === Prim's Algorithm === | ||
+ | :เลือกตัวที่ใกล้ที่สุดออกไปเรื่อยๆ จนกระทั่งเป็น tree<br> | ||
[[ภาพ:MST15.png]]<br /> | [[ภาพ:MST15.png]]<br /> | ||
---- | ---- | ||
+ | |||
=== Kruskal's Alogorithm === | === Kruskal's Alogorithm === | ||
+ | :หลักคือ เอา edge มาเรียงกันจากน้อยไปมากหลังจากนั้นก็โยนเข้าไปเรื่อยๆให้ไม่เกิด Cycle<br> | ||
+ | จะเกิดปัญหาก็ต่อเมื่อโยน edge เข้าไปแล้วทำให้เกิด Cycle ยึดหลักการ '''Sort edge''' | ||
+ | :การทำงาน <math>O(m \log n)</math><br> | ||
+ | '''ตัวอย่าง'''<br> | ||
[[ภาพ:MST16.png]]<br /> | [[ภาพ:MST16.png]]<br /> | ||
+ | ---- | ||
+ | |||
+ | == Union-Find == | ||
+ | :ยึดหลักการทำงานของ Kruskal ซึ่งแต่ละโหนดเป็นอิสระต่อกันซึ่งโครงสร้างพื้นฐาน คือ Set ดังรูป <br> | ||
[[ภาพ:MST17.png]]<br /> | [[ภาพ:MST17.png]]<br /> | ||
+ | :ถ้าหากไม่อยู่ใน Set เดียวกันก็จับมา Union กัน<br><br> | ||
+ | :element n ตัว มี Set s {{1},{2},{3},....{n}} | ||
+ | ::*find(x) คือ identity ของ set ที่มี x อยู่ | ||
+ | ::*union(x) รวม set ที่มี x กับ y เข้าด้วยกัน | ||
+ | :'''ดังรูป''' | ||
[[ภาพ:MST18.png]]<br /> | [[ภาพ:MST18.png]]<br /> | ||
[[ภาพ:MST19.png]]<br /> | [[ภาพ:MST19.png]]<br /> | ||
+ | :make set(x) | ||
+ | :parent(x)<--x,rank(x)<---0 | ||
+ | ::while(parent(x)<>x) | ||
+ | :::x<--parent(x) | ||
+ | ::return x<br><br> | ||
+ | :union(x,y) | ||
+ | ::<math>r_x </math><-- find(x) | ||
+ | ::<math>r_y </math><-- find(y) | ||
+ | ::parent<math>(r_x)</math><-- <math>r_x</math> | ||
+ | :::if rank<math>(r_x)</math> < rank <math>(r_y)</math> | ||
+ | ::::parent<math>(r_x)</math><--<math>r_y</math> | ||
+ | :::else | ||
+ | ::::parent<math>(r_y)</math><--<math>r_x</math> | ||
+ | :::::if rank<math>(r_x)</math>= rank <math>(r_y)</math> | ||
+ | ::::::rank<math>(r_x)</math><-- rank <math>(r_x)</math> + 1 | ||
+ | :'''Observation 1''' | ||
+ | ::ถ้า parent(x)<>x,rank(x)< rank(parent(x)) | ||
+ | :'''Observation 2''' | ||
+ | ::สำหรับ tree ที่ root มี rank k | ||
+ | ::tree มี node <math>\ge 2^k </math> โหนด | ||
+ | :'''Observation 3''' | ||
+ | ::โหนดมี rank k มีไม่เกิน <math>\frac{n}{{2^k }}</math> โหนด ดังภาพ | ||
[[ภาพ:MST20.png]]<br /> | [[ภาพ:MST20.png]]<br /> | ||
+ | :Find ทำงานในเวลา O(m log* n) | ||
---- | ---- | ||
'''Path Compress'''<br /> | '''Path Compress'''<br /> | ||
+ | :แนวคิด log*n ดังรูป<br> | ||
[[ภาพ:MST21.png]]<br /> | [[ภาพ:MST21.png]]<br /> | ||
+ | :'''Algorithm ของ Path Compress'''<br><br> | ||
+ | ::if parent(x)<>x | ||
+ | :::parent(x) = find(parent(x)) | ||
+ | ::return parent(x)<br> | ||
+ | '''อธิบาย'''<br> | ||
+ | ::{1},{2},{3,4},{5,6,..,16},{17,..<math>2^{16}</math>},....,{k+1,..,<math>2^k</math>},....,{65537,<math>2^{65536}</math>} ดังรูปประกอบด้านล่าง<br> | ||
[[ภาพ:MST22.png]]<br /> | [[ภาพ:MST22.png]]<br /> | ||
+ | :จะเขียนสมการได้ว่า <math>\frac{n}{{2^{k + 1} }} + \frac{n}{{2^{k + 2} }} + ..... \le \frac{n}{{2^k }}</math> | ||
+ | :การทำ find m รอบ | ||
+ | :::'''<math>O(m\log *n + n\log *n)</math>''' | ||
---- | ---- |
รุ่นแก้ไขปัจจุบันเมื่อ 15:44, 22 กันยายน 2550
บันทึกคำบรรยายวิชา 204512 นี้ เป็นบันทึกที่นิสิตเขียนขึ้น เนื้อหาโดยมากยังไม่ผ่านการตรวจสอบอย่างละเอียด การนำไปใช้ควรระมัดระวัง
จดบันทึกคำบรรยายโดย: ทวีศักดิ์ อัชรางกูร รหัส : 50653807
เนื้อหา
ทบทวน
Graph
เซตของโหนด
เซตของเส้นเชื่อม
ตัวอย่าง
- จะกล่าวว่าเส้นเชื่อม (u,v) ติดกับโหนด u และ v
- u และ v เป็นจุดปลายของเส้นเชื่อม (u,v)
- degree ของโหนดใดๆ คือ จำนวนเส้นเชื่อมที่ติดกับโหนดนี้
- path คือ ลำดับของโหนด ที่
- สำหรับทุกๆ เรียก เป็นจุดเริ่มต้น , เป็นจุดสิ้นสุด
Thm
- ถ้ากราฟ มี m edge ให้ deg(u) แทน degree ของโหนด u
Def
- กราฟ G Connected ถ้าทุกๆ โหนด u มี path ไปยังทุกๆ โหนด v
เป็น connected coponent ใน G ตัว ทุกๆ โหนดใน C มี path ไปถึงทุกๆ โหนดใน C และ
ไม่มี path ไปยังโหนด v อื่นๆ ที่
Cycle คือ path ที่มีจุดเริ่มต้นเป็นจุดเดียวกับจุดสิ้นสุด ดังรูป
Def. tree คือ กราฟที่ Connected และไม่มี Cycle
Thm. ข้อความข้างล่างนี้ให้ G มี n node
- 1) G Connected
- 2) G ไม่มี Cycle
- 3) G มีเส้นเชื่อม n-1 เส้น
- 2 ข้อใดๆ จะ imply ข้อที่ 3 และ imply ว่า G เป็น tree
- 2 ข้อใดๆ จะ imply ข้อที่ 3 และ imply ว่า G เป็น tree
Proof (1,2-->3)
- (I) ถ้า G Connected,G จะต้องมีอย่างน้อย n-1 edge
- (II) ถ้า G มี edge G มี Cycle
- เพราะฉะนั้น G ไม่มี Cycle , G มี edge
Spanning tree
- ให้กราฟ G = (V,E) เรียก tree ว่าเป็น spanning tree ถ้า
ปัญหา minimum spanning tree
- ให้กราฟ G = (V,E) พร้อมด้วยฟังก์ชั่นน้ำหนัก w บนเส้นเชื่อม ต้องการหา spanning tree
T ที่ผลรวมของ weight บนเส้นเชื่อมน้อยที่สุด
Greedy framework
- ทุกๆ เส้นเชื่อมจะมี
- ไม่มีสี(unknow)
- สีน้ำเงิน(accept)
- สีแดง(reject)
Invariant
- จะมี minimum spanning tree ที่มีเส้นเชื่อมสีน้ำเงินทั้งหมดและไม่มีเส้นเชื่อมสีแดง
cut คือ partition ของเซตของโหนดออกเป็นสองส่วน
- เส้นเชื่อม e ข้าม Cut ถ้าจุดปลายด้านหนึ่งของ edge อยู่ใน X อีกช่วงอยู่ใน
Blue Rule และ Red Rule
- blue rule พิจารณา Cut ใดๆ ที่ไม่มีเส้นเชื่อมสีน้ำเงินข้าม cut นั้น เลือกเส้นเชื่อมที่มีน้ำหนักน้อยสุด และให้ e มีสีน้ำเงิน
- red rule พิจารณา Cycle ใดๆ ที่ไม่มี edge สีแดงอยู่เลือกเส้น e ที่น้ำหนักมากสุดให้ e มีสีแดง
- สามารถทำตาม blue rule/red rule ได้จนกระทั่งทุกๆ edge มีสีและตลอดการทำงาน invariant เป็นจริง
Proof
- เมื่อเริ่มต้น (ทุกๆ edge ไม่มีสี)ทุกๆ เส้นเชื่อมไม่มีสี invariant เป็นจริง
- assume ว่า invariant จริงมี minimum spanning tree ตาม invariant
blue rule ถ้า apply blue rule กับ edge e,บน cut ถ้า assume ว่า ดังรูป
- เนื่องจาก T เป็น Spanning tree มี path จาก u ไป v บน T
path นี้จะต้องข้าม จะมี ที่ข้าม cut
Claim
- ให้ T' เป็น Minimum Spanning Tree
Proof
- 1)T' ไม่มี Cycle T' เป็น tree และวิ่งผ่านทุกโหนดในกราฟ
- 2)T' Connected เป็น tree และวิ่งผ่านทุกโหนดในกราฟ
- เราทราบว่า e มีน้ำหนักน้อยสุดใน cut
- น้ำหนัก น้ำหนักของ e' imply ว่า น้ำหนักของ น้ำหนักของ T
- นั่นคือ invariant ยังจริงอยู่หลังทำ Blue rule
- ให้ทำ red rule ให้ edge เป็นสีแดงบน Cycle C
- ถ้า assume ดังรูป
- พิจารณา
- น้ำหนักของ น้ำหนักของ T
- นอกจากนี้ T' เป็น spanning tree ดังนั้นหลังจากการทำ red rule,จะมี minimum spanning tree
T' ที่มี edge สีน้ำเงินทั้งหมด และไม่มี edge สีแดงเลย แสดงว่า invariant จริงอยู่
Blue Forest
Buruvka
- ห้าม edge weight ซ้ำกัน
- ทำงาน
- 2,1,2 และ 2,3,4
- เริ่มต้นเรามีกราฟ ทุกๆโหนดมองรอบตัวเองและเลือก edge ที่น้ำหนักน้อยที่สุดออกมา และทำเช่นนี้จนกว่าจะเชื่อมทุกโหนดได้ ดังรูป
- Comment ข้อเสียของวิธีนี้คือ กรณีที่ edge เท่ากันจะทำให้เกิด Cycle เพราะว่าการเลือกแต่เฉพาะส่วนที่ใกล้ตัวเองไม่ได้คำนึงถึงตัวอื่น
Prim's Algorithm
- เลือกตัวที่ใกล้ที่สุดออกไปเรื่อยๆ จนกระทั่งเป็น tree
Kruskal's Alogorithm
- หลักคือ เอา edge มาเรียงกันจากน้อยไปมากหลังจากนั้นก็โยนเข้าไปเรื่อยๆให้ไม่เกิด Cycle
จะเกิดปัญหาก็ต่อเมื่อโยน edge เข้าไปแล้วทำให้เกิด Cycle ยึดหลักการ Sort edge
- การทำงาน
Union-Find
- ยึดหลักการทำงานของ Kruskal ซึ่งแต่ละโหนดเป็นอิสระต่อกันซึ่งโครงสร้างพื้นฐาน คือ Set ดังรูป
- ถ้าหากไม่อยู่ใน Set เดียวกันก็จับมา Union กัน
- element n ตัว มี Set s {{1},{2},{3},....{n}}
- find(x) คือ identity ของ set ที่มี x อยู่
- union(x) รวม set ที่มี x กับ y เข้าด้วยกัน
- ดังรูป
- make set(x)
- parent(x)<--x,rank(x)<---0
- while(parent(x)<>x)
- x<--parent(x)
- return x
- while(parent(x)<>x)
- union(x,y)
- <-- find(x)
- <-- find(y)
- parent<--
- if rank < rank
- parent<--
- else
- parent<--
- if rank= rank
- rank<-- rank + 1
- if rank= rank
- parent<--
- if rank < rank
- Observation 1
- ถ้า parent(x)<>x,rank(x)< rank(parent(x))
- Observation 2
- สำหรับ tree ที่ root มี rank k
- tree มี node โหนด
- Observation 3
- โหนดมี rank k มีไม่เกิน โหนด ดังภาพ
- Find ทำงานในเวลา O(m log* n)
Path Compress
- แนวคิด log*n ดังรูป
- Algorithm ของ Path Compress
- if parent(x)<>x
- parent(x) = find(parent(x))
- return parent(x)
- if parent(x)<>x
อธิบาย
- {1},{2},{3,4},{5,6,..,16},{17,..},....,{k+1,..,},....,{65537,} ดังรูปประกอบด้านล่าง
- {1},{2},{3,4},{5,6,..,16},{17,..},....,{k+1,..,},....,{65537,} ดังรูปประกอบด้านล่าง
- จะเขียนสมการได้ว่า
- การทำ find m รอบ