แนะนำ Big O แต่ละแบบ
ประเภทของ Big O
โดยปกติ เพื่อให้เกิดความเข้าใจที่ง่ายขึ้นในการวิเคราะห์ complexity ของ algorithm จึงได้มีการแบ่งประเภท Big O เอาไว้ต่างๆดังนี้ (ไล่จากดีที่สุดไปแย่ที่สุด)
- O(1) - Constant Time
- เป็น Big O ที่ดีที่สุด ไม่ว่า input จะมีขนาดเท่าไร ระยะเวลาในการประมวลผลจะคงที่เสมอ
- ตัวอย่างเช่น การเข้าถึงข้อมูลใน array ด้วย index, arithmetic operations (+, -, *, /)
- O(log n) - Logarithmic Time
- เป็น Big O ที่มีประสิทธิภาพดีมาก โดยในแต่ละรอบของ loop จะลดขนาดของปัญหาลงครึ่งหนึ่ง
- ตัวอย่างเช่น binary search, การหารากที่สอง (square root)
- O(n) - Linear Time
- เวลาในการประมวลผลจะแปรผันตามขนาดของ input โดยตรง
- ตัวอย่างเช่น การวนลูปเพื่อค้นหาค่าใน array, maximum contiguous sum
- O(n log n) - Linearithmic Time
- เป็นการรวมกันระหว่าง linear และ logarithmic โดยมีลูป n รอบ และในแต่ละรอบใช้เวลา log n
- ตัวอย่างเช่น merge sort, quick sort
- O(n^2) - Quadratic Time
- เวลาในการประมวลผลจะเพิ่มขึ้นแบบ quadratic เมื่อ input เพิ่มขึ้น
- มักเกิดจากการมี nested loop 2 ชั้น
- ตัวอย่างเช่น bubble sort, selection sort
- O(2^n) - Exponential Time
- เวลาในการประมวลผลจะเพิ่มขึ้นอย่างรวดเร็วแบบ exponential เมื่อ input มีขนาดใหญ่ขึ้นเพียงเล็กน้อย
- ตัวอย่างเช่น brute force สำหรับ Traveling Salesman Problem
- O(n!) - Factorial Time
- เป็น Big O ที่แย่ที่สุด ใช้เวลาในการประมวลผลนานมากแม้กับ input ขนาดเล็ก
- ตัวอย่างเช่น การหา permutation ของ set ขนาด n