ฉันถามคำถามนี้เพราะฉันสับสนในแง่มุมหนึ่งเกี่ยวกับสัญกรณ์ O ใหญ่
ฉันใช้หนังสือโครงสร้างข้อมูลและบทคัดย่อกับ Javaโดย Frank Carrano ในบทเกี่ยวกับ "ประสิทธิภาพของอัลกอริทึม" เขาแสดงอัลกอริทึมต่อไปนี้:
int sum = 0, i = 1, j = 1
for (i = 1 to n) {
for (j = 1 to i)
sum = sum + 1
}
สมัยก่อนเขาอธิบายขั้นตอนวิธีนี้มีอัตราการเติบโต(n 2 + n) / 2 ซึ่งดูง่าย
อย่างไรก็ตามมีการระบุไว้ว่า(n 2 + n) / 2จะทำงานเหมือนn 2เมื่อnมีขนาดใหญ่ ในวรรคเดียวกันเขากล่าว(n 2 + n) / 2นอกจากนี้ยังมีพฤติกรรมเหมือนn 2 / 2 เขาใช้นี้ที่จะจัดขั้นตอนวิธีการดังกล่าวข้างต้นเป็นO (n 2 )
ฉันได้รับที่(n 2 + n) / 2 มีความคล้ายคลึงกับn 2 / 2เพราะร้อยละฉลาดnที่ทำให้แตกต่างเล็ก ๆ น้อย ๆ สิ่งที่ฉันไม่ได้รับคือสาเหตุ(n 2 + n) / 2และn 2มีความคล้ายคลึงกันเมื่อnมีขนาดใหญ่
ตัวอย่างเช่นถ้าn = 1,000,000 :
(n^2 + n) / 2 = 500000500000 (5.000005e+11)
(n^2) / 2 = 500000000000 (5e+11)
(n^2) = 1000000000000 (1e+12)
อันสุดท้ายไม่เหมือนกันเลย ในความเป็นจริงค่อนข้างชัดเจนว่ามันเป็นสองเท่าเท่ากลาง แล้วแฟรงค์คาร์ราโน่พูดได้อย่างไรว่าพวกเขาเหมือนกัน อัลกอริทึมจัดเป็นO (n 2 )อย่างไร เมื่อดูที่วงในฉันจะบอกว่ามันคือn 2 + n / 2
n
เติบโตขึ้นทั้งฟังก์ชั่น 'n ^ 2` และฟังก์ชั่นของคุณก็จะทำงานในทำนองเดียวกันนั่นคืออัตราการเติบโตที่คงที่ หากคุณมีการแสดงออกที่ซับซ้อนฟังก์ชั่นที่เติบโตได้เร็วขึ้นครอง