Jadi saya bertemu dengan Dictionary<int, int>
hari ini di tempat kerja. Ini tampak aneh bagi saya karena saya mungkin akan menggunakan List<int>
saja. Apakah ada perbedaan dan apakah akan ada use case di mana satu struktur lebih disukai daripada yang lain?
c#
.net
data-structures
ZeroDivide
sumber
sumber
List<T>
dalam kerangka .NET adalah array akses acak, di mana operasi pencarian biasanya lebih cepat daripada untukDictionary<int,T>
.Dictionary<TKey, TValue>
.Jawaban:
Anda akan menggunakan a
Dictionary<int, int>
jika indeks Anda memiliki arti khusus selain hanya penempatan posisi.Contoh langsung yang muncul dalam pikiran adalah menyimpan kolom id dan kolom int dalam database. Misalnya, jika Anda memiliki
[person-id]
kolom dan[personal-pin]
kolom, maka Anda dapat membawanya ke aDictionary<int, int>
. Dengan cara inipinDict[person-id]
memberi Anda PIN, tetapi indeks itu bermakna dan bukan hanya posisi dalam aList<int>
.Tapi sungguh, setiap kali Anda memiliki dua daftar bilangan bulat terkait, ini bisa menjadi struktur data yang sesuai.
sumber
List<int>
, dan bukan kamus. Lihat jawaban saya di bawah ini.Pikirkan
List
sebagai array danDictionary
sebagai tabel hash . Anda hanya akan menggunakanDictionary
jika Anda perlu memetakan (atau mengaitkan) kunci nilai yang bermakna, sedangkanList
hanya peta (atau rekan) yang memposisikan (atau indeks) nilai.Misalnya, Anda ingin menyimpan hubungan antara usia dan tinggi badan seseorang. Anda dapat menggunakan a
Dictionary<int, int>
untuk memetakan usia seseorang (anint
) hingga tinggi mereka (anint
):Bukan contoh yang sangat berguna, tetapi intinya adalah Anda tidak akan dapat melakukan ini dengan elegan
List
karena itu perlu menyimpan nilai-nilai ini secara posisi.sumber
List
transaksi dengan pesanan , di mana suatuDictionary
transaksi dengan asosiasi . Jika Anda perlu mendapatkan data Anda dalam urutan tertentu setiap kali, atau urutan mereka dalam kaitannya dengan satu sama lain adalah penting, aList
adalah cara untuk pergi.Dictionaries
cenderung tidak teratur, dan berurusan dengan pemetaan kunci -> hubungan nilai.Secara semantik, a
Dictionary<int, T>
danList<T>
sangat mirip, keduanya adalah wadah akses acak dari kerangka NET. Untuk menggunakan daftar sebagai pengganti kamus, Anda memerlukan nilai khusus dalam jenis AndaT
(sepertinull
) untuk mewakili slot kosong dalam daftar Anda. JikaT
bukan tipe nullableint
, Anda bisa menggunakanint?
saja, atau jika Anda hanya berharap untuk menyimpan nilai positif, Anda juga bisa menggunakan nilai khusus seperti -1 untuk mewakili slot kosong.Yang mana yang akan Anda pilih harus bergantung pada kisaran nilai kunci. Jika kunci Anda dalam
Dictionary<int, T>
berada dalam interval integer, tanpa banyak celah di antara mereka (misalnya, 80 nilai dari [0, ... 100]), maka aList<T>
akan lebih sesuai, karena pengaksesan oleh indeks lebih cepat, dan ada lebih sedikit memori dan waktu overhead dibandingkan dengan kamus dalam kasus ini.Jika nilai kunci Anda adalah 100
int
nilai dari rentang seperti [0, ..., 1000000], makaList<T>
memori yang diperlukan untuk menyimpan nilai 1000000 T, di mana kamus Anda hanya akan membutuhkan memori dalam urutan besarnya sekitar 100 nilai T, 100 nilai int (ditambah beberapa overhead, dalam kenyataannya mengharapkan sekitar 2 kali memori untuk menyimpan 100 kunci dan nilai-nilai). Jadi dalam kasus terakhir kamus akan lebih sesuai.sumber
List<KeyValuePair<int,T>>
, tidak ada operasi pencarian O (1) yang tersedia. Kedua, elemen-elemen diList<KeyValuePair<int,T>>
dapat memiliki urutan tertentu, terlepas dari nilai-nilai kunci mereka. Jika Anda membutuhkan yang terakhir tetapi bukan yang pertama,List<KeyValuePair<int,T>>
atauList<Tuple<int,T>>
mungkin pilihan yang lebih baik. Jika Anda membutuhkan keduanya, ada jugaOrderedDictionary
.Bagaimana orang bisa menganggap mereka setara?
Kamus jarang dan memungkinkan penyisipan acak tetapi membuat traversal in-order menjadi masalah, Daftar tidak jarang dan penyisipan tidak berurutan mahal, ia secara inheren menyediakan traversal in-order.
Akan ada beberapa situasi di mana satu tidak secara dramatis lebih unggul daripada yang lain.
sumber
Selain itu: Bahasa pemrograman lain merujuk pada tipe struktur data ini sebagai Peta, bukan Kamus.
Jika data Anda secara bermakna dapat didefinisikan sebagai pasangan kunci / nilai, maka Kamus akan memberikan akses yang jauh lebih cepat jika Anda perlu menemukan nilai menggunakan kuncinya.
Misalnya, anggap Anda memiliki daftar Pelanggan. Setiap Pelanggan mencakup perincian seperti nama dan alamat, dan nomor pelanggan yang unik. Misalkan Anda juga memiliki daftar Pesanan yang sedang diproses. Setiap Pesanan akan berisi perincian tentang apa yang sedang dibuat, dan perlu menyertakan nomor pelanggan dari orang yang memesannya.
Ketika pesanan siap dikirim, Anda perlu menemukan alamat tujuan pengirimannya. Jika pelanggan disimpan sebagai Daftar biasa, maka Anda perlu mencari seluruh daftar untuk menemukan pelanggan dengan nomor pelanggan yang tepat. Sebagai gantinya, Anda bisa menyimpan pelanggan dalam Kamus, dengan nomor pelanggan sebagai kuncinya. Kamus sekarang akan memungkinkan Anda menarik pelanggan yang benar dalam satu langkah tanpa pencarian.
sumber
Kamus menggunakan hashing untuk mencari data. Kamus pertama menghitung nilai hash untuk kunci dan nilai hash ini mengarah ke ember data target. Setelah itu, setiap elemen dalam ember perlu diperiksa untuk kesetaraan. Tetapi sebenarnya daftar akan lebih cepat dari kamus pada pencarian item pertama karena tidak ada pencarian di langkah pertama. Tetapi pada langkah kedua, daftar harus melihat item pertama, dan kemudian item kedua. Jadi setiap langkah pencarian membutuhkan lebih banyak waktu. Semakin besar daftar, semakin lama waktu yang dibutuhkan.
Lebih lanjut tentang .... Kamus Vs dengan contoh.
sumber
Jika kode tersebut menyimpan dua set nilai yang berkorelasi, kelas Kamus menyediakan cara diindeks untuk mencari nilai dengan kunci. Jika hanya ada satu set nilai, tetapi set itu perlu diakses secara acak (mungkin untuk memeriksa keberadaan kunci dalam satu set), dan nilainya unik, sebuah HashSet mungkin kelas set terbaik untuk digunakan.
sumber
Ini adalah jawaban yang bagus yang tampaknya menutupi pangkalan.
Pertimbangan lain yang akan saya tawarkan adalah Kamus (dalam C #) lebih kompleks dari perspektif pengkodean. Memiliki kedua daftar dan kamus dalam basis kode yang sama membuat kode Anda lebih sulit untuk dipertahankan karena kedua metode memiliki perbedaan halus dalam cara melakukan operasi dasar seperti mencari dan menyusun data objek. Perspektif saya adalah bahwa kecuali Anda memerlukan kamus untuk alasan tertentu, gunakan daftar.
sumber