ผลต่างระหว่างรุ่นของ "204512-53/lecture1"
Rtsp (คุย | มีส่วนร่วม) ล |
Rtsp (คุย | มีส่วนร่วม) |
||
แถว 39: | แถว 39: | ||
# นำของไปใส่จนเต็ม | # นำของไปใส่จนเต็ม | ||
# จองพื้นที่เพิ่มสำหรับใส่ของ | # จองพื้นที่เพิ่มสำหรับใส่ของ | ||
− | |||
− | + | =====กรณี 1: จองแบบเพิ่มทีละ 1 ที่===== | |
+ | [[Image:204512-53-01-malloc-table-1.png]] | ||
+ | |||
+ | จากภาพการเก็บ สามารถวิเคราะห์ได้ว่า | ||
* การจองใช้เวลา 1 หน่วย | * การจองใช้เวลา 1 หน่วย | ||
* การคัดลอกต้องคัดลอก i - 1 ตัวดังนั้นใช้เวลา i - 1 หน่วย | * การคัดลอกต้องคัดลอก i - 1 ตัวดังนั้นใช้เวลา i - 1 หน่วย | ||
แถว 53: | แถว 55: | ||
= <math>(1 + 2 + 3 + ... + n) + n</math> หน่วย | = <math>(1 + 2 + 3 + ... + n) + n</math> หน่วย | ||
− | ดังนั้นการถ้ามีข้อมูล n ตัวจะได้ว่าต้องใช้ <math>\ | + | ดังนั้นการถ้ามีข้อมูล n ตัวจะได้ว่าต้องใช้ <math>\frac{n*(n+1) + n}{2}</math> หน่วย หรือ O(<math>n^2</math>) |
+ | |||
+ | =====กรณี 2: จองแบบเพิ่มทีละ 3 ที่===== | ||
+ | |||
+ | [[Image:204512-53-01-malloc-table-2.png]] | ||
+ | |||
+ | จากภาพการเก็บ สามารถวิเคราะห์ได้ว่าจะยังได้ผลลัพธ์ไม่ต่างจากเดิมมาก คือ O(<math>n^2</math>) โดย n ในที่นี้เทียบได้กับ <math>\frac{n}{3}</math> ของตัวอย่างบน มาจาก <math>n + 3*\frac{n*(n+1)}{2} + 3*n</math> ซึ่งมี factor 3 เพิ่มเข้ามา | ||
+ | |||
+ | =====กรณี 3: จองแบบเพิ่มทีละ <math>2^k</math> ที่===== | ||
+ | |||
+ | ต่อมามีคนเสนอว่าถ้าลองจองเป็นแบบ <math>2^k</math> โดยที่ k หมายถึงการจองครั้งที่ k และค่า k เริ่มต้นจาก 0 เพื่อเป็นการตัดปัญหา ว่ากรณ๊ถ้าจองไม่เต็มจะทำอย่างไร เราจึงสมมุติไปเลยว่าการจองที่ n นั้นจะต้องจอง <math>n = 2^k</math> โดย k นั้นคือเลขจำนวนเต็มใดๆที่มากกว่า 0 ซึ่งถ้า <math>n < 2^k</math> อาจหมายถึงการแถมเวลาให้เต็ม <math>n = 2^k</math> เลยก็ได้ | ||
+ | |||
+ | [[Image:204512-53-01-malloc-table-3.png]] | ||
+ | |||
+ | จากภาพการเก็บ สามารถวิเคราะห์ได้ว่า | ||
+ | * จะได้ว่ามีการจองข้อมูลเกิดขึ้นทั้งหมด k ครั้ง | ||
+ | * มีการเขียนข้อมูล <math>n(2^{k})</math> ครั้ง | ||
+ | * มีการคัดลอกข้อมูล <math>1+2+4+8+...+2^{k-1} = (2^k)-1</math> (มองง่ายๆให้มองเป็นการบวกเลข binary) | ||
+ | |||
+ | ดังนั้นจะได้ k<math> + 2^{k} + 2^{k} -1 = O(n)</math> | ||
− | [[ | + | [[Image:Tree.png]] |
รุ่นแก้ไขเมื่อ 12:33, 1 กรกฎาคม 2553
บันทึกคำบรรยายวิชา 204512-53 นี้ เป็นบันทึกที่นิสิตเขียนขึ้น เนื้อหาโดยมากยังไม่ผ่านการตรวจสอบอย่างละเอียด การนำไปใช้ควรระมัดระวัง
จดบันทึกคำบรรยายโดย: (กรุณาใส่ด้วย) Algorithm Lecture #1
Course Information
รายละเอียดวิชาสามารถดูได้ที่ http://www.cpe.ku.ac.th/~jtf/wiki/doku.php?id=01204512-53
เกณฑ์การให้คะแนน
- Homework 15%
- Project 15%
- Scribe Note 5%
- Mid-Term 2 Times 20*2%
- Final 25%
Introduction to Algorithm
ทำไมเราต้องวิเคราะห์อัลกอริทึม
- เพื่อความถูกต้องของอัลกอริทึม - ต้องการความแน่ใจ
- เพื่อประสิทธิภาพของอัลกอริทึม
- เวลา (time)
- พื้นที่ (space)
- คุณภาพคำตอบ (quality)
เนื้อหาแต่ละบทที่จะสอน ตามลำดับ
- Data Structure
- Graph Algorithm
- Dynamic Programming
- Linear Programming
- Randomize Algorithm
Data Structure
ตัวอย่างปัญหาที่ 1
การจองอาเรย์ให้เหมาะสมกับขนาดข้อมูลที่บรรจุ โดยกำหนดให้มีขั้นตอน การทำงานดังนี้
- จองพื้นที่สำหรับใส่ของ
- นำของไปใส่จนเต็ม
- จองพื้นที่เพิ่มสำหรับใส่ของ
กรณี 1: จองแบบเพิ่มทีละ 1 ที่
จากภาพการเก็บ สามารถวิเคราะห์ได้ว่า
- การจองใช้เวลา 1 หน่วย
- การคัดลอกต้องคัดลอก i - 1 ตัวดังนั้นใช้เวลา i - 1 หน่วย
- การนำข้อมูลใหม่ไปใส่ใช้เวลาอีก 1 หน่วย
จะเห็นได้ว่าในการสร้างอาเรย์เก็บข้อมูล n ตัวจะต้องใช้เวลาทั้งหมด
= หน่วย = หน่วย = หน่วย
ดังนั้นการถ้ามีข้อมูล n ตัวจะได้ว่าต้องใช้ หน่วย หรือ O()
กรณี 2: จองแบบเพิ่มทีละ 3 ที่
จากภาพการเก็บ สามารถวิเคราะห์ได้ว่าจะยังได้ผลลัพธ์ไม่ต่างจากเดิมมาก คือ O() โดย n ในที่นี้เทียบได้กับ ของตัวอย่างบน มาจาก ซึ่งมี factor 3 เพิ่มเข้ามา
กรณี 3: จองแบบเพิ่มทีละ ที่
ต่อมามีคนเสนอว่าถ้าลองจองเป็นแบบ โดยที่ k หมายถึงการจองครั้งที่ k และค่า k เริ่มต้นจาก 0 เพื่อเป็นการตัดปัญหา ว่ากรณ๊ถ้าจองไม่เต็มจะทำอย่างไร เราจึงสมมุติไปเลยว่าการจองที่ n นั้นจะต้องจอง โดย k นั้นคือเลขจำนวนเต็มใดๆที่มากกว่า 0 ซึ่งถ้า อาจหมายถึงการแถมเวลาให้เต็ม เลยก็ได้
จากภาพการเก็บ สามารถวิเคราะห์ได้ว่า
- จะได้ว่ามีการจองข้อมูลเกิดขึ้นทั้งหมด k ครั้ง
- มีการเขียนข้อมูล ครั้ง
- มีการคัดลอกข้อมูล (มองง่ายๆให้มองเป็นการบวกเลข binary)
ดังนั้นจะได้ k