Tampaknya di mana pun saya melihat, struktur data sedang dilaksanakan menggunakan pohon merah-hitam ( std::set
dalam C ++, SortedDictionary
di C #, dll.)
Baru saja membahas (a, b), pohon merah-hitam & AVL di kelas algoritme saya, inilah yang saya dapatkan (juga dari bertanya di sekitar profesor, melihat-lihat beberapa buku dan sedikit mencari di Google):
- Pohon AVL memiliki kedalaman rata-rata yang lebih kecil daripada pohon merah-hitam, dan karenanya mencari nilai dalam pohon AVL secara konsisten lebih cepat.
- Pohon merah-hitam membuat lebih sedikit perubahan struktural untuk menyeimbangkan diri dari pohon AVL, yang bisa membuatnya berpotensi lebih cepat untuk disisipkan / dihapus. Saya katakan berpotensi, karena ini akan tergantung pada biaya perubahan struktural ke pohon, karena ini akan sangat tergantung pada runtime dan implemntation (mungkin juga sangat berbeda dalam bahasa fungsional ketika pohon tidak dapat diubah?)
Ada banyak tolok ukur online yang membandingkan AVL dan pohon merah-hitam, tetapi yang mengejutkan saya adalah bahwa pada dasarnya profesor saya berkata, bahwa biasanya Anda akan melakukan salah satu dari dua hal:
- Entah Anda tidak terlalu peduli tentang kinerja, dalam hal perbedaan 10-20% dari AVL vs Merah-hitam dalam banyak kasus tidak akan menjadi masalah sama sekali.
- Atau Anda benar-benar peduli dengan kinerja, di mana Anda akan meninggalkan AVL dan pohon merah-hitam, dan menggunakan B-tree, yang dapat diubah agar bekerja lebih baik (atau (a, b) -tree, saya ' Aku akan meletakkan semua itu dalam satu keranjang.)
Alasan untuk itu adalah karena B-tree menyimpan data lebih padat dalam memori (satu node berisi banyak nilai) akan ada lebih sedikit cache yang hilang. Anda juga dapat mengubah implementasi berdasarkan use case, dan membuat urutan B-tree bergantung pada ukuran cache CPU, dll.
Masalahnya adalah bahwa saya tidak dapat menemukan hampir semua sumber yang akan menganalisis penggunaan kehidupan nyata implementasi pohon pencarian yang berbeda pada perangkat keras modern yang sebenarnya. Saya telah membaca banyak buku tentang algoritma dan belum menemukan apa pun yang akan membandingkan varian pohon yang berbeda secara bersamaan, selain menunjukkan bahwa satu memiliki kedalaman rata-rata yang lebih kecil daripada yang lainnya (yang tidak benar-benar mengatakan banyak tentang bagaimana pohon akan berperilaku dalam program nyata.)
Yang sedang berkata, apakah ada alasan khusus mengapa pohon merah-hitam digunakan di mana-mana, ketika berdasarkan apa yang dikatakan di atas, pohon B harus mengungguli mereka? (sebagai satu-satunya patokan saya dapat menemukan juga menunjukkan http://lh3lh3.users.sourceforge.net/udb.shtml , tetapi mungkin hanya masalah implementasi spesifik). Atau apakah alasan mengapa setiap orang menggunakan pohon merah-hitam karena mereka agak mudah diimplementasikan, atau dengan kata lain, sulit untuk diterapkan dengan buruk?
Juga, bagaimana hal ini berubah ketika seseorang pindah ke bidang bahasa fungsional? Tampaknya Clojure dan Scala menggunakan array Hash yang dipetakan , di mana Clojure menggunakan faktor percabangan 32.