Jika Anda ingin menganalisis algoritme ini, Anda perlu mendefinisikan // dostuff, karena itu benar-benar dapat mengubah hasilnya. Anggaplah dostuff membutuhkan jumlah operasi O (1) yang konstan.
Berikut adalah beberapa contoh dengan notasi baru ini:
Sebagai contoh pertama Anda, linear traversal: ini benar!
DI):
for (int i = 0; i < myArray.length; i++) {
myArray[i] += 1;
}
Mengapa itu linear (O (n))? Ketika kita menambahkan elemen tambahan ke input (array), jumlah operasi yang terjadi meningkat sebanding dengan jumlah elemen yang kita tambahkan.
Jadi jika diperlukan satu operasi untuk meningkatkan integer di suatu tempat dalam memori, kita dapat memodelkan pekerjaan yang dilakukan loop dengan f (x) = 5x = 5 operasi tambahan. Untuk 20 elemen tambahan, kami melakukan 20 operasi tambahan. Satu pass array cenderung linier. Begitu juga algoritma seperti bucket sortir, yang dapat mengeksploitasi struktur data untuk melakukan pengurutan dalam satu lintasan tunggal array.
Contoh kedua Anda juga akan benar dan terlihat seperti ini:
O (N ^ 2):
for (int i = 0; i < myArray.length; i++) {
for (int j = 0; j < myArray.length; j++) {
myArray[i][j] += 1;
}
}
Dalam hal ini, untuk setiap elemen tambahan dalam array pertama, i, kita harus memproses SEMUA dari j. Menambahkan 1 ke saya sebenarnya menambahkan (panjang j) ke j. Jadi, Anda benar! Pola ini adalah O (n ^ 2), atau dalam contoh kita sebenarnya O (i * j) (atau n ^ 2 jika i == j, yang sering terjadi dengan operasi matriks atau struktur data persegi.
Contoh ketiga Anda adalah ketika segalanya berubah tergantung pada dostuff; Jika kode seperti yang ditulis dan melakukan hal-hal adalah konstan, itu sebenarnya hanya O (n) karena kita memiliki 2 melewati array ukuran n, dan 2n dikurangi menjadi n. Loop berada di luar satu sama lain bukanlah faktor kunci yang dapat menghasilkan 2 ^ kode; berikut adalah contoh fungsi yang 2 ^ n:
var fibonacci = function (n) {
if (n == 1 || n == 2) {
return 1;
}
else {
return (fibonacci(n-2) + fibonacci(n-1));
}
}
Fungsi ini 2 ^ n, karena setiap panggilan ke fungsi menghasilkan DUA panggilan tambahan ke fungsi (Fibonacci). Setiap kali kita memanggil fungsi, jumlah pekerjaan yang harus kita lakukan berlipat ganda! Ini tumbuh super cepat, seperti memotong kepala hydra dan memiliki dua yang baru tumbuh setiap kali!
Sebagai contoh terakhir Anda, jika Anda menggunakan semacam nlgn seperti merge-sort, Anda benar bahwa kode ini adalah O (nlgn). Namun, Anda dapat mengeksploitasi struktur data untuk mengembangkan jenis yang lebih cepat dalam situasi tertentu (seperti rentang nilai yang diketahui dan terbatas seperti dari 1-100). Namun, Anda benar dalam berpikir, bahwa kode urutan tertinggi mendominasi; jadi jika jenis O (nlgn) berada di sebelah operasi yang membutuhkan waktu kurang dari O (nlgn), kompleksitas waktu totalnya adalah O (nlgn).
Dalam JavaScript (setidaknya di Firefox) jenis default di Array.prototype.sort () memang MergeSort, jadi Anda melihat O (nlgn) untuk skenario terakhir Anda.