Salah satu hal yang saya rindukan saat menulis program di C adalah struktur data kamus. Apa cara paling nyaman untuk mengimplementasikannya di C? Saya tidak mencari kinerja, tetapi kemudahan mengkodekannya dari awal. Saya tidak ingin menjadi generik juga - sesuatu seperti string-> int akan dilakukan. Tapi saya ingin bisa menyimpan jumlah item yang sewenang-wenang.
Ini lebih dimaksudkan sebagai latihan. Saya tahu bahwa ada perpustakaan pihak ke-3 yang tersedia yang bisa digunakan. Tetapi pertimbangkan sejenak, bahwa mereka tidak ada. Dalam situasi seperti itu, apa cara tercepat Anda dapat mengimplementasikan kamus yang memenuhi persyaratan di atas.
c
data-structures
dictionary
Rohit
sumber
sumber
Jawaban:
Bagian 6.6 dari Bahasa Pemrograman C menyajikan struktur data kamus sederhana (hashtabel). Saya tidak berpikir implementasi kamus yang berguna bisa menjadi lebih sederhana dari ini. Untuk kenyamanan Anda, saya mereproduksi kode di sini.
Perhatikan bahwa jika hash dari dua string bertabrakan, itu dapat menyebabkan
O(n)
waktu pencarian. Anda dapat mengurangi kemungkinan tabrakan dengan meningkatkan nilaiHASHSIZE
. Untuk diskusi lengkap tentang struktur data, silakan baca buku.sumber
hashval = *s + 31 * hashval;
tepatnya 31 dan bukan yang lain?Cara tercepat adalah dengan menggunakan implementasi yang sudah ada, seperti uthash .
Dan, jika Anda benar - benar ingin membuat kode sendiri, algoritme dari
uthash
dapat diperiksa dan digunakan kembali. Ini dilisensikan BSD jadi, selain dari persyaratan untuk menyampaikan pemberitahuan hak cipta, Anda cukup tak terbatas dalam hal apa yang dapat Anda lakukan dengannya.sumber
Untuk kemudahan implementasi, sulit untuk mengalahkan pencarian secara naif melalui array. Selain dari beberapa pengecekan kesalahan, ini adalah implementasi lengkap (belum diuji).
sumber
Buat fungsi hash sederhana dan beberapa daftar struktur yang ditautkan, tergantung pada hash, tetapkan daftar tautan mana yang akan dimasukkan nilainya. Gunakan hash untuk mengambilnya juga.
Saya melakukan implementasi sederhana beberapa waktu lalu:
sumber
GLib dan gnulib
Ini kemungkinan adalah taruhan terbaik Anda jika Anda tidak memiliki persyaratan yang lebih spesifik, karena tersedia secara luas, mudah dibawa-bawa dan kemungkinan efisien.
GLib: https://developer.gnome.org/glib/ oleh proyek GNOME. Beberapa kontainer didokumentasikan di: https://developer.gnome.org/glib/stable/glib-data-types.html termasuk "Tabel Hash" dan "Pohon Biner Seimbang". Lisensi: LGPL
gnulib: https://www.gnu.org/software/gnulib/ oleh proyek GNU. Anda seharusnya menyalin tempel sumber ke kode Anda. Beberapa kontainer didokumentasikan di: https://www.gnu.org/software/gnulib/MODULES.html#ansic_ext_container termasuk "rbtree-list", "daftar-hash-list" dan "-rbtreehash-list". Lisensi GPL.
Lihat juga: Apakah ada pustaka sumber terbuka C dengan struktur data umum?
sumber
di sini adalah implementasi cepat, saya menggunakannya untuk mendapatkan 'Matrix' (sruct) dari sebuah string. Anda dapat memiliki array yang lebih besar dan mengubah nilainya saat dijalankan juga:
sumber
Saya terkejut tidak ada yang disebutkan hsearch / hcreate set perpustakaan yang walaupun tidak tersedia di windows, tetapi diamanatkan oleh POSIX, dan karena itu tersedia di sistem Linux / GNU.
Tautan ini memiliki contoh dasar yang sederhana dan lengkap yang menjelaskan penggunaannya dengan sangat baik.
Ia bahkan memiliki varian thread yang aman, mudah digunakan dan sangat performant.
sumber
Hashtable adalah implementasi tradisional dari "Kamus" sederhana. Jika Anda tidak peduli dengan kecepatan atau ukuran, cukup google untuk itu . Ada banyak implementasi yang tersedia secara bebas.
inilah yang pertama saya lihat - sekilas, itu terlihat ok untuk saya. (Ini cukup mendasar. Jika Anda benar-benar ingin menyimpan data dalam jumlah yang tidak terbatas, maka Anda perlu menambahkan beberapa logika untuk "realokasi" memori tabel saat itu tumbuh.)
semoga berhasil!
sumber
Hashing adalah kuncinya. Saya pikir menggunakan tabel pencarian dan kunci hashing untuk ini. Anda dapat menemukan banyak fungsi hashing online.
sumber
Metode tercepat akan menggunakan pohon biner. Kasus terburuknya juga hanya O (logn).
sumber