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/
ลองจินตนาการว่าคุณมีฟังก์ชันที่ต้องทำงานกับข้อมูลจำนวนมาก เช่น การหาผลรวมของตัวเลขตั้งแต่ 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/
0 Comments
0 Shares
26 Views
0 Reviews