Di sini, dengan analisis asimptotik, saya berasumsi bahwa yang kami maksud adalah perilaku algoritme ketika ukuran input tidak terhingga.
Alasan kami menggunakan analisis asimptotik adalah karena
berguna dalam memprediksi perilaku algoritma dalam praktik . Prediksi memungkinkan kita untuk membuat keputusan, misalnya ketika kita memiliki algoritma yang berbeda untuk masalah mana yang harus kita gunakan? (Bermanfaat bukan berarti selalu benar.)
Pertanyaan yang sama dapat ditanyakan tentang model dunia nyata yang disederhanakan. Mengapa kita menggunakan model matematika sederhana dari dunia nyata?
Pikirkan tentang fisika. Fisika Newton klasik tidak sebagus fisika relativistik dalam memprediksi dunia nyata. Tapi itu adalah model yang cukup baik untuk membangun mobil, gedung pencakar langit, kapal selam, pesawat terbang, jembatan, dll. Ada kasus di mana itu tidak cukup baik, misalnya jika kita ingin membangun satelit atau mengirim pesawat ruang angkasa ke Pluto atau memprediksi pergerakan benda langit besar seperti bintang dan planet atau benda berkecepatan sangat tinggi seperti elektron.
Penting untuk mengetahui apa saja batasan suatu model.
Ini biasanya merupakan perkiraan yang cukup baik dari dunia nyata.
Dalam praktiknya kita sering melihat bahwa suatu algoritma dengan analisis asimptotik yang lebih baik bekerja lebih baik dalam praktik. Jarang terjadi bahwa suatu algoritma memiliki perilaku asimptotik yang lebih baik. Jadi jika inputnya cukup besar maka kita biasanya dapat mengandalkan analisis asimptotik sebagai prediksi pertama perilaku algoritma. Tidak demikian halnya jika kita tahu inputnya akan kecil. Tergantung pada kinerja yang kita inginkan, kita mungkin perlu melakukan analisis yang lebih hati-hati, misalnya jika kita memiliki informasi tentang distribusi input, algoritma akan diberikan, kita dapat melakukan analisis yang lebih hati-hati untuk mencapai tujuan yang kita miliki (mis. Cepat pada 99 % input). Intinya sebagai langkah awal analisis asimptotik adalah titik awal yang baik. Dalam praktiknya kita juga harus melakukan tes kinerja tetapi perlu diingat juga memiliki masalah sendiri.
SEBUAHSEBUAHSEBUAHmemiliki kompleksitas asimptotik yang lebih baik. Apa yang tidak satupun dari mereka yang lebih baik dari yang lain di semua input? Maka itu menjadi lebih rumit dan tergantung pada apa yang kita pedulikan. Apakah kita peduli dengan input besar atau input kecil? Jika kita peduli dengan input besar maka tidak umum bahwa suatu algoritma memiliki kompleksitas asimptotik yang lebih baik tetapi berperilaku terburuk pada input besar yang kita pedulikan. Jika kita lebih peduli dengan input kecil maka analisis asimptotik mungkin tidak berguna. Kita harus membandingkan waktu berjalan dari algoritma pada input yang kita pedulikan. Dalam praktiknya, untuk tugas-tugas rumit dengan persyaratan rumit, analisis asimptotik mungkin tidak berguna. Untuk masalah dasar yang sederhana yang dibahas buku teks algoritme cukup berguna.
Singkatnya, kompleksitas asimptotik relatif mudah untuk menghitung perkiraan kompleksitas algoritma aktual untuk tugas-tugas dasar yang sederhana (masalah dalam buku teks algoritma). Ketika kita membangun program yang lebih rumit, persyaratan kinerja berubah dan menjadi lebih rumit dan analisis asimptotik mungkin tidak berguna.
Adalah baik untuk membandingkan analisis asimptotik dengan pendekatan lain untuk memprediksi kinerja algoritma dan membandingkannya. Salah satu pendekatan yang umum adalah tes kinerja terhadap input acak atau benchmark. Adalah umum ketika menghitung kompleksitas asimptotik sulit atau tidak layak, misalnya ketika kita menggunakan heuristik seperti pada pemecahan SAT. Kasus lain adalah ketika persyaratannya lebih rumit, misalnya ketika kinerja suatu program tergantung pada faktor-faktor luar dan tujuan kami mungkin untuk memiliki sesuatu yang selesai di bawah batas waktu tertentu (misalnya berpikir tentang memperbarui antarmuka yang ditampilkan kepada pengguna) pada 99% dari input.
Namun perlu diingat bahwa analisis kinerja juga memiliki masalah. Itu tidak memberikan penerima matematika pada kinerja pada kurang kita benar-benar menjalankan tes kinerja pada semua input yang akan diberikan kepada algoritma (sering kali komputasi tidak menentu) (dan seringkali tidak mungkin untuk memutuskan beberapa input tidak akan pernah diberikan). Jika kami menguji terhadap sampel acak atau benchmark kami secara implisit mengasumsikan beberapa keteraturan
tentang kinerja algoritma, yaitu algoritma akan melakukan hal yang sama pada input lain yang bukan bagian dari tes kinerja.
Masalah kedua dengan tes kinerja adalah bahwa mereka bergantung pada lingkungan pengujian. Yaitu kinerja suatu program tidak ditentukan oleh input saja tetapi faktor-faktor luar (misalnya jenis mesin, sistem operasi, efisiensi algoritma kode, pemanfaatan CPU, waktu akses memori, dll.) Yang beberapa di antaranya mungkin berbeda di antara berbagai program yang berbeda. tes pada mesin yang sama. Sekali lagi di sini kita mengasumsikan bahwa lingkungan tertentu yang dilakukan uji kinerja mirip dengan lingkungan aktual kecuali jika kita melakukan tes kinerja pada semua lingkungan di mana kita dapat menjalankan program (dan bagaimana kita dapat memprediksi mesin apa yang seseorang mungkin menjalankan penyortiran Algoritma aktif dalam 10 tahun?).
Θ ( n lgn )Θ ( n2)Θ ( lgn )O ( n )