Back to notes
foundations-cs
Featured

Big O Notation Mastery: ภาษาของประสิทธิภาพที่คุณต้องเข้าใจ

ทำไมโค้ดของคุณถึงอืดเมื่อข้อมูลเยอะ? เจาะลึก Big O ตั้งแต่ O(1) ไปจนถึง O(N^2) พร้อมเปรียบชีวิตจริงและวิธีแก้แบบมือโปร

January 30, 20262 min read readNNexis by Seereen

🛑 1. The Problem First: วันที่ "ระเบิดเวลา" ทำงาน

ลองดูโค้ดที่ดู "ปกติ" ในช่วงแรกของการพัฒนา:

HLJS JAVASCRIPT
// ❌ Naive Approach: หาของซ้ำใน Array
const hasDuplicate = (arr) => {
  for (let i = 0; i < arr.length; i++) {
    for (let j = 0; j < arr.length; j++) {
      if (i !== j && arr[i] === arr[j]) return true;
    }
  }
  return false;
};

ปัญหา: ถ้าคุณมีข้อมูล 100 ตัว มันจะรัน 10,000 รอบ ซึ่งเร็วมาก แต่ถ้าวันหนึ่งบริษัทคุณเติบโตจนมี User 100,000 คน โค้ดนี้จะรัน 10,000,000,000 รอบ (หนึ่งหมื่นล้านรอบ!) เว็บคุณจะล่มทันทีเพราะ CPU ประมวลผลไม่ทัน นี่คือสิ่งที่เรียกว่าภัยเงียบของ Scalability ครับ


💡 2. Real-Life Analogy: การหาชื่อเพื่อนในสมุดบันทึก

ลองนึกภาพว่าคุณกำลัง "ตามหาชื่อเพื่อน".

  • O(1) - Constant Time: เหมือนคุณจำได้แม่นว่าเบอร์เพื่อนแปะอยู่ที่ตู้เย็น คุณเดินไปดูทีเดียวจบ ไม่ว่าในบ้านจะมีของกี่ชิ้นก็ตาม (Map/Object access)
  • O(N) - Linear Time: เหมือนคุณเปิดสมุดรายชื่อทีละหน้าตั้งแต่หน้าแรกจนถึงหน้าสุดท้าย (Loop 1 ชั้น)
  • O(log N) - Logarithmic Time: เหมือนคุณเปิดสมุดโทรศัพท์ที่เรียงชื่อ ก-ฮ ไว้แล้ว คุณเปิดไปตรงกลางแล้วตัดครึ่งไปเรื่อยๆ จนเจอ (Binary Search)
  • O(N^2) - Quadratic Time: เหมือนคุณต้องเอาชื่อทุกคนในเล่ม ไปไล่ถามทุกคนในเล่มอีกรอบว่า "ชื่อเหมือนกันไหม?" (Nested Loop)

🚀 3. Execution Journey: กราฟความพหูสูตของข้อมูล

เมื่อข้อมูล (N) เพิ่มขึ้น เวลาที่ใช้ทำงานจะโตตาม Big O:

🛠 Step-by-step ของการทำงาน:

  1. Input (N): จำนวนข้อมูลที่รับเข้าทีม
  2. Operations: จำนวนขั้นตอนที่คอมพิวเตอร์ต้อง "คิด"
  3. Scaling: เมื่อ N โตขึ้น 10 เท่า:
    • O(N) จะเหนื่อยเพิ่มขึ้น 10 เท่า
    • O(N^2) จะเหนื่อยเพิ่มขึ้น 100 เท่า! 🌋
HLJS JAVASCRIPT
// ✅ Best Practice: เปลี่ยน O(N^2) เป็น O(N) โดยใช้พื้นที่เพิ่ม (Space/Time Trade-off)
const hasDuplicatePro = (arr) => {
  const seen = new Set(); // 🛠 ใช้ Set ช่วยจำ (O(1) lookup)
  for (const item of arr) {
    if (seen.has(item)) return true;
    seen.add(item);
  }
  return false;
};

🪤 4. The Junior Trap: กับดัก "Array.includes" ใน Loop

จูเนียร์มักจะเผลอเขียนแบบนี้เพราะสั้นและสวย:

HLJS JAVASCRIPT
// ❌ Junior Trap: แอบมี Loop ซ้อนโดยไม่รู้ตัว
const filtered = listA.filter((item) => listB.includes(item));

ระวัง: Array.includes() คือการทำ Loop ซ่อนรูป (O(N)) เมื่ออยู่ใน filter รวมกันจะกลายเป็น O(N^2) ทันที! ถ้า listA และ listB มีอย่างละหมื่นตัว... เตรียมตัวโดนตามงานตอนตี 2 ได้เลยครับ ✅ การแก้ไข: แปลง listB เป็น Set ก่อนทำ filter เพื่อลดความรุนแรงเหลือ O(N)


⚖️ 5. The Why Matrix: ความคุ้มค่าของสมการ

Big Oความเร็วความหมายเหมาะกับ
O(1)⚡ เร็วที่สุดใช้กระโดดหาจุดที่ต้องการทันทีHash Map, Objects
O(log N)🚀 เร็วมากตัดครึ่งข้อมูลไปเรื่อยๆBinary Search, DB Index
O(N)🙂 ปานกลางเดินหาทีละตัวSimple Loop
O(N^2)🐢 ช้ามากทุกคนจัดการกับทุกคนอันตราย! เลี่ยงได้เลี่ยง

🎓 6. Senior Mindset Summary

การเป็น Senior ไม่ใช่คนที่เขียนสมการคณิตศาสตร์เก่ง แต่คือคนที่ "มองเห็นอนาคตของข้อมูล" และเลือกใช้โครงสร้างข้อมูลที่ถูกต้องเพื่อไม่ให้ระบบระเบิดในวันที่ธุรกิจเติบโตครับ!

Share this note

© 2026 My Notes by Seereen