Big O — ภาษาลับของนักพัฒนาเพื่อเข้าใจ “ความเร็ว” ของโค้ด

ลองจินตนาการว่าคุณมีฟังก์ชันที่ต้องทำงานกับข้อมูลจำนวนมาก เช่น การหาผลรวมของตัวเลขตั้งแต่ 1 ถึง 1 พันล้าน ถ้าคุณใช้ลูปธรรมดา มันจะใช้เวลานานขึ้นเรื่อย ๆ ตามขนาดของข้อมูล นี่คือสิ่งที่เรียกว่า “เวลาในการทำงาน” หรือ time complexity

Big O notation คือวิธีที่นักพัฒนาใช้บอกว่า “ฟังก์ชันนี้จะช้าขึ้นแค่ไหนเมื่อข้อมูลเพิ่มขึ้น” โดยไม่ต้องบอกเวลาที่แน่นอน แต่บอก “อัตราการเติบโต” เช่น O(n) หมายถึงเวลาทำงานจะเพิ่มตามจำนวนข้อมูล n

บทความนี้พาเราไปรู้จักกับ 4 รูปแบบหลักของ Big O:

- O(1): เวลาคงที่ เช่น การใช้สูตร (n*(n+1))/2 เพื่อหาผลรวม — ไม่ว่าจะใส่เลขเท่าไหร่ เวลาก็เท่าเดิม
- O(log n): เวลาลดลงครึ่งหนึ่งทุกครั้ง เช่น การเดาตัวเลขด้วย binary search
- O(n): เวลาทำงานเพิ่มตามจำนวนข้อมูล เช่น การหาผลรวมด้วยลูป
- O(n²): เวลาทำงานเพิ่มเป็นกำลังสอง เช่น bubble sort ที่ต้องเปรียบเทียบทุกคู่ในอาร์เรย์

นอกจากนี้ยังมีตัวอย่างการเขียนโค้ดที่ทำให้ประสิทธิภาพแย่ลงโดยไม่รู้ตัว เช่น การใช้ indexOf ในลูป ซึ่งทำให้กลายเป็น O(n²) ทั้งที่ควรจะเป็น O(n)

บทความยังแนะนำเทคนิคการปรับปรุง เช่น การใช้ Map หรือ Set เพื่อ lookup แบบ O(1) และการใช้ cache เพื่อหลีกเลี่ยงการคำนวณซ้ำใน recursive function อย่าง factorial

สรุปเนื้อหาเป็นหัวข้อ
Big O notation ใช้บอกอัตราการเติบโตของเวลาทำงานของฟังก์ชันตามขนาดข้อมูล
O(n): เวลาทำงานเพิ่มตามจำนวนข้อมูล เช่น การใช้ลูปบวกเลข
O(1): เวลาคงที่ เช่น การใช้สูตรคำนวณผลรวม
O(log n): เวลาลดลงครึ่งหนึ่งทุกครั้ง เช่น binary search
O(n²): เวลาทำงานเพิ่มเป็นกำลังสอง เช่น bubble sort
Bubble sort มี worst-case เป็น O(n²) แม้บางกรณีจะเร็ว
Binary search ใช้เดาเลขโดยลดช่วงครึ่งหนึ่งทุกครั้ง
การใช้ indexOf ในลูปทำให้ฟังก์ชันกลายเป็น O(n²)
การใช้ Map หรือ Set ช่วยให้ lookup เป็น O(1)
การใช้ cache ใน recursive function ช่วยลดการคำนวณซ้ำ

ข้อมูลเสริมจากภายนอก
Big O notation ถูกคิดค้นโดย Paul Bachmann ในปี 1894
O(n log n) เป็นความซับซ้อนของอัลกอริธึม sorting ที่มีประสิทธิภาพ เช่น merge sort
O(2ⁿ) และ O(n!) เป็นความซับซ้อนที่เติบโตเร็วมาก เช่น brute-force หรือ permutation
Big O ใช้บอก worst-case เป็นหลัก แต่สามารถใช้กับ best และ average case ได้
การเลือกอัลกอริธึมที่เหมาะสมช่วยลดเวลาและทรัพยากรในการทำงานของโปรแกรม

การวัดเวลาจาก wall-clock อาจไม่แม่นยำ เพราะขึ้นอยู่กับสภาพแวดล้อมของเครื่อง
O(1) ไม่ได้หมายถึง “เร็วเสมอ” แต่หมายถึง “ไม่เปลี่ยนตามขนาดข้อมูล”
ฟังก์ชันที่ดูเร็วในบางกรณีอาจช้าลงอย่างมากเมื่อข้อมูลเพิ่มขึ้น
การใช้โครงสร้างข้อมูลผิดประเภทอาจทำให้ประสิทธิภาพแย่ลงโดยไม่รู้ตัว
การปรับปรุงโค้ดต้องทดสอบจริง ไม่ควรเชื่อแค่ทฤษฎี

https://samwho.dev/big-o/
🧠 Big O — ภาษาลับของนักพัฒนาเพื่อเข้าใจ “ความเร็ว” ของโค้ด ลองจินตนาการว่าคุณมีฟังก์ชันที่ต้องทำงานกับข้อมูลจำนวนมาก เช่น การหาผลรวมของตัวเลขตั้งแต่ 1 ถึง 1 พันล้าน ถ้าคุณใช้ลูปธรรมดา มันจะใช้เวลานานขึ้นเรื่อย ๆ ตามขนาดของข้อมูล นี่คือสิ่งที่เรียกว่า “เวลาในการทำงาน” หรือ time complexity Big O notation คือวิธีที่นักพัฒนาใช้บอกว่า “ฟังก์ชันนี้จะช้าขึ้นแค่ไหนเมื่อข้อมูลเพิ่มขึ้น” โดยไม่ต้องบอกเวลาที่แน่นอน แต่บอก “อัตราการเติบโต” เช่น O(n) หมายถึงเวลาทำงานจะเพิ่มตามจำนวนข้อมูล n บทความนี้พาเราไปรู้จักกับ 4 รูปแบบหลักของ Big O: - O(1): เวลาคงที่ เช่น การใช้สูตร (n*(n+1))/2 เพื่อหาผลรวม — ไม่ว่าจะใส่เลขเท่าไหร่ เวลาก็เท่าเดิม - O(log n): เวลาลดลงครึ่งหนึ่งทุกครั้ง เช่น การเดาตัวเลขด้วย binary search - O(n): เวลาทำงานเพิ่มตามจำนวนข้อมูล เช่น การหาผลรวมด้วยลูป - O(n²): เวลาทำงานเพิ่มเป็นกำลังสอง เช่น bubble sort ที่ต้องเปรียบเทียบทุกคู่ในอาร์เรย์ นอกจากนี้ยังมีตัวอย่างการเขียนโค้ดที่ทำให้ประสิทธิภาพแย่ลงโดยไม่รู้ตัว เช่น การใช้ indexOf ในลูป ซึ่งทำให้กลายเป็น O(n²) ทั้งที่ควรจะเป็น O(n) บทความยังแนะนำเทคนิคการปรับปรุง เช่น การใช้ Map หรือ Set เพื่อ lookup แบบ O(1) และการใช้ cache เพื่อหลีกเลี่ยงการคำนวณซ้ำใน recursive function อย่าง factorial 📌 สรุปเนื้อหาเป็นหัวข้อ ➡️ Big O notation ใช้บอกอัตราการเติบโตของเวลาทำงานของฟังก์ชันตามขนาดข้อมูล ➡️ O(n): เวลาทำงานเพิ่มตามจำนวนข้อมูล เช่น การใช้ลูปบวกเลข ➡️ O(1): เวลาคงที่ เช่น การใช้สูตรคำนวณผลรวม ➡️ O(log n): เวลาลดลงครึ่งหนึ่งทุกครั้ง เช่น binary search ➡️ O(n²): เวลาทำงานเพิ่มเป็นกำลังสอง เช่น bubble sort ➡️ Bubble sort มี worst-case เป็น O(n²) แม้บางกรณีจะเร็ว ➡️ Binary search ใช้เดาเลขโดยลดช่วงครึ่งหนึ่งทุกครั้ง ➡️ การใช้ indexOf ในลูปทำให้ฟังก์ชันกลายเป็น O(n²) ➡️ การใช้ Map หรือ Set ช่วยให้ lookup เป็น O(1) ➡️ การใช้ cache ใน recursive function ช่วยลดการคำนวณซ้ำ ✅ ข้อมูลเสริมจากภายนอก ➡️ Big O notation ถูกคิดค้นโดย Paul Bachmann ในปี 1894 ➡️ O(n log n) เป็นความซับซ้อนของอัลกอริธึม sorting ที่มีประสิทธิภาพ เช่น merge sort ➡️ O(2ⁿ) และ O(n!) เป็นความซับซ้อนที่เติบโตเร็วมาก เช่น brute-force หรือ permutation ➡️ Big O ใช้บอก worst-case เป็นหลัก แต่สามารถใช้กับ best และ average case ได้ ➡️ การเลือกอัลกอริธึมที่เหมาะสมช่วยลดเวลาและทรัพยากรในการทำงานของโปรแกรม ⛔ การวัดเวลาจาก wall-clock อาจไม่แม่นยำ เพราะขึ้นอยู่กับสภาพแวดล้อมของเครื่อง ⛔ O(1) ไม่ได้หมายถึง “เร็วเสมอ” แต่หมายถึง “ไม่เปลี่ยนตามขนาดข้อมูล” ⛔ ฟังก์ชันที่ดูเร็วในบางกรณีอาจช้าลงอย่างมากเมื่อข้อมูลเพิ่มขึ้น ⛔ การใช้โครงสร้างข้อมูลผิดประเภทอาจทำให้ประสิทธิภาพแย่ลงโดยไม่รู้ตัว ⛔ การปรับปรุงโค้ดต้องทดสอบจริง ไม่ควรเชื่อแค่ทฤษฎี https://samwho.dev/big-o/
SAMWHO.DEV
Big O
A visual introduction to big O notation.
0 Comments 0 Shares 26 Views 0 Reviews