Saya punya pertanyaan dengan hash_map
dan map
dalam C ++. Saya mengerti bahwa map
ada di STL, tetapi hash_map
bukan standar. Apa perbedaan keduanya?
117
Mereka diterapkan dengan cara yang sangat berbeda.
hash_map
( unordered_map
di TR1 dan Boost; gunakan itu sebagai gantinya) gunakan tabel hash di mana kuncinya di-hash ke slot di tabel dan nilainya disimpan dalam daftar yang terkait dengan kunci itu.
map
diimplementasikan sebagai pohon pencarian biner yang seimbang (biasanya pohon merah / hitam).
An unordered_map
harus memberikan kinerja yang sedikit lebih baik untuk mengakses elemen koleksi yang diketahui, tetapi a map
akan memiliki karakteristik tambahan yang berguna (misalnya disimpan dalam urutan yang diurutkan, yang memungkinkan traversal dari awal hingga akhir). unordered_map
akan lebih cepat saat memasukkan dan menghapus daripada a map
.
hash_map
adalah ekstensi umum yang disediakan oleh banyak implementasi perpustakaan. Itulah mengapa itu diganti namanyaunordered_map
ketika ditambahkan ke standar C ++ sebagai bagian dari TR1. map umumnya diimplementasikan dengan pohon biner yang seimbang seperti pohon merah-hitam (implementasinya bervariasi tentunya).hash_map
danunordered_map
umumnya diimplementasikan dengan tabel hash. Dengan demikian ketertiban tidak terjaga.unordered_map
masukkan / hapus / kueri akan menjadi O (1) (waktu konstan) di mana peta akan menjadi O (log n) di mana n adalah jumlah item dalam struktur data. Jadiunordered_map
lebih cepat, dan jika Anda tidak peduli dengan urutan item harus lebih disukaimap
. Terkadang Anda ingin menjaga ketertiban (dipesan oleh kunci) dan untuk itumap
akan menjadi pilihan.sumber
Beberapa perbedaan utama terletak pada persyaratan kompleksitas.
A
map
membutuhkanO(log(N))
waktu untuk operasi penyisipan dan pencarian, karena ini diimplementasikan sebagai struktur data Pohon Merah-Hitam .An
unordered_map
memerlukan waktu 'rata-rata'O(1)
untuk penyisipan dan penemuan, tetapi diizinkan untuk memiliki waktu kasus terburukO(N)
. Ini karena diimplementasikan menggunakan struktur data Tabel Hash .Jadi, biasanya,
unordered_map
akan lebih cepat, tetapi tergantung pada tombol dan fungsi hash yang Anda simpan, bisa menjadi jauh lebih buruk.sumber
Spesifikasi C ++ tidak mengatakan dengan tepat algoritme apa yang harus Anda gunakan untuk penampung STL. Namun, hal itu menempatkan batasan tertentu pada kinerja mereka, yang mengesampingkan penggunaan tabel hash untuk
map
dan wadah asosiatif lainnya. (Mereka paling sering diterapkan dengan pohon merah / hitam.) Batasan ini memerlukan kinerja kasus terburuk yang lebih baik untuk penampung ini daripada yang dapat diberikan tabel hash.Banyak orang benar-benar menginginkan tabel hash, bagaimanapun, jadi wadah asosiatif STL berbasis hash telah menjadi ekstensi umum selama bertahun-tahun. Akibatnya, mereka menambahkan
unordered_map
dan menambahkannya ke versi standar C ++.sumber
map
umumnya pohon yang seimbang adalah karena digunakanoperator<()
sebagai alat untuk menentukan lokasi.map
diimplementasikan daribalanced binary search tree
(biasanya arb_tree
), karena semua anggota dibalanced binary search tree
diurutkan begitu juga dengan map;hash_map
diimplementasikan dari.hashtable
Karena semuahashtable
anggota dalamhash_map(unordered_map)
tidak diurutkan sehingga anggota dalam tidak diurutkan.hash_map
bukan pustaka standar c ++, tetapi sekarang diubah namanya menjadiunordered_map
(Anda dapat menganggapnya berganti nama) dan menjadi pustaka standar c ++ sejak c ++ 11 lihat pertanyaan ini Perbedaan antara hash_map dan unordered_map? untuk lebih detail.Di bawah ini saya akan memberikan beberapa antarmuka inti dari kode sumber tentang bagaimana peta tipe dua diimplementasikan.
peta:
Kode di bawah ini hanya untuk menunjukkan bahwa, map hanyalah pembungkus dari sebuah
balanced binary search tree
, hampir semua fungsinya hanya memanggilbalanced binary search tree
fungsi tersebut.hash_map
:hash_map
diimplementasikan darihashtable
yang strukturnya agak seperti ini:Pada kode di bawah ini, saya akan memberikan bagian utama dari
hashtable
, dan kemudian memberikanhash_map
.Seperti
map's
hanya anggotarb_tree
,hash_map's
satu - satunya anggotahashtable
. Itu kode utama seperti di bawah ini:Gambar di bawah ini menunjukkan ketika hash_map memiliki 53 keranjang, dan memasukkan beberapa nilai, struktur internalnya.
Gambar di bawah ini menunjukkan beberapa perbedaan antara map dan hash_map (unordered_map), gambar berasal dari Bagaimana memilih antara map dan unordered_map? :
sumber
Saya tidak tahu apa yang memberi, tetapi, hash_map membutuhkan lebih dari 20 detik untuk menghapus () 150K kunci integer unsigned dan nilai float. Saya hanya menjalankan dan membaca kode orang lain.
Beginilah cara menyertakan hash_map.
Saya membaca ini di sini https://bytes.com/topic/c/answers/570079-perfomance-clear-vs-swap
mengatakan bahwa clear () adalah urutan O (N). Bagi saya, itu sangat aneh, tapi begitulah adanya.
sumber