C Language - 10 เทคนิคอัลกอริทึมแบบ divide-and-conquer

17
04/01/57 Advance Computer Programming: .กิตตินันท์ น้อยมณี 1 เทคนคอัลกอรทมแบบ Divide-and-Conquer Advance Computer Programming รหัสวชา 32090207 . กิตตินันท์ น้ 1อยมณี 1 เนอหา 1. Introduction 2. Binary Search 3. Select Sort 4. Merge Sort 5. Divide-and-Conquer . กิตตินันท์ น้ 1อยมณี 2 Introduction . กิตตินันท์ น้ 3อยมณี 3 Introduction เราจะใช Big O ในการวเคราะห Worse Case ของ แตละกรณ แทนดวยสัญลักษณ O( symbol ) . กิตตินันท์ น้ 1อยมณี 4
  • Upload

    -
  • Category

    Software

  • view

    44
  • download

    2

Transcript of C Language - 10 เทคนิคอัลกอริทึมแบบ divide-and-conquer

Page 1: C Language - 10 เทคนิคอัลกอริทึมแบบ divide-and-conquer

04/01/57

Advance Computer Programming: อ.กิตตนินัท์ น้อยมณี 1

เทคนิคอัลกอริทึมแบบ

Divide-and-Conquer

Advance Computer Programming

รหัสวิชา 32090207

อ. กิตตินนัท์ น้1อยมณี 1

เนื้อหา

1. Introduction

2. Binary Search

3. Select Sort

4. Merge Sort

5. Divide-and-Conquer

อ. กิตตินนัท์ น้1อยมณี 2

Introduction

อ. กิตตินนัท์ น้3อยมณี 3

Introduction

• เราจะใช้ Big O ในการวิเคราะห์ Worse Case ของ

แต่ละกรณี

• แทนด้วยสัญลักษณ์ O( symbol )

อ. กิตตินนัท์ น้1อยมณี 4

Page 2: C Language - 10 เทคนิคอัลกอริทึมแบบ divide-and-conquer

04/01/57

Advance Computer Programming: อ.กิตตนินัท์ น้อยมณี 2

Introductionการวิเคราะห์การใช้เวลาของอัลกอริทึม

อ. กิตตินนัท์ น้1อยมณี 5

t = f(n)

n (ขนาดข้อมูลที่โตขึ้นเรื่อยๆ)

O(n!)O(2n)

O(n2)

O(n)

O(1)

Introductionการวิเคราะห์การใช้เวลาของอัลกอริทึม

อ. กิตตินนัท์ น้1อยมณี 6

O(n2)

O(n)

Introductionการวิเคราะห์การใช้เวลาของอัลกอริทึม

อ. กิตตินนัท์ น้1อยมณี 7

t = f(n)

n (ขนาดข้อมูลที่โตขึ้นเรื่อยๆ)

O(n!)O(2n)

O(n2)

O(n)

O(1)

O( n logn )

O( logn )

Introductionการวิเคราะห์การใช้เวลาของอัลกอริทึม

อ. กิตตินนัท์ น้1อยมณี 8

t = f(n)

n (ขนาดข้อมูลที่โตขึ้นเรื่อยๆ)

O(n!)O(2n)

O(n2)

O(n)

O(1)

O( n logn )

O( logn )

Sort

Search

สูตรเฉพาะ เช่น เกาส์

Page 3: C Language - 10 เทคนิคอัลกอริทึมแบบ divide-and-conquer

04/01/57

Advance Computer Programming: อ.กิตตนินัท์ น้อยมณี 3

Binary Search

อ. กิตตินนัท์ น้9อยมณี 9

Binary Search

• แรกเริ่มเดิมทีเราจะใช้การ Search แบบ Linear

Search (หรือเรียกว่า Sequential Search) ซึ่งมี

ลักษณะการทํางานดังนี้

อ. กิตตินนัท์ น้1อยมณี 10

Binary Search

อ. กิตตินนัท์ น้1อยมณี 11

Binary Search

อ. กิตตินนัท์ น้1อยมณี 12

0 1 2 3 4 5

7 4 1 8 3 2

Page 4: C Language - 10 เทคนิคอัลกอริทึมแบบ divide-and-conquer

04/01/57

Advance Computer Programming: อ.กิตตนินัท์ น้อยมณี 4

Binary Search

อ. กิตตินนัท์ น้1อยมณี 13

0 1 2 3 4 5

7 4 1 8 3 2

Binary Search

อ. กิตตินนัท์ น้1อยมณี 14

0 1 2 3 4 5

7 4 1 8 3 2

Binary Search

อ. กิตตินนัท์ น้1อยมณี 15

0 1 2 3 4 5

7 4 1 8 3 2

Binary Search

อ. กิตตินนัท์ น้1อยมณี 16

Page 5: C Language - 10 เทคนิคอัลกอริทึมแบบ divide-and-conquer

04/01/57

Advance Computer Programming: อ.กิตตนินัท์ น้อยมณี 5

Binary Search

• แต่กว่าจะเจอข้อมูลที่ต้องการใช้เวลานาน

• กรณีที่แย่ที่สุด (Worse Case) ก็คือกรณีที่เลขที่

ต้องการค้นหาอยู่ด้านหลังสุดของ Array แสดงว่า

เราต้องวนจนสุด Loop กันเลยทีเดียว

• ดังนั้นจึงมีการคิดค้นการ Search อีกรูปแบบคือ

Binary Search (มีเงื่อนไขข้อมูลใน Array ต้องถูก

เรียงมาก่อนแล้ว)อ. กิตตินนัท์ น้1อยมณี 17

Binary Search

อ. กิตตินนัท์ น้1อยมณี 18

0 1 2 3 4 5

Data 1 2 4 5 8 9 Find 8

• หลักการคือ ตัดชุดข้อมูลที่ไม่สนใจออกครึ่งนึงเลย

• วิธีการคือ กําหนดให้

– i ชี้ที่ Front (ด้านหน้าสุด)

– j ชี้ที่ Rear (ด้านหลังสุด)

– m ชี้ที่ Middle (ด้านกลาง)

Binary Search

อ. กิตตินนัท์ น้1อยมณี 19

0 1 2 3 4 5

Data 1 2 4 5 8 9 Find 8

i jj

• ก่อนเข้า Loop ต้องให้ i = 0 และ j = n-1 (ตัว

สุดท้าย)

• หลักการคือเอา data[m] ไปเทียบกับ find

mm

Binary Search

อ. กิตตินนัท์ น้1อยมณี 20

0 1 2 3 4 5

Data 1 2 4 5 8 9 Find 8

i jj

รอบที่ 0 i = 0 รอบแรก %2 Floor j = n - 1

รอบที่ 1

รอบที่ 2

รอบที่ 3

mm

Page 6: C Language - 10 เทคนิคอัลกอริทึมแบบ divide-and-conquer

04/01/57

Advance Computer Programming: อ.กิตตนินัท์ น้อยมณี 6

Binary Search

อ. กิตตินนัท์ น้1อยมณี 21

0 1 2 3 4 5

Data 1 2 4 5 8 9 Find 8

i jj

รอบที่ 0 i = 0 รอบแรก %2 Floor j = n - 1

รอบที่ 1 i = m+1

= 3

m = 2 j = 5

รอบที่ 2

รอบที่ 3

mm

Binary Search

อ. กิตตินนัท์ น้1อยมณี 22

0 1 2 3 4 5

Data 1 2 4 5 8 9 Find 8

i jj

รอบที่ 0 i = 0 รอบแรก %2 Floor j = n - 1

รอบที่ 1 i = m+1

= 3

m = 2 j = 5

รอบที่ 2 m = 4

รอบที่ 3

mm

หมายเหตุ: ตรวจดูว่าเจอรึยัง ถ้ายังไม่เจอก็ทําต่อ

Binary Search

อ. กิตตินนัท์ น้1อยมณี 23

0 1 2 3 4 5

Data 1 2 4 5 8 9 Find 8

i jj

รอบที่ 0 i = 0 รอบแรก %2 Floor j = n - 1

รอบที่ 1 i = m+1

= 3

m = 2 j = 5

รอบที่ 2 i = 3 m = 4 j = 4

รอบที่ 3 m = 3

mm

Binary Search

อ. กิตตินนัท์ น้1อยมณี 24

0 1 2 3 4 5

Data 1 2 4 5 8 9 Find 8

i jj

รอบที่ 0 i = 0 รอบแรก %2 Floor j = n - 1

รอบที่ 1 i = m+1

= 3

m = 2 j = 5

รอบที่ 2 i = 3 m = 4 j = 4

รอบที่ 3 i = 4 m = 3 j = 4

mm

หมายเหตุ: หยุด ถ้าใช่เจอ ถ้าไม่ใช่แสดงว่าไม่เจอ

Page 7: C Language - 10 เทคนิคอัลกอริทึมแบบ divide-and-conquer

04/01/57

Advance Computer Programming: อ.กิตตนินัท์ น้อยมณี 7

Binary Search

อ. กิตตินนัท์ น้1อยมณี 25

Algorithm BinarySearch( data[n]:integer, find:integer )

i:=0, j:=n-1

while( i<j )

m:=

if data[m] < find then i:=m+1

else j:=m

if data[i] = find then pos:=I

else pos:= -1 {not found}

return pos

End Algorithm

Binary Search

อ. กิตตินนัท์ น้1อยมณี 26

Binary Search

อ. กิตตินนัท์ น้1อยมณี 27

0 1 2 3 4 5

Data 1 2 4 5 8 9 Find 8

Binary Search

อ. กิตตินนัท์ น้1อยมณี 28

เปรียบเทียบ Linear Binaryข้อมูล 6 ตัว 6 รอบ รอบ

=

= 2.xxx รอบ(Worse case คือ 3 รอบ)

ข้อมูล 100 ตัว 100 รอบ รอบ

=

= 6.xxx รอบ

เร็วกว่าเห็นๆ

Page 8: C Language - 10 เทคนิคอัลกอริทึมแบบ divide-and-conquer

04/01/57

Advance Computer Programming: อ.กิตตนินัท์ น้อยมณี 8

Binary Search

• คราวที่แล้วเราเรียนเรื่อง Recursion ไปแล้ว ดังนั้น

ลองเอาความรู้ที่ได้มาประยุกต์ใช้กันดู

อ. กิตตินนัท์ น้1อยมณี 29

Binary Search

อ. กิตตินนัท์ น้1อยมณี 30

เราจะวนคิดไปเรื่อยๆ

ตรงนี้คือเงื่อนไขการจบ

Binary Search

อ. กิตตินนัท์ น้1อยมณี 31

Binary Search

อ. กิตตินนัท์ น้1อยมณี 32

• ช่วงข้อมูลในการพิจารณาคือ i และ j โดยมี

ตําแหน่งตรงกลางคือ m

• ดังนั้นเราเอาตําแหน่งกลางไปเทียบกบั find ได้เลย

• หากค่า find มากกว่าตําแหน่งตรงกลาง เราก็จะ

ทําครึ่งขวา โดยทําตั้งแต่ตําแหน่ง m + 1 จนถึง j

นั่นเอง (แสดงว่า find ไม่ได้อยู่ในซีกซ้าย จะอยู่ใน

ซีกขวานั่นเอง)

Page 9: C Language - 10 เทคนิคอัลกอริทึมแบบ divide-and-conquer

04/01/57

Advance Computer Programming: อ.กิตตนินัท์ น้อยมณี 9

Binary Search

อ. กิตตินนัท์ น้1อยมณี 33

• สามารถเขียนฟังก์ชันเพิม่เติมได้ในลักษณะนี้

Binary Search

อ. กิตตินนัท์ น้1อยมณี 34

Binary Search

อ. กิตตินนัท์ น้1อยมณี 35

• โดยเมื่อหาเจอจะต้อง Return ตําแหน่งที่พบใน

BinSearch โดยจะทําการเรียก BSRecur เพื่อใช้ใน

การหา ซึ่งจะส่งข้อมูลเริ่มต้นไปให้ นั่นคือ i = 0

และ j = n-1 นั่นเอง

• ผลสุดท้ายจะได้ค่า i ออกมา ถ้าเจอก็ได้ pos แต่

ถ้าไม่เจอก็ให้เป็นเลข -1

Binary Search

อ. กิตตินนัท์ น้1อยมณี 36

• เทคนิคการคิดลักษณะนี้มันจะตรงกับอัลกอริทึมที่

เรียกว่า Divide-and-Conquer (แบ่งและชนะ) ทํา

ให้การทํางานของโปรแกรมดีขึ้น

• ยังมีอัลกอริทึมอีกอันนึงคือ Merge Sort ซึ่งอันนี้ก็

ใช้ Divide-and-Conquer ด้วยเหมือนกัน

Page 10: C Language - 10 เทคนิคอัลกอริทึมแบบ divide-and-conquer

04/01/57

Advance Computer Programming: อ.กิตตนินัท์ น้อยมณี 10

Select Sort

อ. กิตตินนัท์ น้37อยมณี 37

Select Sort

• แปลตรงๆ คือการเลือกไปเรียง

• แปลดีๆ คือการเลือกค่าที่ต้องการ เพื่อไปวางยัง

ตําแหน่งที่ถูกต้อง

อ. กิตตินนัท์ น้1อยมณี 38

0 1 2 3 4 5

Data 8 2 1 3 4 6

Select Sort

อ. กิตตินนัท์ น้1อยมณี 39

0 1 2 3 4 5

Data 8 2 1 3 4 6

• เราจะเรียกจากน้อยไปมาก

• ดังนั้นต้องเลือกค่าที่ต้องการไปไว้ในตาํแหน่งที่

ถูกต้อง

Select Sort

อ. กิตตินนัท์ น้1อยมณี 40

0 1 2 3 4 5

Data 8 2 1 3 4 6

0 1 2 3 4 5

Data 8 2 1 3 4 6

รอบที่ 0วนหาค่าที่น้อยที่สุดให้ได้

ก่อนว่าอยู่ตรงไหน จากนั้นค่อยจับมาใส่

Page 11: C Language - 10 เทคนิคอัลกอริทึมแบบ divide-and-conquer

04/01/57

Advance Computer Programming: อ.กิตตนินัท์ น้อยมณี 11

Select Sort

อ. กิตตินนัท์ น้1อยมณี 41

0 1 2 3 4 5

Data 8 2 1 3 4 6

0 1 2 3 4 5

Data 1 2 8 3 4 6

รอบที่ 0เลือก 1 มาวางที่ตําแหน่ง 0 ดังนั้นสลับเลข 1 กับ 8

หมายเหตุ: วนหา 6 รอบSelect Sort

อ. กิตตินนัท์ น้1อยมณี 42

0 1 2 3 4 5

Data 1 2 8 3 4 6

0 1 2 3 4 5

Data 1 2 8 3 4 6

รอบที่ 1ดูต่อว่าค่าที่เหลือมีอันไหนน้อยสุดบ้าง ถ้ามีก็สลับเลย

(ถ้าไม่มีก็ไปต่อได้)

หมายเหตุ: วนหา 5 รอบ

Select Sort

อ. กิตตินนัท์ น้1อยมณี 43

0 1 2 3 4 5

Data 1 2 8 3 4 6

0 1 2 3 4 5

Data 1 2 3 8 4 6

รอบที่ 2

หมายเหตุ: วนหา 4 รอบSelect Sort

อ. กิตตินนัท์ น้1อยมณี 44

0 1 2 3 4 5

Data 1 2 3 8 4 6

0 1 2 3 4 5

Data 1 2 3 4 8 6

รอบที่ 3

หมายเหตุ: วนหา 3 รอบ

Page 12: C Language - 10 เทคนิคอัลกอริทึมแบบ divide-and-conquer

04/01/57

Advance Computer Programming: อ.กิตตนินัท์ น้อยมณี 12

Select Sort

อ. กิตตินนัท์ น้1อยมณี 45

0 1 2 3 4 5

Data 1 2 3 4 8 6

0 1 2 3 4 5

Data 1 2 3 4 6 8

รอบที่ 4

หมายเหตุ: วนหา 2 รอบSelect Sort

• แสดงว่าต้องมีการวนทั้งหมด 2 Loop ซ้อนกัน

• นั่นคือ O(n2) นั่นเอง

อ. กิตตินนัท์ น้1อยมณี 46

Select Sort

อ. กิตตินนัท์ น้1อยมณี 47

ต้องม ีtemp เพราะเดี๋ยวจะมีการสลับค่าเกิดขึ้น

Select Sort

อ. กิตตินนัท์ น้1อยมณี 48

หาตําแหน่งที่มีข้อมูลน้อยที่สุด

Page 13: C Language - 10 เทคนิคอัลกอริทึมแบบ divide-and-conquer

04/01/57

Advance Computer Programming: อ.กิตตนินัท์ น้อยมณี 13

Select Sort

อ. กิตตินนัท์ น้1อยมณี 49

เอาข้อมูลมาสลับ

Select Sort

อ. กิตตินนัท์ น้1อยมณี 50

Select Sort

อ. กิตตินนัท์ น้1อยมณี 51

Merge Sort

อ. กิตตินนัท์ น้52อยมณี 52

Page 14: C Language - 10 เทคนิคอัลกอริทึมแบบ divide-and-conquer

04/01/57

Advance Computer Programming: อ.กิตตนินัท์ น้อยมณี 14

Merge Sort

อ. กิตตินนัท์ น้1อยมณี 53

1 2 1 8 6 5 4

Merge Sort

อ. กิตตินนัท์ น้1อยมณี 54

1 2 1 8 6 5 4

1 2 1 8 6 5 4

Merge Sort

อ. กิตตินนัท์ น้1อยมณี 55

1 2 1 8 6 5 4

1 2 1 8 6 5 4

1 2 1 8 6 5 4

Merge Sort

อ. กิตตินนัท์ น้1อยมณี 56

1 2 1 8 6 5 4

1 2 1 8 6 5 4

1 2 1 8 6 5 4

1 2 1 8 6 5 4

Page 15: C Language - 10 เทคนิคอัลกอริทึมแบบ divide-and-conquer

04/01/57

Advance Computer Programming: อ.กิตตนินัท์ น้อยมณี 15

Merge Sort

อ. กิตตินนัท์ น้1อยมณี 57

1 2 1 8 6 5 4

1 2 1 8 6 5 4

1 2 1 8 6 5 4

1 2 1 8 6 5 4

1 1 2 6 8 4 5*

Merge Sort

อ. กิตตินนัท์ น้1อยมณี 58

1 2 1 8 6 5 4

1 2 1 8 6 5 4

1 2 1 8 6 5 4

1 2 1 8 6 5 4

1 1 2 6 8 4 5

1 1 2 4 5 6 8

*

*

Merge Sort

อ. กิตตินนัท์ น้1อยมณี 59

1 2 1 8 6 5 4

1 2 1 8 6 5 4

1 2 1 8 6 5 4

1 2 1 8 6 5 4

1 1 2 6 8 4 5

1 1 2 4 5 6 8

1 1 2 4 5 6 8

*

*

*

Merge Sort

อ. กิตตินนัท์ น้1อยมณี 60

Algorithm mergesort( T[n] )

if n > 1 then

u[0 … -1 ] := T[ 0 … -1]

v[0 … -1] := T[ … n-1]

mergesort( u )

mergesort( v )

merge( u, v, T )

End Algorithm

5 4

5 4

u v

T

แบ่งต่อไปเรื่อยๆ อีก

อีกอัลกอริทึมนึง

Page 16: C Language - 10 เทคนิคอัลกอริทึมแบบ divide-and-conquer

04/01/57

Advance Computer Programming: อ.กิตตนินัท์ น้อยมณี 16

Merge Sort

อ. กิตตินนัท์ น้1อยมณี 61

Algorithm merge( u[m], v[n], T[m+n] )

i := 0, j := 0

for k := 0 to m+n-1

if i >= m then T[k] := v[j], j := j + 1

else if j >= n then T[k] := u[i], i := i + 1

else if u[i] < v[j] then T[k] := u[i], i := i + 1

else T[k] := v[j], j := j + 1

End Algorithm

5 4

5 4u v

T

Merge Sort

อ. กิตตินนัท์ น้1อยมณี 62

ลองทําด้วยตัวเองดูนะครับ???

Merge Sort

อ. กิตตินนัท์ น้1อยมณี 63

ลองทําด้วยตัวเองดูนะครับ???

Merge Sort

อ. กิตตินนัท์ น้1อยมณี 64

Page 17: C Language - 10 เทคนิคอัลกอริทึมแบบ divide-and-conquer

04/01/57

Advance Computer Programming: อ.กิตตนินัท์ น้อยมณี 17

Divide-and-Conquer

อ. กิตตินนัท์ น้65อยมณี 65

Divide-and-Conquer

• ดังนั้น Divide-and-Conquer คือการแบ่งข้อมูล

(ปัญหาต่างๆ) ให้มีขนาดเล็กลง แล้วจึงแก้ไข

ปัญหาไปทีละอย่าง

• แล้วค่อยนําคําตอบจากส่วนเล็กๆ มาประกอบกัน

จนเป็นคําตอบของโจทย์ปัญหาทั้งหมดนั่นเอง

• ซึ่งทั้ง Binary Search และ Merge Sort ล้วนแต่ใช้

เทคนิคของ Divide-and-Conquer ทั้งสิ้นอ. กิตตินนัท์ น้1อยมณี 66