330 likes | 536 Views
รายวิชา ง40 206 โครงสร้างข้อมูลและขั้นตอนวิธี. โรงเรียนมหิดลวิทยานุสรณ์. ความรู้เบื้องต้นของโครงสร้างข้อมูลและขั้นตอนวิธี. ความหมาย “โครงสร้างข้อมูล”. การรวมประเภทข้อมูล (Data Type) เข้าไว้ด้วยกัน จนกลายเป็นกลุ่มประเภทข้อมูล และมีนิยามความสัมพันธ์ภายในกลุ่มข้อมูลอย่างชัดเจน
E N D
รายวิชา ง40206 โครงสร้างข้อมูลและขั้นตอนวิธี โรงเรียนมหิดลวิทยานุสรณ์
ความรู้เบื้องต้นของโครงสร้างข้อมูลและขั้นตอนวิธีความรู้เบื้องต้นของโครงสร้างข้อมูลและขั้นตอนวิธี
ความหมาย “โครงสร้างข้อมูล” • การรวมประเภทข้อมูล (Data Type) เข้าไว้ด้วยกัน จนกลายเป็นกลุ่มประเภทข้อมูล และมีนิยามความสัมพันธ์ภายในกลุ่มข้อมูลอย่างชัดเจน • การรวมกลุ่มนี้อาจเป็นการรวมกลุ่มกันระหว่างข้อมูลประเภทเดียวกัน ต่างประเภทกัน หรือต่างโครงสร้างข้อมูลกันก็ได้
ความหมาย “อัลกอริธึม” • ลำดับขั้นตอนวิธีในการทำงานของโปรแกรมเพื่อแก้ปัญหาใดปัญหาหนึ่ง ซึ่งถ้าปฏิบัติตามขั้นตอนอย่างถูกต้องแล้ว จะต้องสามารถช่วยแก้ปัญหาหรือประมวลผลตามต้องการได้สำเร็จ
ประเภทของโครงสร้างข้อมูลประเภทของโครงสร้างข้อมูล • ด้านกายภาพ • Primitive Data Type เช่น char, int, float • Structure Data Type เช่น array, struct • ด้านตรรกกะ - Linear Data Structure - Non-linear Data Structure 5 A C K S 3 8 -1 3 4 5 8 12 -1 4 12
วัตถุประสงค์ของการศึกษาโครงสร้างข้อมูลและขั้นตอนวิธีวัตถุประสงค์ของการศึกษาโครงสร้างข้อมูลและขั้นตอนวิธี โปรแกรมทำงานได้อย่างรวดเร็ว ใช้เนื้อที่หน่วยความจำน้อยที่สุด
เทคนิคที่ช่วยในการออกแบบเทคนิคที่ช่วยในการออกแบบ • ผังงาน (Flowchart) • ผังงานระบบ (System Flowchart) • ผังงานโปรแกรม (Program Flowchart) • รหัสเทียม (Pseudocode) • ใช้อธิบายการทำงานของอัลกอริธึม ทำให้ไม่ต้องเขียนอธิบายด้วย code • ไม่ขึ้นกับภาษาคอมพิวเตอร์ภาษาใดภาษาหนึ่ง • อาจเป็นภาษาไทยหรือภาษาอื่นก็ได้ แต่การใช้ภาษาอังกฤษจะสะดวกที่สุด
Pseudocode • เป็นคำสั่งที่มีลักษณะการเขียนใกล้เคียงกับภาษาอังกฤษ แต่มีโครงสร้างเกือบจะเป็นภาษาโปรแกรม เช่น • เริ่มต้นอาจให้มีคำว่า BEGIN จบลงให้ใช้ END • อ่าน เขียนข้อมูลอาจใช้ READ และ PRINT • การทดสอบเงื่อนไขอาจใช้ IF , ELSE , ELSEIF • การทำซ้ำอาจใช้ WHILE , DO ENDWHILE เป็นต้น
ตัวอย่าง Pseudocode BEGIN READ A, B SUM = A+B IF SUM > 10 THEN PRINT SUM ELSE PRINT A-B END
ตัวอย่าง Pseudocode Algorithm arrayMax(A,n) Input: An array A storing n integers. Output: The maximum element in A. currentMax < A[0] for I <- 1 to n-1 do if currentMax < A[i] then currentMax <- A[i] return currentMax
การวิเคราะห์ประสิทธิภาพของอัลกอริธึมการวิเคราะห์ประสิทธิภาพของอัลกอริธึม • Space/Memory : ใช้เนื้อที่ความจำมากน้อยแค่ไหน • Time เวลาที่ใช้ในการประมวลผล
การวิเคราะห์ Space Complexity การวิเคราะห์ว่าจะต้องใช้หน่วยความจำทั้งหมดเท่าไรในการประมวลผลอัลกอริธึมนั้น • รองรับจำนวนข้อมูลที่ส่งเข้ามาประมวลผล (Input Data)ได้มากที่สุดเท่าใด เพื่อให้อัลกอริธึมนั้นสามารถประมวลผลได้อยู่ • ทราบขนาดของหน่วยความจำที่จะต้องใช้ในการประมวลผลอัลกอริธึม เพื่อไม่ให้กระทบกับการทำงานของคนอื่น • เพื่อเลือกคุณลักษณะของคอมพิวเตอร์ที่จะใช้ติดตั้งโปรแกรมที่พัฒนาขึ้นได้อย่างเหมาะสม
องค์ประกอบของ Space Complexity • Instruction Space • จำนวนของหน่วยความจำที่คอมไพเลอร์จำเป็นต้องใช้ขณะทำการคอมไพล์โปรแกรม • Data Space • จำนวนหน่วยความจำที่ต้องใช้สำหรับเก็บค่าคงที่ และตัวแปรทั้งหมดที่ต้องใช้ในการประมวลผลโปรแกรม • Environment Stack Space • จำนวนหน่วยความจำที่ต้องใช้ในการเก็บผลลัพธ์ของข้อมูลเอาไว้ เพื่อรอเวลาที่จะนำผลลัพธ์นั้นกลับไปประมวลผลอีกครั้ง (พบใน recursive function)
Data Space • Static memory allocation จำนวนของหน่วยความจำที่ต้องใช้อย่างแน่นอน ไม่มีการเปลี่ยนแปลง ประกอบด้วยหน่วยความจำที่ใช้เก็บค่าคงที่และตัวแปรประเภท array • เช่น การประกาศตัวแปร int a, b; char s[10], c; • Dynamic memory allocation จำนวนของหน่วยความจำที่ใช้ในการประมวลผลสามารถเปลี่ยนแปลงได้ และจะทราบจำนวนหน่วยความจำที่จะใช้ก็ต่อเมื่อโปรแกรมกำลังทำงานอยู่ • เช่น การใช้ pointer และมีการจองเนื้อที่ในหน่วยความจำด้วยคำสั่ง malloc(); int *p; p = malloc(sizeof(int)*2);
ตัวอย่างการวิเคราะห์ Space Complexity { int num1, num2, temp; temp = num1; num1 = num2; num2 = temp; } ใช้หน่วยความจำ 6 bytes
ตัวอย่างการวิเคราะห์ Space Complexity int factorial(int n) { if (n==0) return 1; else return (n * factorial(n-1)); } ใช้หน่วยความจำ 4 Max{1, n} ค่า 4 คำนวณมาจาก หน่วยความจำสำหรับเก็บ address 2 bytes และตัวแปรชนิด integer อีก 2 bytes
3x2=6 factorial(3) 3 x factorial(2) 2x1=2 factorial(2) 2 x factorial(1) 1x1=1 1 factorial(1) 1 x factorial(0) factorial(0) = 1 หาค่า 4! โดยใช้ recursive 4x6=24 factorial(4) 4 x factorial(3)
การวิเคราะห์ Time Complexity คือ เวลาที่เครื่องคอมพิวเตอร์ต้องใช้ในการประมวลผลอัลกอริธึม วิเคราะห์เพื่อ... • ประมาณเวลาทั้งหมดที่ต้องใช้ในโปรแกรมได้ • มุ่งประเด็นการแก้ไขไปที่อัลกอริธึมที่ใช้เวลาในการประมวลผลนานๆ ทำให้ไม่ต้องแก้ไขทั้งโปรแกรม • โปรแกรมคอมพิวเตอร์ที่ทำงานแบบ Interactive • เลือกคุณลักษณะของคอมพิวเตอร์ที่จะใช้ติดตั้งโปรแกรมที่พัฒนาขึ้นได้อย่างเหมาะสม ??
เวลาในการประมวลผลของโปรแกรมเวลาในการประมวลผลของโปรแกรม • Compile Timeคือ เวลาที่ใช้ในการตรวจสอบไวยากรณ์ (syntax) ของ code ว่าเขียนได้ถูกต้องหรือไม่ • Run Time หรือ Execution Timeคือ เวลาที่เครื่องคอมพิวเตอร์ใช้ในการประมวลผล
การวิเคราะห์ Time Complexity ด้วยวิธีการนับตัวดำเนินการ • แบบ Linear Loops • แบบ Logarithmic Loops • แบบ Nested Loops
แบบ Linear Loops อัลกอริธึมมีการทำงานแบบวนรอบ (Loop) โดยแต่ละ loop จะมีการเพิ่มหรือลดค่าในปริมาณที่คงที่ เช่น x = 1 Loop (x <= 2000) x = x+5 x = 1 Loop (x <= 2000) x = x+1 ถ้าให้ f(n)แทนประสิทธิภาพ และnแทนจำนวนรอบการทำงาน สามารถเขียนเป็นสมการวัดประสิทธิภาพของอัลกอริธึมแบบ Linear loop ได้ดังนี้ f(n) = n
แบบ Logarithmic Loops อัลกอริธึมจะทำงานแบบ Loop โดยการทำงานภายในแต่ละ loop จะเพิ่มหรือลดค่าเป็นเท่าตัว x = 1 Loop (x < 1000) x = x*2 x = 1000 Loop (x >= 1) x = x/2 ถ้าให้ f(n)แทนประสิทธิภาพ และnแทนจำนวนรอบการทำงาน สามารถเขียนเป็นสมการวัดประสิทธิภาพได้ดังนี้ f(n) = [logn]
แบบ Nested Loops คือ อัลกอริธึมที่มี loop ซ้อนอยู่ภายใน loop โดยประสิทธิภาพของอัลกอริธึมก็จะมีค่าเท่ากับจำนวน loop ทั้งหมดที่จะต้องประมวลผล ซึ่งหาได้จากการเอาจำนวน loop ที่ซ้อนกันมาคูณกัน f(n) = n2 f(n) = n3
Big-O Notation • การวิเคราะห์อัลกอริธึม จะใช้วิธีหาจำนวนครั้งของการทำงานของโปรแกรม โดยมักจะสนใจค่าโดยประมาณเท่านั้น ซึ่งจะใช้สัญลักษณ์ว่า O เรียกว่า บิ๊กโอ (big O) ซึ่งเป็นสัญลักษณ์ทางคณิตศาสตร์ที่มาจากคำว่า Order of Magnitude • O(N), O(logN), O(N2), O(1)
Big-O Notation • แนวความคิดของบิ๊กโอ จะดูจากค่าที่มีผลกระทบมากที่สุดเพียงค่าเดียว • ค่าอื่นๆที่เกี่ยวข้องจะมีผลต่อฟังก์ชันน้อยกว่า จึงไม่สนใจ และไม่สนใจค่าคงที่ด้วย ตัวอย่าง หาค่าบิ๊กโอของ N4 + 10N – 5 ถ้า f(N) = N4 + 10N – 5 O(f(N)) = O(N4)
ตัวอย่าง หาค่าบิ๊กโอของ 100N +1 ถ้า f(N) = 100N +1 O(f(N)) = O(N) ตัวอย่าง หาค่าบิ๊กโอของ N/5 +100 ถ้า f(N) = N/5 +100 O(f(N)) = O(N)
ตัวอย่าง หาค่าบิ๊กโอของ N3 + 2N3 + 10 ถ้า f(N) = N3 + 2N3 + 10 O(f(N)) = O(N3) ตัวอย่าง หาค่าบิ๊กโอของ 100 ถ้า f(N) = 100 O(f(N)) = O(1)
การวิเคราะห์ความเร็วของ Algorithm เร็ว ช้า
2n n2 n3 n log n n log n
Running time calculations A simple Example int sum(int n) { int i, partialSum; partialSum = 0; //1 for(i=1;i<N;i++) //2 partialSum += i*i*i; //3 return partialSum; } -> Count for 1 unit per time executed -> Count for 2N+1 units -> 4N units The total is 6N+2 This function is O(N)
Running time calculations A simple Example int factorial(int n) { int fac if((n==0)||(n=1)) fac = 1; else fac = n*factorial(n-1); } -> Running time = 1 -> เรียกตัวเอง N ครั้ง This function is O(N)