510 likes | 777 Views
Data Structure. โครงสร้าง ข้อมูล. ความหมาย “โครงสร้างข้อมูล”. การรวมประเภทข้อมูล (Data Type) เข้าไว้ด้วยกัน จนกลายเป็นกลุ่มประเภทข้อมูล และมีนิยามความสัมพันธ์ภายในกลุ่มข้อมูลอย่างชัดเจน
E N D
Data Structure โครงสร้างข้อมูล
ความหมาย “โครงสร้างข้อมูล” การรวมประเภทข้อมูล (Data Type) เข้าไว้ด้วยกัน จนกลายเป็นกลุ่มประเภทข้อมูล และมีนิยามความสัมพันธ์ภายในกลุ่มข้อมูลอย่างชัดเจน การรวมกลุ่มนี้อาจเป็นการรวมกลุ่มกันระหว่างข้อมูลประเภทเดียวกัน ต่างประเภทกัน หรือต่างโครงสร้างข้อมูลกันก็ได้
Algorithm • ลำดับขั้นตอนวิธีการในการทำงานของโปรแกรมเพื่อช่วยแก้ปัญหาใดปัญหาหนึ่ง ซึ่งถ้าปฏิบัติตามขั้นตอนอย่างถูกต้องแล้ว จะสามารถช่วยแก้ปัญหาหรือประมวลผลตามต้องการได้สำเร็จ
การเขียนโปรแกรมโดยทั่วไปการเขียนโปรแกรมโดยทั่วไป • Program = Data Structure + Algorithm
ความหมายของโครงสร้างข้อมูลความหมายของโครงสร้างข้อมูล • โครงสร้างข้อมูล (Data Structure)คือ ความสัมพันธ์ระหว่างข้อมูลที่อยู่ในโครงสร้างนั้นๆ รวมทั้งกระบวนการในการจัดการข้อมูลในโครงสร้าง เช่น เพิ่ม แก้ไข ลบ ตัวอย่างของโครงสร้างข้อมูลประเภทต่างๆ ได้แก่ แถวลำดับ ลิงลิสต์ สแตก คิว ทรี และกราฟ.
ประเภทของโครงสร้างข้อมูลประเภทของโครงสร้างข้อมูล
โครงสร้างข้อมูลทางกายภาพ(Physical Data Structure)
โครงสร้างข้อมูลที่ใช้โดยทั่วไปในภาษาคอมพิวเตอร์ แบ่งออกเป็น 2 ประเภท • 1.ข้อมูลเบื้องต้น (Primitive Data Types) • - จำนวนเต็ม (Integer) • - จำนวนทศนิยม (Floating point) • - ข้อมูลบูลีน (Boolean) • - จำนวนจริง (Real) • - ข้อมูลอักขระ (Character) • 2.ข้อมูลโครงสร้าง (Structure Data Types) • - แถวลำดับ (Array) • - ระเบียนข้อมูล (Record) • - แฟ้มข้อมูล (File)
โครงสร้างข้อมูลทางตรรกะ (Logical Data Structure)
การดำเนินการกับโครงสร้างข้อมูล(Data Structure Operation) • วิธีดำเนินการกับข้อมูลที่นิยมใช้กันมากมี 4 แบบ คือ • 1. การเข้าถึงเรคคอร์ด (Traversing) • 2. การค้นหา (Searching) • 3. การเพิ่ม (Inserting) • 4. การลบ (Deleting) การจัดการกับข้อมูลอีก 2 อย่าง คือ • 1. การเรียงข้อมูล (Sorting) • 2. การรวมข้อมูล (Merging
การแทนที่ข้อมูลในหน่วยความจำมี 2 วิธี • การแทนที่ข้อมูลแบบสแตติก (Static Memory Representation) เป็น การแทนที่ข้อมูลที่มีการจองเนื้อที่แบบคงที่แน่นอน ต้องมีการกำหนดขนาดก่อนการใช้งาน แต่มีข้อเสีย คือ ไม่สามารถปรับขนาดให้เพิ่มขึ้นหรือลดลงได้ โครงสร้างข้อมูลที่มีการแทนที่หน่วยความจำหลักแบบสแตติก คือแถวลำดับ (Array) • การแทนทีข้อมูลแบบไดนามิก (Dynamic Memory Representation) เป็น การแทนที่ข้อมูลที่ไม่ต้องจองเนื้อที่ ขนาดของเนื้อที่ยืดหยุ่นได้ ตามความต้องการของผู้ใช้ โครงสร้างข้อมูลที่มีการแทนที่หน่วยความจำหลักแบบไดนามิก คือ ตัวชี้หรือพอยเตอร์ (Pointer)
ลักษณะของโปรแกรมแบบที่มีโครงสร้างที่ดีลักษณะของโปรแกรมแบบที่มีโครงสร้างที่ดี • โครงสร้างโปรแกรมแบบคำสั่งตามลำดับ เป็น โครงสร้างพื้นฐานที่ประกอบด้วยคำสั่งทั่วๆไป เป็นโครงสร้างที่มีลักษณะการทำงานแบบเรียงลำดับ คือ จะทำงานตั้งแต่ต้นจนจบโดยไม่มีการข้ามขั้นตอนใดๆ • โครงสร้างโปรแกรมแบบมีการตัดสินใจ (Decision) มี การตรวจสอบเงื่อนไข เพื่อตัดสินใจว่าจะทำการประมวลผลส่วนใด โดยผลลัพธ์ของเงื่อนไขจะมีค่าของความเป็นไปได้อยู่ 2 ลักษณะ คือ จริงและเท็จ เท่านั้น • โครงสร้างโปรแกรมแบบเป็นวงจรปิด (Loop) มีลักษณะการทำงานซ้ำๆกัน อยู่ในส่วนใดส่วนหนึ่งของโปรแกรม
อัลกอริทึม (Algorithm) • อัลกอรึทึม คือ วิธีการแก้ปัญหาต่างๆ อย่างมีระบบ มีลำดับขั้นตอนตั้งแต่ต้นจนได้ผลลัพธ์ สามารถเขียนได้หลายแบบ การเลือกใช้ต้องเลือกใช้ขั้นตอนวิธีที่เหมาะสม กระชับ และรัดกุม • อัลกอริทึมที่นิยมใช้กันมาก ได้แก่ 1. อัลกอริทึมแบบแตกย่อย (Divide and conquer) 2. อัลกอริทึมแบบเคลื่อนที่ (Dynamic Programming) 3. อัลกอริทึมแบบทางเลือก (Greedy Algorithm)
ประโยชน์ของโครงสร้างข้อมูลและอัลกอริทึมประโยชน์ของโครงสร้างข้อมูลและอัลกอริทึม • เพื่อให้ได้เขียนอัลกอริทึมที่ฉลาดออกมา • นำอัลกอริทึมที่ได้มาประยุกต์ใช้งานร่วมกับโปรแกรมคอมพิวเตอร์ที่เราเขียนขึ้นมา • เพื่อเพิ่มประสิทธิภาพในการทำงานให้กับโปรแกรม • ช่วยลดหน่วยความจำที่ใช้งานในระหว่างการประมวลผล
ในการเขียนอัลกอริทึมสามารถเขียนได้หลายแบบในการเขียนอัลกอริทึมสามารถเขียนได้หลายแบบ • เช่น Flowchart Pseudo และ การภาษาคอมพิวเตอร์ • ผังงาน (Flowchart) • ผังงานระบบ (System Flowchart) • ผังงานโปรแกรม (Program Flowchart) • รหัสเทียม (Pseudocode) • ใช้อธิบายการทำงานของอัลกอริธึม ทำให้ไม่ต้องเขียนอธิบายด้วย code • ไม่ขึ้นกับภาษาคอมพิวเตอร์ภาษาใดภาษาหนึ่ง • อาจเป็นภาษาไทยหรือภาษาอื่นก็ได้ แต่การใช้ภาษาอังกฤษจะสะดวกที่สุด
เริ่มต้น เริ่มต้น รับค่า n1 a=7 รับค่า n2 b=5 no no n1 > n2 n1 == n2 yes yes sum=a+b พิมพ์ n1 พิมพ์ n1 = n2 พิมพ์ n2 พิมพ์ sum สิ้นสุด สิ้นสุด
รหัส Pseudo (Pseudo-Code) อ่านว่า “ซูโดโค้ด”) • ใช้สำหรับอธิบายลักษณะโครงสร้างข้อมูลและการทำงานของอัลกอริทึมทีเราเขียนขึ้นมา ทำให้ไม่ต้องอธิบายด้วย code ของภาษาคอมพิวเตอร์ใดภาษาหนึ่ง มีความยืดหยุ่นทางไวยากรณ์ (Syntax) • ช่วยให้ผู้ที่ไม่เคยเขียนโปรแกรมมาก่อนสามารถเข้าใจโครงสร้างข้อมูลและการทำงานของอัลกอริทึมที่เราเขียนได้โดยง่าย
Pseudocode • เป็นคำสั่งที่มีลักษณะการเขียนใกล้เคียงกับภาษาอังกฤษ แต่มีโครงสร้างเกือบจะเป็นภาษาโปรแกรม เช่น • เริ่มต้นอาจให้มีคำว่า BEGIN จบลงให้ใช้ END • อ่าน เขียนข้อมูลอาจใช้ READ และ PRINT • การทดสอบเงื่อนไขอาจใช้ IF , ELSE , ELSEIF • การทำซ้ำอาจใช้ WHILE , DO ENDWHILE เป็นต้น
pseudo code ตั้งค่า total ให้เป็นศูนย์ ตั้งค่า counter ให้เป็นหนึ่ง ขณะที่ counter น้อยกว่าหรือเท่ากับ 10 รับคะแนนค่าต่อไป บวกคะแนนเข้ากับ total เพิ่มค่าของ counter ขึ้นหนึ่ง ให้ average เท่ากับ total หารด้วย 10 พิมพ์ค่า average โปรแกรม int main() { int counter, score, total, average; total = 0; counter = 1; while (counter <= 10) { printf("Enter score: "); scanf("%d", &score); total = total + score; counter = counter + 1; } average = total / 10; printf("Class average is %d\n", average); return 0; /* indicate program ended successfully */ }
ให้คำนวณพื้นที่แต่ละชนิดต่อไปนี้ : พื้นที่สี่เหลี่ยม, พื้นที่สามเหลี่ยม พื้นที่รูปวงกลม โดยรับข้อมูลที่เกี่ยวข้องจากผู้ใช้นำเข้าทางแป้นพิมพ์ แสดงขนาดของข้อมูลที่ใส่ พร้อมทั้งจำนวนเนื้อที่ที่คำนวณได้ รับค่าการกดเพื่อเลือกการคำนวณ กด 1 คำนวณพื้นที่สี่เหลี่ยม : รับค่าความกว้าง รับค่าความยาว คำนวณพื้นที่สี่เหลี่ยม พิมพ์ค่าพื้นที่ กด 2 คำนวณพื้นที่สามเหลี่ยม : รับค่าฐาน รับค่าความสูง คำนวณพื้นที่สามเหลี่ยม พิมพ์ค่าพื้นที่ กด 3 คำนวณพื้นที่วงกลม : รับค่ารัศมี คำนวณพื้นที่วงกลม พิมพ์ค่าพื้นที่
เริ่มต้น no no no กด 1 กด 2 กด 3 รับค่าการกด yes yes yes รับค่าความกว้าง รับค่าฐาน รับค่ารัศมี รับค่าความยาว รับค่าความสูง คำนวณพ.ท. สี่เหลี่ยม คำนวณพ.ท. สามเหลี่ยม คำนวณพ.ท. วงกลม พิมพ์พ.ท. พิมพ์พ.ท. พิมพ์พ.ท. สิ้นสุด
EX การเขียน Pseudo-code Algorithms Summation • sum = 0 • Input (value1) • Input (value2) • Input (value3) • Sun = value1 + value2 + value3 • Output(sum) End.
EX Algorithm1 #include<stdio.h> #include<stdlib.h> #include<conio.h> #include<time.h> Main() { int Temp[24]; int i; : : } Program Temp; Use Crt; Var Temp : Array[1..24] of integer; i : integer; Begin : : End.
EX Algorithm2 #include<stdio.h> #include<stdlib.h> #include<conio.h> #include<time.h> Main() { int num1,num2,Temp; : : } Program Temp; Use Crt; Var num1,num2,Temp : integer; Begin : : End.
EX Algorithm3 Step1 : set n variable of integer Step2 : if n =0 then factorial =1 Step3 : else factorial = n * factorial(n-1) Step4 : End of if structure
sum =0 ; • for ( i=1 ; i <= n ; i++) • for ( j =1 ; j <= i ; j++ ) • if ( j mod i == 0 ) • for ( k=0 ; k < j ; k++ ) • sum =sum + 1 ; • end for • end if • end for • end for • ถ้า n มีค่าเท่ากับ 10 หลังจากจบการทำงานแล้ว sum มีค่าเป็นเท่าใด
โครงสร้างข้อมูล / ชนิดของข้อมูล • Bit • Byte • Integer • Real • Character
ประเภทของโครงสร้างข้อมูลประเภทของโครงสร้างข้อมูล • โครงสร้างข้อมูลเบื้องต้น (Primitive Data Structrue) หรือเรียกว่า ข้อมูลพื้นฐาน (Base Type) ได้แก่ เลขจำนวนเต็ม เลขทศนิยม บูลีน ตัวอักษร • โครงสร้างข้อมูลเรียบง่าย (Simple Data Structure) รูปแบบง่ายไม่ซับซ้อน เช่น อาร์เรย์ สตริง เรคคอร์ด
Linear Data Structure • โครงสร้างข้อมูลซับซ้อน แบ่งออกเป็น • เชิงเส้น (Line Data Structure) สมาชิกจะเรียงต่อกันในแนวเส้น ได้แก่ สแตก คิว ลิงค์ลิสต์ • ไม่เป็นเชิงเส้น (Nonlinear Data Structure ) สมาชิกแยกออกเป็นสองเรียกว่าเรียงแบบไบนารี (Binary) ได้แก่ ไบนารีทรี ไบนารีเสริ์ซทรี และสมาชิกมีการแยกออกเป็นหลายทาง เรียกว่า N-อาร์เรย์ ได้แก่ กราฟ ทรี เสริ์ซทรี M- ทาง
โครงสร้างการจัดการแฟ้มข้อมูลโครงสร้างการจัดการแฟ้มข้อมูล • สำหรับเก็บข้อมูลไว้ในหน่วยความจำสำรอง ได้แก่ • แฟ้มข้อมูลลำดับ • แฟ้มข้อมูลโดยตรง • แฟ้มข้อมูลลำดับเชิงดัชนี • แฟ้มข้อมูลหลายคีย์
โครงสร้างข้อมูลกับการเขียนโปรแกรมโครงสร้างข้อมูลกับการเขียนโปรแกรม • ภาษาโปรแกรม (Programming Language) ช่วยให้ผู้เขียนโปรแกรมสามารถกำหนดโครงสร้างข้อมูลที่มีความหมายให้กับตัวแปร • ภาษาโปรแกรมแต่ละภาษาจะมีแนวทางที่แตกต่างกันในการกำหนดโครงสร้างให้กับข้อมูล
ขั้นตอนในการพัฒนาโปรแกรมทางคอมพิวเตอร์ขั้นตอนในการพัฒนาโปรแกรมทางคอมพิวเตอร์ • วิเคราะห์งาน (Job Analysis ) • เขียนโปรแกรมด้วยภาษาใด ๆ (Programming) • ทดสอบ /แก้ไขโปรแกรม (Testing and Debugging) • ติดตั้งโปรแกรม (Installation) • ดูแลรักษาโปรแกรม (Maintenance )
วิเคราะห์งาน (Job Analysis ) • กำหนดสิ่งที่โจทย์ต้องการ • กำหนดรูปแบบผลลัพธ์ • กำหนดข้อมูลนำเข้า • กำหนดตัวแปรที่ใช้ในการประมวลผล • กำหนดวิธีการประมวลผล
แบบฝึกหัด ต้องการเขียนโปรแกรมเพื่อคำนวณหาพื้นที่วงกลมใด ๆ สี่เหลียม สามเหลี่ยม จงวิเคราะห์งานจากโจทย์ข้างต้นโดยใช้ Flowchart ,Pseudo และการภาษาใด ๆ
การวิเคราะห์ประสิทธิภาพของอัลกอริทึมการวิเคราะห์ประสิทธิภาพของอัลกอริทึม • การเขียนโปรแกรมคอมพิวเตอร์สิ่งที่สำคัญที่ต้องคำนึงถึงคือ ผลลัพธ์ของโปรแกรมที่ถูกต้อง และแก้ปัญหาโจทย์ได้ และใช้เวลาในการประมวลผลไม่นานจนเกินไป • ประสิทธิภาพของอัลกอริทึม พิจารณา 2 ส่วนหลักคือ • หน่วยความจำ (Memory) ที่ต้องใช้ในการประมวลผล • เวลา (Time) ที่ต้องใช้ในการประมวลผล
การประเมินประสิทธิภาพของอัลกอริทึม 2 วิธีคือ • วิธีวิเคราะห์ประสิทธิภาพของอัลกอริทึม (Performance Analysis) จะใช้วิธีวิเคราะห์วิธีการทำงาน (Method) ของอัลกอริทึม • วิธีวัดประสิทธิภาพของอัลกอริทึม (Performance Measurement) จะการวัดผลจากการทดลองจริง
วิธีวิเคราะห์ประสิทธิภาพของอัลกอริทึม (Performance Analysis) • แบ่งออกเป็น 2 ส่วน • วิเคราะห์หน่วยความจำที่ต้องใช้ในการประมวลผลเรียกว่า Space Complexity • วิเคราะห์เวลาที่ต้องประมวลผล เรียกว่า Time Complexity
การวิเคราะห์ Space Complexity • การวิเคราะห์ว่าต้องใช้หน่วยความจำเท่าไรในการประมวลผลอัลกอริทึมนั้น • ทำให้ทราบว่าอัลกอริทึมสามารถรองรับกับจำนวนข้อมูลที่ส่งเข้ามา Input Data สูงสุดขนาดไหน เพื่อให้อัลกอริทึมยังคงประมวลผลได้อยู่ • กรณีนำอัลกอริทึมไปประมวลผลในเครื่องคอมพิวเตอร์ที่ใช้งานร่วมกันหลายผ่านเครือข่าย (Multi User) เพื่อไม่ให้ไปกระทบกับการทำงานของคนอื่น
การวิเคราะห์ Space Complexity ต่อ • เพื่อเลือกสเปคของเครื่องคอมพิวเตอร์สำหรับนำโปรแกรมไปติดตั้งได้อย่างเหมาะสม • คอมพิวเตอร์บางระบบต้องทราบว่าต้องใช้หน่วยความจำเท่าไรเพื่อให้เพียงพอในการประมวลผล
องค์ประกอบของ Space Complexity • Instruction Space จำนวนหน่วยความจำที่คอมไพลเลอร์ จำเป็นต้องทราบระหว่างทำการคอมไพล์ (Compile) โปรแกรม • Data Space จำนวนหน่วยความจำที่ต้องให้สำหรับค่าคงที่ และตัวแปรทั้งหมดที่ต้องใช้ในการประมวลผล • หน่วยความจำแบบ Staticจำนวนหน่วยความจำแน่นอน ได้แก่ หน่วยความจำสำหรับเก็บค่าคงที่และตัวแปรประเภทอาร์เรย์ • หน่วยความจำแบบ Dynamicหน่วยความจำที่สามารถเปลี่ยนแปลงได้และจะทราบเมื่อโปรแกรมทำงานอยู่ • Environment Stack Space จำนวนหน่วยความจำที่ใช้เก็บผลลัพธ์เพื่อรอนำกลับไปประมวลผลอีก
การวิเคราะห์ Time Complexity • คือการวิเคราะห์เวลาที่เครื่องคอมพิวเตอร์ใช้ในการประมวลผลอัลกอริทึม • เพื่อให้ทราบเวลาที่เครื่องคอมพิวเตอร์ใช้ในการประมวลผลอัลกอริทึมในแต่ละอัลกอริทึมสามารถประมาณเวลาทั้งหมดที่ต้องใช้ในโปรแกรมได้ • งานที่ต้องการประมวลผลแบบ Real-Timeและโปรแกรมที่ประมวลผลแบบ Interactiveสามารถเลือกอัลกอริทึมที่ใช้เวลาในการประมวลผลน้อยที่สุดได้
การวิเคราะห์ Time Complexity ต่อ • สามารถเลือกสเปคคอมพิวเตอร์มาใช้ในการประมวลผลโปรแกรมได้อย่างเหมาะสม • สามารถแก้โปรแกรมเป็นจุด ๆ ได้ ไม่ต้องเสียเวลาแก้ทั้งโปรแกรม • สามารถประกอบการตัดสินใจเลือกอัลกอริทึมที่ดีที่สุด (ใช้หน่วยความจำและเวลาที่น้อยที่สุด) กรณีเขียนอัลกอริทึมได้มากกว่า 1แบบ
องค์ประกอบของ Time Complexity • หลักในการพิจารณาเรื่องเวลา: • โปรแกรมจะสามารถประมวลผลได้เร็วเมื่ออยู่บนเครื่องคอมพิวเตอร์ที่มีความเร็วในการประมวลผลสูงกว่า • ถ้าใช้คอมไพลเลอร์ตัวเดียวกัน code ที่สั้นกว่าย่อมใช้เวลาประมวลผลน้อยกว่า • ตัวแปรที่มีจำนวน byteน้อยกว่าประมวลผลได้เร็วกว่า
เวลาที่ต้องใช้ในการประมวลผลเวลาที่ต้องใช้ในการประมวลผล • Compile Time คือเวลาที่ใช้ในการตรวจสอบไวยากรณ์ (Syntax)ของ Code • Run Time หรือ Execution Time เวลาที่เครื่องคอมพิวเตอร์ใช้ในการทำงาน ขึ้นอยู่กับจำนวนตัวแปรและคุณลักษณะของตัวแปรที่เราใช้ในโปรแกรม
การนับตัวดำเนินการ(Operation Counts) • แบบ Linear Loop อัลกอริทึมแบบวนรอบ (Loop)และภายใน Loop จะมีการลดหรือเพิ่มค่าแบบคงที่ i = 1 Loop (i <= 2000) another code i= i+1 i = 1 Loop (i <= 2000) another code i= i+2 สมการวัดประสิทธิภาพของLinear Loop คือ f(n) = n
การนับตัวดำเนินการ (Operation Counts) • แบบ Logarithmic Loops การทำงานภายใน Loop จะเป็นการลดหรือเพิ่มค่าแบบเท่าตัว i = 1 Loop (i < 1000) another code i= i*2 i = 1 Loop (i >= 1) another code i= i/2 สมการวัดประสิทธิภาพของ Logarithmic Loops คือ f(n) = [Log 2 n]
การนับตัวดำเนินการ (Operation Counts) • แบบ Nested Loops คือ Loop ซ้อนอยู่ภายใน Loop • จำนวนรอบทั้งหมด = จำนวนรอบของ Loopชั้นนอก x จำนวนรอบของ Loopชั้นใน
แบบ Linear Logarithmic i = 1 Loop (i <= 20) j= 1 Loop (j <= 10) another code j = j * 2 i= i+1; สมการวัดประสิทธิภาพของ Nested Loops คือ f(n) = [nLog 2 n]
แบบ Dependent Quadratic i = 1 Loop (i <= 10) k = 1 Loop (k <= i) another code k = k+1 i= i+1 สมการวัดประสิทธิภาพของ Dependent Quadraticคือf(n) = n 2
แบบ Quadratic • i = 1 • Loop (i <= 10) • k= 1 • Loop (k <= 10) • another code • k = k +1 • i= i+1;