Logaritmik vs kompleksitas waktu logaritmik ganda

9

Dalam aplikasi dunia nyata, apakah ada manfaat konkret saat menggunakan daripada algoritma ?O ( log ( n ) )O(log(log(n))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. 5n<1065

Mengingat bahwa saya pribadi lebih suka BST daripada VEB-tree, bagaimana menurut Anda?

Orang dapat dengan mudah menunjukkan bahwa:

n<106. lognlog(log(n))<5.26146

Ghassen Hamrouni
sumber
pada dasarnya Anda harus melihat konstanta yang terlibat dalam algoritma untuk nilai / ukuran input yang lebih kecil. Idealnya kita ingin mereka menjadi kecil.
singhsumit
3
Perhatikan bahwa telah ada banyak perbaikan sejak VEB tree, berjumlah dalam struktur data pada RAM dengan kompleksitas pencarian / masukkan / hapus dari tanpa pengacakan (deterministik) dan dengan pengacakan. Lihat Penyortiran Deterministik dalam Waktu dan Ruang Linier. oleh Han, dan Waktu yang Diharapkan dan Ruang Linier. oleh Han dan Thorup. O ( O(log log n) O (nloglogn) O (O(log log n)O(n log log n)O(log log n)
AT
Di dunia nyata, faktor 5 cukup signifikan, dan jumlah item sering kali 10 ^ 9 atau bahkan 10 ^ 12.
RBarryYoung

Jawaban:

10

Jangan lupa bahwa masih tumbuh secara eksponensial (dalam ) lebih cepat dari !log ( n ) log ( log n )lognlog(n)log(logn)

Memang, jika Anda melihat hasil bagi dan , tidak banyak yang mengesankan untuk dilihat:log ( log ( n ) )log(n)log(log(n))

log (n) / log (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 , d100000clog(n)dlog(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

n * log (n) / (n * log (log (n)))
[ sumber ]

Sekarang jika itu tidak sepadan dengan masalahnya, saya tidak tahu apa.

Raphael
sumber
6

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.

Dave Clarke
sumber
6

Saya sebenarnya pernah mengukur pohon van Emde-Boas sendiri. Saya membandingkannya dengan AA Tree, hashmap, dan array bit.

Tes melakukan sizesisipan dengan angka acak dalam interval [0, bound], kemudian sizemencari, lalu sizemenghapus dan kemudian sizemencari 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:

AATreeLookup - O(n log n)
Inserting... 3.3652452
Searching... 5.2280724
Deleting...  7.3457427
Searching... 9.1462039
HashLookup - O(n) expected
Inserting... 0.3369505
Searching... 0.6223035
Deleting...  0.9062163
Searching... 1.1718223
VanEmdeBoasTree - O(n log log n)
Inserting... 0.7007531
Searching... 1.1775800
Deleting...  1.7257065
Searching... 2.2147703
ArrayLookup - O(n)
Inserting... 0.0681897
Searching... 0.1720300
Deleting...  0.2387776
Searching... 0.3413800

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.

lognloglogn232log232=32log32=5

Alex ten Brink
sumber
Mungkin melompat ke R (atau setara) dan menghasilkan beberapa grafik cantik (seperti @Raphael lakukan).
Dave Clarke
1
lognloglogn
@DaveClarke: terima kasih atas sarannya. Sayangnya, saya cukup buruk dalam menghasilkan gambar yang cantik - saya pikir hasil edit saya memang meningkatkan keterbacaan hasil saya.
Alex ten Brink
Mungkin tidak ada cukup data untuk gambar yang tepat. Tidak masalah .... tetapi belajar membuat gambar yang bagus adalah keterampilan yang berguna.
Dave Clarke