โครงสร้างข้อมูลและอัลกอริทึมเบื้องต้น

Slides:



Advertisements
งานนำเสนอที่คล้ายกัน
ประกาศกรมสวัสดิการและคุ้มครองแรงงาน เรื่อง หลักเกณฑ์และวิธีการเลือกตั้งคณะกรรมการสวัสดิการในสถานประกอบกิจการ ประกาศราชกิจจานุเบกษา วันที่ 22 พฤษภาคม.
Advertisements

บทที่ 5 การควบคุมทิศทางการทำงานของโปรแกรม
การสื่อสารข้อมูลทางคอมพิวเตอร์
การใช้งานโปรแกรม SPSS
หน่วยที่ 3 ภาษาคำสั่งพื้นฐานที่ใช้เขียนโปรแกรม PLC
ทบทวนอสมการกำลัง 1 การหาเซตคำตอบของ อสมการ ตัวอย่า ง.
1 Search & Sort Search & Sort วรวิทย์ พูลสวัสดิ์.
โครงสร้างข้อมูล (Data Structures ) รหัสวิชา การเรียงลำดับข้อมูลแบบ (Heap Sort)
DATA STRUCTURE AND ALGORITHM Linked List.
หน่วยที่ 6 แถวลำดับ (Array)
การใช้งาน Microsoft Excel
หลักการโปรแกรม 1 Lecture 8: การทำซ้ำ (while, do-while)
ครั้งที่ 7 รีจิสเตอร์ (REGISTER). รีจิสเตอร์ (Register) รีจิสเตอร์เป็นวงจรความจำที่ใช้ในการเก็บค่า ทางไบนารี่ ใช้ในการเก็บค่าในระหว่างการ ประมวลผลโดยใช้ฟลิป.
Microsof t Office Word เตรียมความ พร้อม Microsoft Office Word 2007 แดงเขียวน้ำเงิน ม่วงดำเขียว เหลืองส้มน้ำตาล น้ำเงินดำแดง.
เทคนิคการใช้ Microsoft Excel. 1. การตีตารางในรูปแบบต่าง ๆ 2. การแทรกภาพในตาราง 3. การตกแต่งข้อมูลด้วย Format Cells 4. การคำนวณ บวก ลบ คูณ หาร 5. การย่อ.
LOGO ภาษาซี 1.1 อ. กฤติเดช จินดาภัทร์. LOGO ตัวอย่างโค้ดภาษาซี
คำสั่งควบคุมการทำงาน
Microsoft Access 2007 การสร้างฟอร์ม
Burin Rujjanapan Updated:
stack #2 ผู้สอน อาจารย์ ยืนยง กันทะเนตร
รายการ(List) [1] ผู้สอน อาจารย์ ยืนยง กันทะเนตร
แรงแบ่งได้เป็น 2 ลักษณะ คือ 1. แรงสัมผัส ( contact force )
Number system (Review)
ACCOUNTING FOR INVENTORY
Trees (2) University of Phayao Sanchai Yeewiyom
แล้วทำการเรียงลำดับข้อมูลใหม่โดยเรียงจากน้อยไปหามาก
รายการ(List) [3] ผู้สอน อาจารย์ ยืนยง กันทะเนตร
STACK สแตก(stack) เป็นโครงสร้างข้อมูลแบบเชิงเส้น ที่มีการใส่ข้อมูลเข้า และนำข้อมูลออกเพียงด้านเดียว ดังนั้น ข้อมูลที่เข้าไปอยู่ใน stack ก่อนจะออกจาก stack.
การบันทึกรายการค้าในสมุดบัญชี
โครงสร้างภาษา C Arduino
การบัญชีต้นทุนช่วง (Process Costing).
Vernier เวอร์เนียร์ คือเครื่องมือที่ใช้วัดระยะ (distance) หรือ ความยาว (length) ให้ได้ค่าอย่างละเอียด เวอร์เนียร์ต่างจากไม้บรรทัดทั่วๆไป เพราะมี 2 สเกล.
บทที่ 7 การเขียนโปรแกรม แบบวนรอบทำซ้ำ (Loop)
การจัดการควบคุมคุณภาพข้อมูล
Control Statement เงื่อนไขคำสั่งในโปรแกรม ภาษา C
Data Structure and Algorithm
รายวิชา ไมโครโปรเซสเซอร์ในงานอุตสาหกรรม
คำสั่ง Create , Insert, Delete, Update
หลักการแต่ง คำประพันธ์ประเภท โคลง. หลักการแต่ง คำประพันธ์ประเภท โคลง.
ครั้งที่4-5วิชาวาดเส้นTV การวาดหน้า
ความรู้เบื้องต้นเกี่ยวกับคอมพิวเตอร์และเทคโนโลยีสารสนเทศ
การเขียนโปรแกรมแบบวนซ้ำ: คำสั่ง while คำสั่ง do….while
วิธีการกำหนดค่า Microsoft SharePoint ของคุณ เว็บไซต์ออนไลน์
Data storage II Introduction to Computer Science ( )
BC320 Introduction to Computer Programming
Week 5 C Programming.
บทที่7 ทฤษฎีกราฟเบื้องต้น
คำสั่งวนรอบ (Loop).
ความรู้เบื้องต้นเกี่ยวกับจำนวนจริง
Dr.Surasak Mungsing CSE 221/ICT221 การวิเคราะห์และออกแบบขั้นตอนวิธี Lecture 05: การวิเคราะห์ความซับซ้อนของ ขั้นตอนวิธีการเรียงลำดับข้อมูล.
การสร้างแบบสอบถาม และ การกำหนดเงื่อนไข.
ตัวอย่างการจัดทำรายงานการผลิต และงบการเงิน
Data storage II Introduction to Computer Science ( )
Data Structures and Algorithms 2/2561
BASIC STATISTICS MEAN / MODE / MEDIAN / SD / CV.
หน่วยที่ 6 อะเรย์ของอักขระ
บทที่ 9 การเรียงลำดับข้อมูล (Sorting)
Data Structures and Algorithms 2/2561
บทที่ 7 การประมวลผลอาร์เรย์
Tree.
OPERATOR ภาษาปาสคาล (Pascal)
ค่ารูรับแสง - F/Stop ค่ารูรับแสงที่มีค่าตัวเลขต่ำใกล้เคียง 1 มากเท่าไหร่ ค่าของรูรับแสงนั้นก็ยิ่งมีความกว้างมาก เพราะเราเปรียบเทียบค่าความสว่างที่ 1:1.
2 โครงสร้างข้อมูลแบบสแตก (STACK).
กิจกรรมที่ 7 นายปรีชา ขอวางกลาง
บทที่ 2 โครงสร้างข้อมูลแบบแถวลำดับหรืออาร์เรย์ (Array)
Chapter 3 : Array.
Data Structure and Algorithms
Array: One Dimension Programming I 9.
Decision: Single and Double Selection (if and if-else statement)
กระดาษทำการ (หลักการและภาคปฏิบัติ)
ใบสำเนางานนำเสนอ:

โครงสร้างข้อมูลและอัลกอริทึมเบื้องต้น 235012 Sorting โครงสร้างข้อมูลและอัลกอริทึมเบื้องต้น 235012

Topic Selection Sort Bubble Sort Merge Sort Quick Sort Heap Sort

การเรียงข้อมูล ช่วยให้การค้นหาทำได้เร็วขึ้น Sorting การเรียงข้อมูล ช่วยให้การค้นหาทำได้เร็วขึ้น เป็นการสลับตำแหน่งข้อมูลที่เก็บไว้จากน้อยไปมาก (Ascending) หรือมากไปน้อย (Descending) การเรียงแบบเลือก Selection Sort การเรียงแบบฟอง Bubble Sort การเรียงแบบผสาน Merge Sort การเรียงแบบเร็ว Quick Sort การเรียงแบบฮีป Heap Sort

Selection Sort การเรียงแบบเลือก ทำการเปรียบเทียบข้อมูลโดยเริ่มจากตัวแรก เปรียบเทียบกับตัวที่เหลือทีละตัวเพื่อหาค่าน้อยที่สุด ได้ค่าน้อยที่สุดก่อน ทำการสลับกับข้อมูลตำแหน่งแรก ทำกับข้อมูลชุดที่เหลือเหมือนเดิม วนทำต่อไปจนหมดตามจำนวนข้อมูล

* * การเรียงแบบเลือก Selection Sort E A D C E B D C A B A D C E B A B

ตัวอย่าง Selection Sort void selection_sort(char c_array[], int count) { int i, pass, index; char temp; for(pass=0;pass<count-1;pass++) { index=pass; for(i=pass+1;i<count;i++) if(c_array[i]<c_array[index] index=i; if(index!=pass) temp=c_array[pass]; c_array[pass]=c_array[index]; c_array[index]=temp; } }}

Algorithm Analysis Selection Sort มีข้อมูล N ตัว จำนวนครั้งทั้งหมด  (N - 1) + (N – 2) + … + 1 ได้ค่าเป็น Big O O(N2)

การเรียงแบบฟอง Bubble Sort ทำการเปรียบเทียบข้อมูลโดยเริ่มจากตัวท้าย เปรียบเทียบกับตัวก่อนหน้า หากน้อยกว่าทำการสลับ ทำการเลื่อนทำตำแหน่งก่อนหน้า ไปเรื่อยๆ จนถึงตำแหน่งแรก ได้ตำแหน่งแรกเป็นค่าน้อยที่สุด วนรอบทำที่ตำแหน่งสุดท้ายใหม่กับข้อมูลชุดที่เหลือ วนทำต่อไปจนหมดตามจำนวนข้อมูล

การเรียงแบบฟอง Bubble Sort D C A B E D C A B E D A C B E A D C B A E D C B เหมือนฟองอากาศในน้ำ ค่าที่น้อยที่สุดลอยขึ้นข้างบน

ตัวอย่าง Bubble Sort swop void bubble_sort(char c_array[], int count) { int i, index; char temp; for(i=1;i<count;i++) for(index=count-1;index>=i;index--) if(c_array[index]<c_array[index-1]) { temp=c_array[index]; c_array[index]=c_array[index-1]; c_array[index-1]=temp; } swop

ตัวอย่างการเรียงแบบฟองกรณีข้อมูลเกือบเรียง Bubble Sort ตัวอย่างการเรียงแบบฟองกรณีข้อมูลเกือบเรียง C A B E D A C B D E A B C D E ควรมีการตรวจสอบ หากไม่มีการสลับอีกเลยให้เลิกทำ

ตัวอย่าง 2 Bubble Sort void bubble_sort(char c_array[], int count) { int i, index, finish; char temp; finish=0; i=1; while((i<count)&&(finish==0)) { finish=1; for(index=count-1;index>=i;index--) if(c_array[index]<c_array[index-1]) temp=c_array[index]; c_array[index]=c_array[index-1]; c_array[index-1]=temp; finish=0; } i++; }} Exit while loop

Algorithm Analysis Bubble Sort เหมือนกับ Selection Sort มีข้อมูล N ตัว จำนวนครั้งทั้งหมด  (N - 1) + (N – 2) + … + 1 ได้ค่าเป็น Big O O(N2) ยกเว้นกรณีที่มีการใช้ flag : best case เป็น O(N)

การเรียงแบบผสาน ทำการแบ่งข้อมูลเป็นสองส่วน แต่ละส่วนนำไปจัดเรียงกัน Merge Sort การเรียงแบบผสาน ทำการแบ่งข้อมูลเป็นสองส่วน แต่ละส่วนนำไปจัดเรียงกัน นำมาผสานกันโดยไล่ไปยังข้อมูลแต่ละส่วนโดยเลือกค่าน้อยมาก่อน ใช้วิธีการ recursive โดยทำการแบ่งข้อมูลจนเหลือเพียงข้อมูลเดียวแล้วทำการผสานกันกลับขึ้นไป

การเรียงแบบผสาน Merge Sort แบ่งครึ่งจนเหลือข้อมูลย่อยที่สุด A B D E G F C I A B D E G F C I A B D E G F C I A B D E G F C I แบ่งครึ่งจนเหลือข้อมูลย่อยที่สุด

การเรียงแบบผสาน (ต่อ) Merge Sort การเรียงแบบผสาน (ต่อ) A B D E G F C I A B D E F G C I A B D E C F G I A B C D E F G I ทำการผสาน (merge) กลับโดยมีการจัดเรียง

ตัวอย่าง merge sort Merge Sort void merge_sort(array_list *c_arr,int first, int last) { int mid; if(first<last) mid=(first+last)/2; merge_sort(c_arr,first,mid); merge_sort(c_arr,mid+1,last); merge(c_arr,first,mid,mid+1,last); }

ตัวอย่าง merge (1) Merge Sort void merge(char c_arr,int left_first,int left_last,int right_first, int right_last) { char temp[max_c_arr_size]; int index, left_first_idx; index=left_first; left_first_idx=left_first;

ตัวอย่าง Merge (2) Merge Sort while((left_first<=left_last)&&(right_first<=right_last)) { if(c_arr[left_first]<c_arr[right_first]) temp[index]=c_arr[left_first]; left_first++; } else temp[index]=c_arr[right_first]; right_first++; } index++;

ตัวอย่าง Merge (3) Merge Sort while(left_first<=left_last) { temp[index]=c_arr[left_first]; left_first++; index++; } while(right_first<=right_last) { temp[index]=c_arr[right_first]; right_first++; for(index=left_first_idx;index<=right_last;index++) c_arr[index]=temp[index];

Algorithm Analysis Merge Sort นับจำนวนครั้งในการเปรียบเทียบแต่ละชั้น ชั้นแรก เปรียบเทียบ N – 1 ครั้ง จำนวน list 1 ชั้นสอง เปรียบเทียบ N/2 – 1 ครั้ง จำนวน list 2 ชั้นสาม เปรียบเทียบ N/4 – 1 ครั้ง จำนวน list 4 . . . ชั้นก่อนท้าย เปรียบเทียบ 2 – 1 ครั้ง จำนวน list N/2 ชั้นสุดท้าย เปรียบเทียบ 0 ครั้ง จำนวน list N

Merge Sort Algorithm Analysis (2) รวมจำนวนครั้งในการเปรียบเทียบ = (N - 1)*1 + (N/2 – 1)*2 + (N/4 -1)*4 + … +(2-1)*N/2 = N – 1 + N – 2 + N – 4 + … + N – N/2 *จำนวนชั้นเป็น log2N ดังนั้นเมื้อมี N อยู่เท่ากับจำนวนชั้น = N log2N – (1+2+4+…+N/2) = N log2N – (N – 1)  Big O = O(N log2N)

การเพิ่มค่า N Big-O Notation 1.1579E+77 16777216 65536 2048 8 256 2097152 16384 896 7 128 1.8447E+19 262144 4096 384 6 64 2147483648 32768 1024 160 5 32 496 4 16 512 24 3 2 1 N Log2 N N Log2 N N2 N3 2N

การเรียงแบบเร็ว แบ่งข้อมูลเป็นสองส่วนโดยข้อมูลใดข้อมูลหนึ่ง Quick Sort การเรียงแบบเร็ว แบ่งข้อมูลเป็นสองส่วนโดยข้อมูลใดข้อมูลหนึ่ง ทำการสลับเพื่อย้ายข้อมูลให้ข้อมูลที่เลือกไปอยู่ที่จุดแบ่งข้อมูลที่น้อยกว่าอยู่ทางซ้าย ข้อมูลที่มากกว่าอยู่ทางขวา ทำการเรียงข้อมูลที่แบ่งออกมาทั้งซ้ายและขวา วนกระทำจนแบ่งข้อมูลอีกต่อไปไม่ได้

การเรียงแบบเร็ว Quick Sort แบ่งส่วนนำไปทำกระบวนการต่อ Pivot First E B D G A F I C Last A B D C E F I G แบ่งส่วนนำไปทำกระบวนการต่อ

ตัวอย่าง Quick Sort void quick_sort(char c_arr[], int first, int last) { int splitpoint; if(first<last) split(c_arr,first,last,&splitpoint); quick_sort(c_arr,first,splitpoint-1); quick_sort(c_arr,splitpoint,last); }

ตัวอย่าง split (1) Quick Sort void split(char c_arr[], int first, int last, int *splitpoint) { int pivot, first_idx, less_pivot, more_pivot; pivot=c_arr[first]; first_idx=first; first++; do { less_pivot=1; while((first<=last)&&(less_pivot==1)) if(c_arr[first] > pivot) less_pivot=0; else

ตัวอย่าง split (2) Quick Sort more_pivot=1; while((first<=last)&&(more_pivot==1)) if(pivot>c_arr[last]) more_pivot=0; else last--; if(first<last) { swap(&c_arr[first],&c_arr[last]); first++; } }while(first<=last); *splitpoint=last; swap(&c_arr[first_idx],&c_arr[*splitpoint]); }

Quick Sort Algorithm Analysis จำนวนครั้งในการเปรียบเทียบขึ้นอยู่กับลักษณะการจัดเรียงและการเลือก pivot เลือก pivot ได้ค่ากลาง จะได้กรณีดีที่สุดคือแบ่งครึ่งพอดี ได้ O(N log2N) คล้ายกับ Merge Sort เลือก pivot ได้ค่าน้อยหรือมากที่สุดและข้อมูลเรียงกันอยู่แล้ว เป็นกรณีแย่ที่สุดมีการแบ่งทุกครั้ง ได้เป็น O(N2) คล้ายกับ select sort

การเรียงแบบ heap สร้างข้อมูล list ที่ต้องการเรียงให้เป็นต้นไม้ Heap Sort การเรียงแบบ heap สร้างข้อมูล list ที่ต้องการเรียงให้เป็นต้นไม้ สร้างต้นไม้ฮีป สลับ root กับ ท้ายสุด สร้าง heap ใหม่ยกเว้น root ที่สลับไป วนทำเรื่อยๆ จนจบ (หมด node)

การสร้าง binary tree จาก list Heap Sort การสร้าง binary tree จาก list A B D E G F C I สร้างต้นไม้ A B D E G F C I

การสร้าง heap tree คุณสมบัติของ heap tree Heap Sort การสร้าง heap tree คุณสมบัติของ heap tree เป็นต้นไม้ทวิภาค (binary tree) เต็มต้น โหนด Parent ต้องมีค่ามากว่า โหนด Child ต้นไม้ที่ได้จาก list เต็มต้นอยู่แล้ว เพียงแต่ต้องนำมาเรียงโหนดใหม่ให้ parent มากกว่า child

Heap Sort การสร้าง heap tree (2) A B D E G F C I

Heap Sort การสร้าง heap tree (3) A I F E G D C B “Heap Tree”

สลับ root กับ ปลายสุด Heap Sort สร้าง “Heap Tree” ต่อ I G F E A D C B

ตัวอย่าง Heap Sort ทำให้เป็น Heap void heap_sort(char c_arr[], int count) { int i; for(i=(count/2)-1;i>=0;i--) reheap(c_arr, i,count); for(i=count-1;i>=1;i--) swap(&c_arr[0],&c_arr[i]); reheap(c_arr,0,i); } ทำให้เป็น Heap

ตัวอย่าง reheap Heap Sort เทียบหา Child ที่มากกว่า void reheap(char c_arr[], int root, int count) { int maxchild, IsHeap; IsHeap=0; while( ((root+1) * 2 <= count) && (IsHeap==0) ) if((root+1)*2 == count) maxchild=(root+1)*2-1; else if(c_arr[(root+1)*2]>c_arr[(root+1)*2+1]) maxchild=(root+1)*2; เทียบหา Child ที่มากกว่า

ตัวอย่าง reheap (ต่อ) Heap Sort if(c_arr[root]<c_arr[maxchild]) { swap(&c_arr[root],&c_arr[maxchild]); root=maxchild; } else IsHeap=1; } เทียบหา Child ที่มากกว่า กับ root และทำการสลับ

Heap Sort Algorithm Analysis จำนวนครั้งในการทำงานนับจากจำนวนครั้งในการเปรียบเทียบคูณกับรอบการทำงานของการ reheap ครั้งในการเปรียบเทียบเท่ากับ O(N-1) = O(N) จำนวนรอบการทำงานของ reheap เท่ากับความสูง tree เป็น log2N = O(log2N) ดังนั้น Heap Sort เป็น O(N log2N)

Sorting Best Average Worst Summary Algorithm Analysis Sorting Best Average Worst Select O(N2) Bubble Bubble + flag O(N) Merge O(N log2N) Quick Heap

คำถามข้อสงสัย