
“สมมุติว่าบริษัทคุณไปจ้างฟรีแลนซ์คนหนึ่งให้ช่วยพัฒนาระบบอะไรสักอย่างให้”
ฟรีแลนซ์คนนั้นตอบกลับมาว่า ระบบเดียวกันนี้สามารถพัฒนาได้สองแบบคือ
- แบบแรกมีค่าพัฒนา 100,000 บาท และถ้ามีคนใช้ระบบนี้ 10 คน จะมีค่าใช้จ่ายในการรัน 100 บาทต่อเดือน
- แบบที่สองมีค่าพัฒนา 200,000 บาท และถ้ามีคนใช้ระบบนี้ 10 คน จะมีค่าใช้จ่ายในการรัน 100 บาทต่อเดือน (เท่ากับแบบแรก)
ถ้าคุณเป็นเจ้าของบริษัท คุณจะจ้างฟรีแลนซ์ทำระบบไหนขึ้นมา?
จะมีใครจะเลือกแบบที่สองหล่ะใช่ม่ะ …แต่!! ถ้าเราบอกว่า
- แบบแรกมีค่าพัฒนา 100,000 บาท และถ้ามีคนใช้ระบบนี้ \(n\) คน จะมีค่าใช้จ่ายในการรัน \(n^2\) บาทต่อเดือน
- ส่วนแบบที่สองมีค่าพัฒนา 200,000 บาท และถ้ามีคนใช้ระบบนี้ \(n\) คน จะมีค่าใช้จ่ายในการรัน \(10n\) บาทต่อเดือน
จะเห็นว่าเมื่อ \(n = 10\) ทั้งสองจะมีค่าใช้จ่ายเท่ากัน แต่ลองคิดว่าถ้ามีคนใช้ระบบนี้ 100 คนหล่ะ แบบแรกเราจะต้องเสียค่าใช้ 10,000 บาทต่อเดือน ในขณะที่แบบที่สองเราจะเสียค่าใช้จ่ายแค่ 1,000 บาทต่อเดือนเท่านั้น
และยิ่ง \(n\) มีค่ามากขึ้นไปเรื่อย ๆ แบบที่สองก็จะถูกกว่าแบบแรกแบบเทียบไม่ติด
(หรือสรุปได้ว่า แบบแรก cost โตแบบ \(n^2\) หรือ quadratic ในขณะที่แบบที่สอง cost โตแบบ \(n\) หรือ linear เมื่อ n มีค่ามาก ๆ)
“สิ่งที่สำคัญกว่าเร็วหรือช้า คืออัตราการเติบโตของ cost เทียบกับ input size”
จากตัวอย่างข้างต้นจะเห็นได้ว่าเมื่อเรารู้อัตราการเติบโต ไม่ใช่แค่ว่ามันจะทำให้เราสามารถตัดสินใจได้ดีขึ้น แต่มันยังทำให้เราวางแผนได้ด้วยว่า
“โอเคในตอนแรกพัฒนาแบบแรกก่อนเพราะถูกกว่า แล้วพอเรามีคนใช้งานถึง 10 คนเมื่อไหร่ ค่อนเริ่มพัฒนาแบบที่สอง”
การเขียนโปรแกรมก็เช่นกันที่เราต้องตัดสินใจว่าจะ implement algorithm A หรือ B ซึ่งแต่ละตัวก็มีต้นทุนในการพัฒนา และ growth rate ของ computational cost (time/space) เมื่อเทียบกับ input size ที่ต่างกัน
Big O Notation คือ “คำศัพท์” คำนึงในภาษาที่มีชื่อว่า “คณิตศาสตร์” ที่ใช้ในการอธิบาย “อัตราการเติบโตของ computation เมื่อ input size มีค่ามาก ๆ ว่ามันจะทำตัวแบบไหนนั่นเอง”