Apa yang merupakan satu unit waktu dalam analisis runtime?

8

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?

Raphael
sumber

Jawaban:

6

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.

Pratik Deoghare
sumber
Bagaimana dengan kenaikan dalam loop? Itu harus O (n) benar?
for (int k = 0; k <N; k ++) {jumlah = jumlah + nilai [k];} Apakah kode tersebut dipertanyakan. Dikatakan melakukan panggilan 3N + 2.
Nggak. Untuk jumlah = jumlah + nilai [k], + adalah O (1) dan = juga O (1). Tetapi loop berjalan O (N) kali . Jadi O-nya (N) * O (1 + 1) = O (N). O (3N + 2) panggilan hanya O (N).
Pratik Deoghare
Tapi mengapa O (3N + 2) memanggil?
Nilai akses [k] adalah 1 panggilan. + adalah 1 panggilan. = adalah 1 panggilan. Itu menjelaskan 3 panggilan yang dilakukan N kali tetapi saya tidak tahu tentang +2.
Pratik Deoghare
5

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.

Raphael
sumber
Saya tidak puas dengan mengatakan bahwa pendekatan paling menonjol yang Anda sebutkan sepenuhnya dicakup oleh model RAM: Model RAM biasanya tidak memperhitungkan biaya seragam untuk penggandaan (untuk mempertahankan kesetaraan masalah yang dapat dipecahkan oleh TM dalam waktu bersamaan dengan masalah. dipecahkan oleh RAM dalam waktu poli-waktu). Namun, perkalian biasanya diasumsikan memakan waktu yang konstan dalam analisis banyak algoritma
Cornelius Brand
@ cbra: Saya belum menemukan model RAM dengan biaya seragam untuk semuanya kecuali multiplikasi. Secara khusus, tidak perlu untuk kesetaraan waktu-poli.
Raphael
Saya tidak yakin apakah saya benar, tetapi ketika menetapkan biaya seragam untuk penggandaan, Anda dapat menghitung (dengan demikian, menyimpan) nomor tersebut 2(2n) di HAI(n)langkah-langkah menggunakan kuadrat berulang.
Cornelius Brand
@ BCRA Anda tampaknya ada benarnya di sana. Model RAM dalam bentuk "murni" tidak menawarkan multiplikasi sebagai aksi atom tetapi mengimplementasikannya dengan menambahkan berulang. Oleh karena itu, biaya seragam untuk penggandaan (dan berpotensi operasi lainnya) "berbahaya" karena memutus hubungan tertentu jika diterapkan pada masalah di mana angka menjadi besar (yaitu lebih besar dari input (?)).
Raphael