Dalam aplikasi dunia nyata, apakah ada manfaat konkret saat menggunakan daripada algoritma ?O ( log ( n ) )
Ini adalah kasus ketika seseorang menggunakan misalnya pohon van Emde Boas daripada implementasi pohon pencarian biner yang lebih konvensional. Tetapi misalnya, jika kita mengambil maka dalam kasus terbaik algoritma logaritmik ganda mengungguli yang logaritmik dengan (kira-kira) faktor . Dan juga secara umum implementasinya lebih rumit dan kompleks. 5
Mengingat bahwa saya pribadi lebih suka BST daripada VEB-tree, bagaimana menurut Anda?
Orang dapat dengan mudah menunjukkan bahwa:
algorithms
complexity-theory
binary-trees
algorithm-analysis
search-trees
Ghassen Hamrouni
sumber
sumber
Jawaban:
Jangan lupa bahwa masih tumbuh secara eksponensial (dalam ) lebih cepat dari !log ( n ) log ( log n )catatann catatan( n ) catatan( logn )
Memang, jika Anda melihat hasil bagi dan , tidak banyak yang mengesankan untuk dilihat:log ( log ( n ) )catatan( n ) catatan( log( n ) )
[ sumber ]
Tapi tetap saja, Anda mendapatkan faktor lima hingga enam untuk ukuran hingga . Perhatikan bahwa ukuran yang lebih besar tidak biasa dalam praktik, dan peningkatan kecepatan oleh faktor itu luar biasa ! Mungkin membuat perbedaan antara memiliki hasil setelah makan siang atau hanya besok. Ketahuilah bahwa bagian dari percepatan dapat dimakan oleh konstanta yang lebih tinggi dari implementasi pohon; Anda harus memplot (atau menganalisis) dan dengan konstanta runtime aktual untuk mendapatkan gambaran nyata.c ⋅ log ( n ) d ⋅ log ( log ( n ) ) c , d100000 c ⋅ log( n ) d⋅ log( log( n ) ) c , d
Selain itu, apa yang Dave sebutkan adalah penting: jika operasi dipercepat maka dieksekusi, katakanlah, seringkali, kecepatan konstan menjadi speedup linier, yaitu Anda dapat mengurangi tetapan utama seluruh algoritma Anda! Seperti yang saya katakan di atas, itu luar biasa. Lihat saja apa yang terjadi jika Anda menjalankan operasi kali:n
[ sumber ]
Sekarang jika itu tidak sepadan dengan masalahnya, saya tidak tahu apa.
sumber
Orang dapat membayangkan bahwa perbedaan dalam kompleksitas benar-benar tidak terlalu penting, dan bahwa waktu berjalan yang sebenarnya lebih penting. Tetapi jika algoritma merupakan inti dari algoritma lain, maka perbedaan ini mungkin penting.
Dari tujuan teoretis semata, perbedaan tentu saja penting, terutama jika algoritma merupakan bagian dari yang lain. Ini dapat menempatkan algoritma yang lebih besar di kelas kompleksitas yang berbeda.
sumber
Saya sebenarnya pernah mengukur pohon van Emde-Boas sendiri. Saya membandingkannya dengan AA Tree, hashmap, dan array bit.
Tes melakukan
size
sisipan dengan angka acak dalam interval[0, bound]
, kemudiansize
mencari, lalusize
menghapus dan kemudiansize
mencari lagi . Penghapusan dilakukan dengan angka acak juga, jadi pertama-tama Anda harus mencari tahu apakah mereka ada dalam struktur sama sekali.Berikut ini hasilnya (
size
= 2000000,bound
= 10000000) dalam hitungan detik:Seperti yang Anda lihat, pohon van Emde-Boas sekitar dua kali lebih lambat dari peta hash, sepuluh kali lebih lambat dari bit array, dan 5 kali lebih cepat dari pohon pencarian biner.
Tentu saja hal di atas memerlukan penafian: tes ini adalah buatan, Anda mungkin dapat meningkatkan kode atau menggunakan bahasa yang berbeda dengan kompiler yang outputnya lebih cepat, dan seterusnya dan seterusnya.
Penafian ini adalah inti dari alasan kami menggunakan analisis asimtotik dalam desain algoritma: karena Anda tidak tahu apa konstanta dan karena konstanta dapat berubah tergantung pada faktor lingkungan, yang terbaik yang bisa kita lakukan adalah analisis asimptotik.
sumber