หากคุณต้องการวิเคราะห์อัลกอริธึมเหล่านี้คุณต้องกำหนด // dostuff ตามที่สามารถเปลี่ยนแปลงผลลัพธ์ได้ สมมติว่า dostuff ต้องการการดำเนินการ O (1) จำนวนคงที่
นี่คือตัวอย่างบางส่วนที่มีสัญลักษณ์ใหม่นี้:
สำหรับตัวอย่างแรกของคุณการเคลื่อนที่เชิงเส้น: นี่ถูกต้อง!
บน):
for (int i = 0; i < myArray.length; i++) {
myArray[i] += 1;
}
ทำไมมันเป็นเส้นตรง (O (n)) ในขณะที่เราเพิ่มองค์ประกอบเพิ่มเติมให้กับอินพุท (อาเรย์) จำนวนการดำเนินการที่เกิดขึ้นจะเพิ่มขึ้นตามสัดส่วนของจำนวนองค์ประกอบที่เราเพิ่ม
ดังนั้นหากใช้การดำเนินการหนึ่งเพื่อเพิ่มจำนวนเต็มในหน่วยความจำเราสามารถสร้างแบบจำลองการทำงานของลูปด้วย f (x) = 5x = 5 การดำเนินการเพิ่มเติม สำหรับองค์ประกอบเพิ่มเติม 20 รายการเราดำเนินการเพิ่มเติม 20 รายการ ผ่านเดียวของอาร์เรย์มีแนวโน้มที่จะเป็นเส้นตรง ดังนั้นอัลกอริทึมเช่นการจัดเรียงถังข้อมูลซึ่งสามารถใช้ประโยชน์จากโครงสร้างของข้อมูลเพื่อทำการเรียงลำดับในหนึ่งรอบการส่งผ่านของอาร์เรย์
ตัวอย่างที่สองของคุณจะถูกต้องและมีลักษณะเช่นนี้:
O (n ^ 2):
for (int i = 0; i < myArray.length; i++) {
for (int j = 0; j < myArray.length; j++) {
myArray[i][j] += 1;
}
}
ในกรณีนี้สำหรับทุกองค์ประกอบเพิ่มเติมในอาร์เรย์แรกฉันต้องประมวลผลทั้งหมดของ j การเพิ่ม 1 ถึง i เพิ่ม (ความยาวของ j) เป็น j ดังนั้นคุณถูกต้อง! รูปแบบนี้เป็น O (n ^ 2) หรือในตัวอย่างของเรามันเป็นจริง O (i * j) (หรือ n ^ 2 ถ้า i == j ซึ่งมักจะเป็นกรณีที่มีการดำเนินการเมทริกซ์หรือโครงสร้างข้อมูลสแควร์
ตัวอย่างที่สามของคุณคือสิ่งที่เปลี่ยนไปขึ้นอยู่กับ dostuff; ถ้ารหัสเขียนและทำสิ่งต่าง ๆ เป็นค่าคงที่จริงๆแล้วมันเป็นเพียง O (n) เพราะเรามี 2 ขนาดของอาร์เรย์ที่ผ่าน n และ 2n จะลดลงเป็น n การวนรอบอยู่ด้านนอกซึ่งกันและกันไม่ใช่ปัจจัยสำคัญที่สามารถสร้างรหัส 2 ^ n; นี่คือตัวอย่างของฟังก์ชั่นซึ่งเป็น 2 ^ n:
var fibonacci = function (n) {
if (n == 1 || n == 2) {
return 1;
}
else {
return (fibonacci(n-2) + fibonacci(n-1));
}
}
ฟังก์ชั่นนี้คือ 2 ^ n เพราะการเรียกฟังก์ชั่นแต่ละครั้งจะทำให้เกิดการเรียกสองฟังก์ชันเพิ่มเติม (Fibonacci) ทุกครั้งที่เราเรียกฟังก์ชั่นปริมาณงานที่เราต้องทำเพิ่มเป็นสองเท่า! สิ่งนี้เติบโตอย่างรวดเร็วสุดขีดเช่นการตัดหัวไฮดราและมีการงอกใหม่สองครั้งในแต่ละครั้ง!
สำหรับตัวอย่างสุดท้ายของคุณหากคุณใช้การเรียงลำดับ nlgn เช่นการเรียงแบบผสานคุณถูกต้องแล้วว่ารหัสนี้จะเป็น O (nlgn) อย่างไรก็ตามคุณสามารถใช้ประโยชน์จากโครงสร้างของข้อมูลเพื่อพัฒนาเรียงลำดับได้เร็วขึ้นในสถานการณ์ที่เฉพาะเจาะจง (เช่นช่วงค่าที่รู้จัก จำกัด ในช่วงตั้งแต่ 1-100) คุณถูกต้องในการคิดอย่างไรก็ตามรหัสการสั่งซื้อสูงสุดครอง ดังนั้นหากการเรียงลำดับ O (nlgn) อยู่ถัดจากการดำเนินการใด ๆ ที่ใช้เวลาน้อยกว่า O (nlgn) ความซับซ้อนของเวลาทั้งหมดจะเป็น O (nlgn)
ใน JavaScript (ใน Firefox อย่างน้อย) การเรียงลำดับเริ่มต้นใน Array.prototype.sort () เป็น MergeSort ดังนั้นคุณจึงดู O (nlgn) สำหรับสถานการณ์สุดท้ายของคุณ