การเติบโตของฟังก์ชัน (Growth of Functions)
อันดับการเติบโต การเติบโตของฟังก์ชันตามจำนวนอินพุต เราจำเป็นจะต้องทราบการวัดอย่างหยาบๆ ว่าฟังก์ชันโตเร็วขนาดไหน ถ้า f(x) มีการเติบโตเร็วกว่าฟังก์ชัน g(x) ดังนั้นในที่สุดลิมิตแล้ว f(x) จะโตว่า g(x) เสมอ สำหรับค่าของ x ที่มากเพียงพอ การประยุกต์ใช้งาน สมมุติว่าคุณกำลังออกแบบเว็บไซต์เพื่อประมวลผลข้อมูลของผู้ใช้ โดยที่มีผู้ใช้จำนวนมาก เช่นข้อมูลทางด้านการเงิน และในการค้นหาข้อมูลด้วยโปรแกรม A ใช้เวลา fA(n)=30n+8 microseconds สำหรับการประมวลผลใดๆ กับข้อมูล n records ในขณะที่โปรแกรม B ใช้เวลา fB(n)=n2+1 microseconds เพื่อประมวลผลข้อมูล n records เช่นกัน ต้องการทราบว่าคุณจะเลือกโปรแกรมใด เมื่อคุณรู้ว่ามีผู้ใช้ข้อมูลนี้เป็นล้านคน
พิจารณาอันดับการเติบโตของฟังก์ชัน เมื่อพิจารณาการเติบโตของฟังก์ชันจากอันดับ จากกราฟเมื่อการใช้ข้อมูลเพิ่มขึ้น จะเห็นว่าเวลาที่ใช้ในการประมวลผลข้อมูลในแต่ละโปรแกรมเพิ่มขึ้นตามอันดับของฟังก์ชัน fA(n)=30n+8 Value of function fB(n)=n2+1 Increasing n
แนวคิดของอันดับกับการเติบโต จากฟังก์ชัน fA(n)=30n+8 จะเห็นว่าอันดับของฟังก์ชันนี้เท่ากับหนึ่ง นั่นคือการเติบโตของฟังก์ชันจะขึ้นอยู่กับขนาดของ n ส่วนฟังก์ชัน fB(n)=n2+1 จะมีอันดับของโพลิโนเมียลเท่ากับ 2 นั่นคือการเติบโตของฟังก์ชันจะขึ้นอยู่กับขนาดของ n2 การเติบโตของฟังก์ชันมักจะถูกอธิบายด้วยสัญลักษณ์พิเศษที่เรียกว่า “บิ๊กโอ (Big O)” ซึ่งจะเขียนแทนด้วยสัญลักษณ์ O(f(x)) ดังนั้นจากทั้งสองฟังก์ชันข้างต้นสามารถอธิบายด้วยสัญลักษณ์นี้ได้ว่า อันดับของ O(n2) จะมีอัตราเติบโตเร็วกว่า O(n)
บิ๊กโอ นิยาม ให้ f และ g เป็นฟังก์ชันจากเซตของจำนวนเต็มหรือเซตของจำนวนจริงที่ทอดค่าไปยังเซตของจำนวนจริง กล่าวได้ว่า f(x) เป็น O(g(x)) ถ้ามีค่าคงที่ C และ k ที่สัมพันธ์กันในรูป |f(x)|C|g(x)|เมื่อไรก็ตามที่ x>k ซึ่งอ่านว่า “f(x) เป็นบิ๊กโอของ g(x)” จากนิยามจะเห็นว่า {f:RR | C,k: x>k: f(x) Cg(x)} หรือ “f เป็นอันดับอย่างมากที่สุดของ g”, “f(x) เป็นบิ๊กโอของ g(x)” “f (x) = O(g (x))” ซึ่งที่กล่าวมาทั้งหมดมีความหมายเหมือนกับว่า fO(g) อันที่จริงแล้วในเรื่องนี้จะใช้คำว่า “อย่างมากที่สุดหรือ at most”
ตัวอย่างบิ๊กโอ จงแสดงว่า f(x) = x2 + 2x + 1 คือ O(x2) x < x2 และ 1 < x2 เมื่อ x>1 ซึ่งจะได้ว่า 0 x2 + 2x + 1 x2 + 2x2 + x2 = 4x2 จากนิยามจะได้ว่า C = 4 และ k = 1 ดังนั้นสิ่งที่ยืนยันว่า f(x) คือ O(x2) นั่นคือ f(x) = x2 + 2x + 1 < 4x2 เมื่อ x>1 ส่วนกรณีอื่นๆ เช่น เมื่อ x>2 เรามี 2x<x2 และ 1 < x2 เมื่อ x>2 ซึ่งจะได้ว่า 0 x2 + 2x + 1 x2 + x2 + x2 = 3x2 จากนิยามจะได้ว่า C = 3 และ k = 2 ดังนั้นสิ่งที่ยืนยันว่า f(x) คือ O(x2) นั่นคือ f(x) = x2 + 2x + 1 < 3x2 เมื่อ x>2 คุณเห็นข้อแตกต่างไหม หรือพอสังเกตได้หรือไม่ว่าทำไมถึงต้องกำหนดเช่นนี้มีวิธีอื่นอีกหรือไม่ ข้อสังเกตที่ x < x2 และ 1 < x2 เมื่อ x>1 แต่ 2x<x2 และ 1 < x2 เนื่องจากที่ x>1 ถ้าเรากำหนด 2x<x2 และ 1 < x2 เงื่อนไขจะไม่เป็นจริงเนื่องจาก ถ้า x เป็นจำนวนจริงที่เท่ากับ 1.1 ทำให้ 2x<x2 เป้นเท็จ
ข้อสังเกตจากตัวอย่าง f(x) = x2+2x+1 จะเห็นว่าค่าคงที่ C และ k ในการนิยามบิ๊กโอจะถูกเรียกว่า “พยานหรือสิ่งยืนยัน (Witness)” ถึงความสัมพันธ์ว่า f(x) คือ O(g(x)) จากตัวอย่างจะเห็นว่าเราหาพยาน C และ k เพียงคู่เดียวก็เพียงพอที่จะใช้ยืนยันความสัมพันธ์ |f(x)|C|g(x)|ที่ x>k นอกจากนี้จะเห็นว่าพยานมีอยู่อย่างไม่จำกัดดังนั้นเมื่อมี C และ k โดยที่ C< C และ k< k แล้ว |f(x)|C|g(x)| C |g(x)| ที่ x> k >k
A Big-O relationship does not hold
ข้อสังเกตุ บิ๊กโอ โดยทั่วไปโพลิโนเมียลสามารถใช้เพื่อประมาณการเติบโตของฟังก์ชัน ดังทฤษฎีบทต่อไปนี้ ทฤษฎีบท ให้ f(x) = anxn + an-1xn-1 + ... + a1x1 + a0 โดยที่ an,an-1,..., a1, a0 เป็นจำนวนจริง ดังนั้น f(x) มี O(xn) บทพิสูจน์ โดยใช้ทฤษฎีของอสมการของสามเหลียม และเมื่อ x > 1 แล้ว นี่แสดงว่า โดยที่
การเติบโตของบิ๊กโอของฟังก์ชันต่างๆ บิ๊กโอที่ใช้ประมาณจำนวนการดำเนินการที่เกิดขึ้นในอัลกอริทึมที่ใช้แก้ปัญหาต่างๆ ส่วนใหญ่จะมีอัตราเติบโตตามจำนวนของอินพุต n นั่นคือ 1, log n, n, n log n, n2, 2n, n! จากกราฟจะเห็นว่าอัตราการเติบโตของแต่ละฟังก์ชันจะน้อยกว่าฟังก์ชันที่ตามมา
การเติบโตของการรวมฟังก์ชัน อัลกอริทึมส่วนใหญ่เกิดจากอัลกอริทึมย่อยที่เรียงต่อกัน จำนวนขั้นตอนที่ใช้แก้ปัญหาจากอัลกอริทึมย่อยสามารถรวมเข้าด้วยกับเพื่อพิจารณาอัตราการเติบโตเมื่อเทียบกับการเพิ่มขึ้นของอินพุต ดังนั้นสมมุติปัญหาหนึ่งมีสองอัลกอริทึมย่อยโดยมีสองฟังก์ชันคือ f1(x) มี O(g1(x)) และ f2(x) มี O(g2(x)) จากนิยามของบิ๊กโอจะมีค่าคงที่ C1, C2, k1, k2 ที่ทำให้ |f1(x)| C1|g1(x)| โดยที่ x > k1 และ |f2(x)| C2|g2(x)| โดยที่ x > k2 เพื่อประมาณผลรวมของทั้งสองฟังก์ชันจากอสมการสามเหลี่ยมจะได้ว่า
การรวมฟังก์ชันการเติบโต ทฤษฎีบท เมื่อปัญหาหนึ่งใช้สองอัลกอริทึมย่อยโดยมีสองฟังก์ชันคือ f1(x) มี O(g1(x)) และ f2(x) มี O(g2(x)) ดังนั้น (f1+f2)(x) มีบิ๊กโอเป็น O(max(|g1(x)|, |g2(x)|)) จากความสัมพันธ์ข้างต้นที่ เมื่อ C = C1 + C2 และ g(x) =max(|g1(x)|, |g2(x)|) จากอสมการนี้แสดงว่า (f1+f2)(x) C|g(x)| เมื่อ x > k โดยที่ k = max(k1, k2)
การคูณฟังก์ชันการเติบโต การประมาณบิ๊กโอที่อยู่ในรูปของผลคูณสามารถคำนวณได้จากการคูณของฟังก์ชัน f1 และ f2 โดยที่ x > max(k1, k2) จากความจริงที่ว่า โดยที่ C = C1C2 และจากอสมการจะเห็นว่า f1(x)f2(x) มีบิ๊กโอเป็น O(g(x))
ตัวอย่างการประมาณค่าบิ๊กโอ ตัวอย่าง จงประมาณค่าบิ๊กโอของ f(n) = 3nlog(n!) + (n2+3)log n โดยที่ n เป็นจำนวนเต็มบวก วิธีทำ ในขั้นแรกจะประเมิน 3nlog(n!) ก่อน นั่นคือ ซึ่งจะได้ว่า ส่วนเทอม 3n จะมีบิ๊กโอเป็น O(n) ดังนั้น 3nlog(n!) จะมีบิ๊กโอเป็น O(n2log n) ในขั้นที่สองหา (n2+3)log n โดย (n2+3) มีบิ๊กโอเป็น O(n2) เมื่อ n>2 ซึ่งในเทอม (n2+3)log n จะมีบิ๊กโอเป็น O(n2log n) เพราะฉะนั้น f(n) ที่เป็นผลรวมของทั้งสองขั้นตอนจะมีบิ๊กโอเป็น O(n2log n)