jika n adalah 1,000,000saat itu
(n^2 + n) / 2 = 500000500000 (5.00001E+11)
(n^2) / 2 = 500000000000 (5E+11)
(n^2) = 1000000000000 (1E+12)
1000000000000.00 apa?
Sementara kompleksitas memberi kita cara untuk memprediksi biaya dunia nyata (detik atau byte tergantung pada apakah kita berbicara tentang kompleksitas waktu atau kompleksitas ruang), itu tidak memberi kita beberapa detik, atau unit khusus lainnya.
Ini memberi kita tingkat proporsi.
Jika suatu algoritma harus melakukan sesuatu n² kali, maka dibutuhkan n² × c untuk beberapa nilai c yaitu berapa lama setiap iterasi berlangsung.
Jika suatu algoritma harus melakukan sesuatu n² ÷ 2 kali, maka dibutuhkan n² × c untuk beberapa nilai c yang dua kali lebih lama dari setiap iterasi.
Either way, waktu yang diambil masih sebanding dengan n².
Sekarang, faktor-faktor konstan ini bukanlah sesuatu yang bisa kita abaikan; memang Anda dapat memiliki kasus di mana algoritma dengan kompleksitas O (n²) melakukan lebih baik daripada algoritma dengan kompleksitas O (n), karena jika kita bekerja pada sejumlah kecil item maka dampak dari faktor konsonan lebih besar dan dapat membanjiri masalah lain . (Memang, bahkan O (n!) Sama dengan O (1) untuk nilai n yang cukup rendah).
Tetapi bukan kompleksitas yang memberi tahu kita.
Dalam praktiknya, ada beberapa cara berbeda untuk meningkatkan kinerja suatu algoritma:
- Tingkatkan efisiensi setiap iterasi: O (n²) masih berjalan dalam n² × c detik, tetapi c lebih kecil.
- Kurangi jumlah kasus yang terlihat: O (n²) masih berjalan dalam n² × c detik, tetapi n lebih kecil.
- Ganti algoritme dengan yang memiliki hasil yang sama, tetapi kompleksitasnya lebih rendah: Misalnya, jika kita dapat menghitung ulang sesuatu O (n²) menjadi sesuatu O (n log n) dan karenanya berubah dari n² × c₀ detik menjadi (n log n) × c₁ detik .
Atau untuk melihatnya dengan cara lain, kami memiliki f(n)×cdetik yang diambil dan Anda dapat meningkatkan kinerja dengan mengurangi c, mengurangi natau mengurangi fpengembalian apa yang diberikan n.
Yang pertama bisa kita lakukan dengan beberapa mikro-opts di dalam satu loop, atau menggunakan perangkat keras yang lebih baik. Itu akan selalu memberikan peningkatan.
Yang kedua dapat kita lakukan dengan mengidentifikasi kasus di mana kita dapat melakukan hubungan singkat dari algoritma sebelum semuanya diperiksa, atau menyaring beberapa data yang tidak signifikan. Itu tidak akan memberikan peningkatan jika biaya melakukan ini melebihi keuntungan, tetapi umumnya akan menjadi peningkatan yang lebih besar dari kasus pertama, terutama dengan n besar.
Yang ketiga bisa kita lakukan dengan menggunakan algoritma yang sama sekali berbeda. Contoh klasik akan menggantikan semacam gelembung dengan quicksort. Dengan jumlah elemen yang sedikit kita mungkin telah memperburuk keadaan (jika c₁ lebih besar dari c₀), tetapi umumnya memungkinkan untuk mendapatkan keuntungan terbesar, terutama dengan n yang sangat besar.
Dalam penggunaan praktis, langkah-langkah kompleksitas memungkinkan kita untuk beralasan tentang perbedaan antara algoritma justru karena mereka mengabaikan masalah bagaimana mengurangi n atau c akan membantu, untuk berkonsentrasi pada examinging f()