Saat menghitung ketergantungan runtime pada input, perhitungan apa yang dipertimbangkan? Sebagai contoh, saya pikir saya belajar bahwa pengindeksan array serta pernyataan tugas tidak dihitung, mengapa begitu?
Saat menghitung ketergantungan runtime pada input, perhitungan apa yang dipertimbangkan? Sebagai contoh, saya pikir saya belajar bahwa pengindeksan array serta pernyataan tugas tidak dihitung, mengapa begitu?
Saat melakukan perhitungan kompleksitas, kami biasanya menggunakan model RAM . Dalam model ini kami menganggap bahwa pengindeksan array adalah O (1). Pernyataan tugas sama seperti memberikan beberapa nilai ke beberapa variabel dalam array variabel . Ini hanya untuk kenyamanan. Ini menyederhanakan analisis algoritma. Dalam pengindeksan array dunia nyata dibutuhkan O (log I) di mana saya adalah sejumlah hal yang diindeks.
Kami umumnya mempertimbangkan hal-hal yang tergantung pada ukuran input misalnya loop. Bahkan jika ada operasi O (1) dalam loop dan dijalankan n kali maka algoritma berjalan untuk waktu O (n).
Tetapi operasi O (1) di luar loop hanya membutuhkan waktu yang konstan dan O (n) + O (1) = O (n).
Baca tentang algoritme pengurutan radix dari CLRS.
Tujuan utamanya adalah "waktu eksekusi dalam detik" atau lebih umum (mengabaikan fitur CPU modern) "jumlah siklus clock". Ternyata, ini sulit untuk dianalisis, dan itu juga mesin atau setidaknya set instruksi khusus. Karena itu, biasanya tidak dilakukan.
Level abstraksi selanjutnya adalah menghitung dengan tepat semua operasi (dari beberapa kode pseudo gaya perakitan), dengan menjaga biaya operasi individu (dalam siklus jam) sebagai parameter. Perhatikan bahwa analisis tersebut ditemukan dalam "Seni Pemrograman Komputer" Knuth, sehingga ada tempat untuk pendekatan semacam ini, meskipun sulit dan cenderung lebih sulit di hadapan hirarki memori.
Last but not least - dan tentu saja yang paling menonjol - adalah analisis operasi dominan mengabaikan faktor konstan dan asimtotik menghilang konstribusi ("HAI -analisis "). Alasannya adalah bahwa runtime terikat untuk berperilaku asimtotik seperti jumlah operasi yang paling sering dieksekusi, kali beberapa faktor tergantung pada implementasi aktual dan mesin. Analisis semacam ini menghasilkan hasil umum yang berlaku untuk semua mesin (tercakup oleh model RAM) dan lebih mudah untuk melakukan daripada yang di atas.
Meninggalkan kerangka "klasik" di belakang, banyak algoritma didominasi oleh memori dan / atau biaya komunikasi, sehingga dalam hal itu menghitung jumlah dan volume akses memori masing-masing. transmisi jaringan masuk akal (dan mungkin cukup).
Selain itu, perlu diingat bahwa kita sering tidak tertarik pada kinerja absolut suatu algoritma tetapi membandingkannya dengan yang lain. Ini, juga, dapat menginformasikan pilihan parameter yang dianalisis.
Jadi Anda lihat, tidak ada satu jawaban pasti. Bergantung pada tujuan analisis yang ada, jawaban yang berbeda dapat diberikan.
Lihat juga jawaban saya di sini untuk beberapa pemikiran terkait, dan jawaban Sebastian di Quicksort sebagai contoh.
sumber