LISP - Tabel Hash
Struktur data tabel hash mewakili kumpulan key-and-valuepasangan yang diatur berdasarkan kode hash kunci. Ini menggunakan kunci untuk mengakses elemen dalam koleksi.
Tabel hash digunakan saat Anda perlu mengakses elemen dengan menggunakan kunci, dan Anda dapat mengidentifikasi nilai kunci yang berguna. Setiap item dalam tabel hash memiliki pasangan kunci / nilai. Kuncinya digunakan untuk mengakses item dalam koleksi.
Membuat Tabel Hash di LISP
Dalam LISP Umum, tabel hash adalah kumpulan tujuan umum. Anda dapat menggunakan objek arbitrer sebagai kunci atau indeks.
Saat Anda menyimpan nilai dalam tabel hash, Anda membuat pasangan nilai kunci, dan menyimpannya di bawah kunci tersebut. Nanti Anda dapat mengambil nilai dari tabel hash menggunakan kunci yang sama. Setiap kunci dipetakan ke satu nilai, meskipun Anda dapat menyimpan nilai baru dalam sebuah kunci.
Tabel hash, dalam LISP, dapat dikategorikan menjadi tiga jenis, berdasarkan cara kunci dapat dibandingkan - eq, eql atau equal. Jika tabel hash di-hash pada objek LISP maka kuncinya dibandingkan dengan eq atau eql. Jika hash tabel hash pada struktur pohon, maka akan dibandingkan menggunakan persamaan.
Itu make-hash-tablefungsi digunakan untuk membuat tabel hash. Sintaks untuk fungsi ini adalah -
make-hash-table &key :test :size :rehash-size :rehash-threshold
Dimana -
Itu key Argumen memberikan kuncinya.
Itu :testargumen menentukan bagaimana kunci dibandingkan - ia harus memiliki satu dari tiga nilai # 'eq, #' eql, atau # 'sama, atau salah satu dari tiga simbol eq, eql, atau sama. Jika tidak ditentukan, eql diasumsikan.
Itu :sizeargumen menetapkan ukuran awal tabel hash. Ini harus berupa bilangan bulat yang lebih besar dari nol.
Itu :rehash-sizeargumen menentukan seberapa banyak untuk meningkatkan ukuran tabel hash ketika sudah penuh. Ini bisa berupa bilangan bulat yang lebih besar dari nol, yang merupakan jumlah entri yang akan ditambahkan, atau bisa berupa angka floating-point yang lebih besar dari 1, yang merupakan rasio ukuran baru dengan ukuran lama. Nilai default untuk argumen ini bergantung pada implementasi.
Itu :rehash-thresholdargumen menentukan seberapa penuh tabel hash bisa didapat sebelum harus berkembang. Ini bisa berupa bilangan bulat yang lebih besar dari nol dan kurang dari: rehash-size (dalam hal ini akan diskalakan setiap kali tabel dikembangkan), atau bisa berupa angka floating-point antara nol dan 1. Nilai default untuk ini Argumennya bergantung pada implementasi.
Anda juga bisa memanggil fungsi make-hash-table tanpa argumen.
Mengambil Item dari dan Menambahkan Item ke Tabel Hash
Itu gethashfungsi mengambil item dari tabel hash dengan mencari kuncinya. Jika tidak menemukan kunci, maka hasilnya nihil.
Ini memiliki sintaks berikut -
gethash key hash-table &optional default
dimana -
key: adalah kunci terkait
hash-table: adalah tabel hash yang akan dicari
default: adalah nilai yang akan dikembalikan, jika entri tidak ditemukan, yaitu nihil, jika tidak ditentukan.
Itu gethash fungsi sebenarnya mengembalikan dua nilai, yang kedua adalah nilai predikat yang benar jika entri ditemukan, dan salah jika tidak ada entri yang ditemukan.
Untuk menambahkan item ke tabel hash, Anda dapat menggunakan setf berfungsi bersama dengan gethash fungsi.
Contoh
Buat file kode sumber baru bernama main.lisp dan ketikkan kode berikut di dalamnya.
(setq empList (make-hash-table))
(setf (gethash '001 empList) '(Charlie Brown))
(setf (gethash '002 empList) '(Freddie Seal))
(write (gethash '001 empList))
(terpri)
(write (gethash '002 empList))
Saat Anda menjalankan kode, ia mengembalikan hasil berikut -
(CHARLIE BROWN)
(FREDDIE SEAL)
Menghapus Entri
Itu remhashfungsi menghapus entri apa pun untuk kunci tertentu dalam tabel hash. Ini adalah predikat yang benar jika ada entri atau salah jika tidak ada.
Sintaks untuk fungsi ini adalah -
remhash key hash-table
Contoh
Buat file kode sumber baru bernama main.lisp dan ketikkan kode berikut di dalamnya.
(setq empList (make-hash-table))
(setf (gethash '001 empList) '(Charlie Brown))
(setf (gethash '002 empList) '(Freddie Seal))
(setf (gethash '003 empList) '(Mark Mongoose))
(write (gethash '001 empList))
(terpri)
(write (gethash '002 empList))
(terpri)
(write (gethash '003 empList))
(remhash '003 empList)
(terpri)
(write (gethash '003 empList))
Saat Anda menjalankan kode, ia mengembalikan hasil berikut -
(CHARLIE BROWN)
(FREDDIE SEAL)
(MARK MONGOOSE)
NIL
Fungsi maphash
Itu maphash function memungkinkan Anda untuk menerapkan fungsi tertentu pada setiap key-value pair pada tabel hash.
Dibutuhkan dua argumen - fungsi dan tabel hash dan memanggil fungsi satu kali untuk setiap pasangan kunci / nilai dalam tabel hash.
Contoh
Buat file kode sumber baru bernama main.lisp dan ketikkan kode berikut di dalamnya.
(setq empList (make-hash-table))
(setf (gethash '001 empList) '(Charlie Brown))
(setf (gethash '002 empList) '(Freddie Seal))
(setf (gethash '003 empList) '(Mark Mongoose))
(maphash #'(lambda (k v) (format t "~a => ~a~%" k v)) empList)
Saat Anda menjalankan kode, ia mengembalikan hasil berikut -
3 => (MARK MONGOOSE)
2 => (FREDDIE SEAL)
1 => (CHARLIE BROWN)