Algorithm Analysis (การวิเคราะห์อัลกอริทึม)
วิเคราะห์ประสิทธิภาพได้ 2 ช่วง:
- A Priori Analysis (ทฤษฎี): วิเคราะห์ก่อนเขียนโค้ด สมมติ Factor ภายนอก (CPU speed) คงที่
- A Posteriori Analysis (ทดลองจริง): เขียนโค้ดรันจริง วัด Running Time และ Memory จริง
Algorithm Complexity (ความซับซ้อนของอัลกอริทึม)
X = อัลกอริทึม, N = ขนาด Input
2 ปัจจัยหลัก: Time Factor และ Space Factor
Time Factor
นับจำนวน Key Operations (เช่น การเปรียบเทียบใน Sorting)
Space Factor
นับ Maximum Memory Space ที่อัลกอริทึมต้องการ
Complexity f(N) = Running Time และ/หรือ Storage Space ที่ต้องการ เทียบกับขนาด Input N
Space Complexity (ความซับซ้อนด้านพื้นที่)
หน่วยความจำที่อัลกอริทึมใช้ตลอดชีวิต =
- Fixed Part: ตัวแปรคงที่, ขนาดโปรแกรม, ค่าคงที่ - ไม่ขึ้นกับขนาดปัญหา
- Variable Part: ขึ้นกับขนาดปัญหา - Recursion Stack, Dynamic Allocation
S(p) = A + S_p(I) โดย A = Fixed Part, S_p(I) = Variable Part ขึ้นกับ Instance I
ตัวอย่าง: SUM(P, Q)
Step 1: START Step 2: R ← P + Q + 10 Step 3: STOP
ตัวแปร: P, Q, R (3 ตัว) + ค่าคงที่ 1 → S(p) = 1 + 3 = 4 หน่วย (คูณด้วยขนาด Data Type)
Time Complexity (ความซับซ้อนด้านเวลา)
เวลาที่อัลกอริทึมใช้รันจนเสร็จ แทนด้วย t(N) = จำนวน Steps (แต่ละ Step ใช้เวลาคงที่)
ตัวอย่าง: บวกจำนวนเต็ม n-bit
ใช้ n Steps → t(N) = c × n (c = เวลาบวก 1 bit) → Linear Growth O(n)
สรุป Big-O Notation พบบ่อย
| Notation | ชื่อ | ตัวอย่าง |
|---|---|---|
| O(1) | Constant | Array Access, Hash Lookup |
| O(log n) | Logarithmic | Binary Search, BST Operations |
| O(n) | Linear | Linear Search, Traversal |
| O(n log n) | Linearithmic | Merge Sort, Heap Sort |
| O(n²) | Quadratic | Bubble Sort, Nested Loops |
| O(2ⁿ) | Exponential | Recursive Fibonacci, Subset Generation |