ผลต่างระหว่างรุ่นของ "204512/บรรยาย 5"

จาก Theory Wiki
ไปยังการนำทาง ไปยังการค้นหา
 
(ไม่แสดง 23 รุ่นระหว่างกลางโดยผู้ใช้ 3 คน)
แถว 1: แถว 1:
 +
{{หัวคำบรรยาย|204512}}
 +
'''จดบันทึกคำบรรยายโดย:'''
 +
'' ทวีศักดิ์  อัชรางกูร  รหัส : 50653807''
 
== ทบทวน ==
 
== ทบทวน ==
 
=== Graph ===
 
=== Graph ===
แถว 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

เซตของโหนด
เซตของเส้นเชื่อม
ตัวอย่าง
MST1.png

จะกล่าวว่าเส้นเชื่อม (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 ที่มีจุดเริ่มต้นเป็นจุดเดียวกับจุดสิ้นสุด ดังรูป
MST2.png
Def. tree คือ กราฟที่ Connected และไม่มี Cycle
Thm. ข้อความข้างล่างนี้ให้ G มี n node

1) G Connected
2) G ไม่มี Cycle
3) G มีเส้นเชื่อม n-1 เส้น
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 ถ้า

MST3.png


ปัญหา minimum spanning tree

ให้กราฟ G = (V,E) พร้อมด้วยฟังก์ชั่นน้ำหนัก w บนเส้นเชื่อม ต้องการหา spanning tree

T ที่ผลรวมของ weight บนเส้นเชื่อมน้อยที่สุด
MST4.png


Greedy framework

ทุกๆ เส้นเชื่อมจะมี
  • ไม่มีสี(unknow)
  • สีน้ำเงิน(accept)
  • สีแดง(reject)

Invariant

จะมี minimum spanning tree ที่มีเส้นเชื่อมสีน้ำเงินทั้งหมดและไม่มีเส้นเชื่อมสีแดง

cut คือ partition ของเซตของโหนดออกเป็นสองส่วน
MST5.png

เส้นเชื่อม e ข้าม Cut ถ้าจุดปลายด้านหนึ่งของ edge อยู่ใน X อีกช่วงอยู่ใน

Blue Rule และ Red Rule

blue rule พิจารณา Cut ใดๆ ที่ไม่มีเส้นเชื่อมสีน้ำเงินข้าม cut นั้น เลือกเส้นเชื่อมที่มีน้ำหนักน้อยสุด และให้ e มีสีน้ำเงิน
red rule พิจารณา Cycle ใดๆ ที่ไม่มี edge สีแดงอยู่เลือกเส้น e ที่น้ำหนักมากสุดให้ e มีสีแดง

ตัวอย่าง
MST6.png
Thm.

สามารถทำตาม blue rule/red rule ได้จนกระทั่งทุกๆ edge มีสีและตลอดการทำงาน invariant เป็นจริง

Proof

เมื่อเริ่มต้น (ทุกๆ edge ไม่มีสี)ทุกๆ เส้นเชื่อมไม่มีสี invariant เป็นจริง
assume ว่า invariant จริงมี minimum spanning tree ตาม invariant

blue rule ถ้า apply blue rule กับ edge e,บน cut ถ้า assume ว่า ดังรูป MST7.png

เนื่องจาก 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

MST8.png
Red rule

ให้ทำ red rule ให้ edge เป็นสีแดงบน Cycle C
ถ้า assume ดังรูป

MST9.png
พิจารณารูปข้างล่าง
MST10.png

พิจารณา
น้ำหนักของ น้ำหนักของ T
นอกจากนี้ T' เป็น spanning tree ดังนั้นหลังจากการทำ red rule,จะมี minimum spanning tree

T' ที่มี edge สีน้ำเงินทั้งหมด และไม่มี edge สีแดงเลย แสดงว่า invariant จริงอยู่


Blue Forest

MST11.png


Buruvka

ห้าม edge weight ซ้ำกัน
ทำงาน

MST12.png

2,1,2 และ 2,3,4
เริ่มต้นเรามีกราฟ ทุกๆโหนดมองรอบตัวเองและเลือก edge ที่น้ำหนักน้อยที่สุดออกมา และทำเช่นนี้จนกว่าจะเชื่อมทุกโหนดได้ ดังรูป

MST13.png
ตัวอย่างการยุบ
MST14.png

Comment ข้อเสียของวิธีนี้คือ กรณีที่ edge เท่ากันจะทำให้เกิด Cycle เพราะว่าการเลือกแต่เฉพาะส่วนที่ใกล้ตัวเองไม่ได้คำนึงถึงตัวอื่น

Prim's Algorithm

เลือกตัวที่ใกล้ที่สุดออกไปเรื่อยๆ จนกระทั่งเป็น tree

MST15.png


Kruskal's Alogorithm

หลักคือ เอา edge มาเรียงกันจากน้อยไปมากหลังจากนั้นก็โยนเข้าไปเรื่อยๆให้ไม่เกิด Cycle

จะเกิดปัญหาก็ต่อเมื่อโยน edge เข้าไปแล้วทำให้เกิด Cycle ยึดหลักการ Sort edge

การทำงาน

ตัวอย่าง
MST16.png


Union-Find

ยึดหลักการทำงานของ Kruskal ซึ่งแต่ละโหนดเป็นอิสระต่อกันซึ่งโครงสร้างพื้นฐาน คือ Set ดังรูป

MST17.png

ถ้าหากไม่อยู่ใน Set เดียวกันก็จับมา Union กัน

element n ตัว มี Set s {{1},{2},{3},....{n}}
  • find(x) คือ identity ของ set ที่มี x อยู่
  • union(x) รวม set ที่มี x กับ y เข้าด้วยกัน
ดังรูป

MST18.png
MST19.png

make set(x)
parent(x)<--x,rank(x)<---0
while(parent(x)<>x)
x<--parent(x)
return x

union(x,y)
<-- find(x)
<-- find(y)
parent<--
if rank < rank
parent<--
else
parent<--
if rank= rank
rank<-- rank + 1
Observation 1
ถ้า parent(x)<>x,rank(x)< rank(parent(x))
Observation 2
สำหรับ tree ที่ root มี rank k
tree มี node โหนด
Observation 3
โหนดมี rank k มีไม่เกิน โหนด ดังภาพ

MST20.png

Find ทำงานในเวลา O(m log* n)

Path Compress

แนวคิด log*n ดังรูป

MST21.png

Algorithm ของ Path Compress

if parent(x)<>x
parent(x) = find(parent(x))
return parent(x)

อธิบาย

{1},{2},{3,4},{5,6,..,16},{17,..},....,{k+1,..,},....,{65537,} ดังรูปประกอบด้านล่าง

MST22.png

จะเขียนสมการได้ว่า
การทำ find m รอบ