Διαδρομές
/
Common Lisp
Common Lisp
/
Ύλη
/
Πίνακες κατακερματισμού
Πί

Πίνακες κατακερματισμού σε Common Lisp

4 ασκήσεις

Σχετικά με την έννοια Πίνακες κατακερματισμού

Οι πίνακες κατακερματισμού στην Common Lisp είναι δομές δεδομένων για την αποθήκευση συσχετιστικών δεδομένων. Αντιστοιχίζουν κλειδιά (τα οποία μπορούν να είναι οποιοδήποτε αντικείμενο) σε τιμές (οι οποίες μπορούν να είναι οποιοδήποτε αντικείμενο).

Δημιουργία πινάκων κατακερματισμού

Οι πίνακες κατακερματισμού μπορούν να δημιουργηθούν με τη συνάρτηση make-hash-table.

Η συνάρτηση make-hash-table δέχεται αρκετές παραμέτρους λέξης-κλειδιού για τη λεπτομερή ρύθμιση του αρχικού μεγέθους του πίνακα κατακερματισμού καθώς και του ορίου επαναμεγέθυνσής του. Ανάτρεξε στην τεκμηρίωση για πλήρεις πληροφορίες σχετικά με αυτές. Το πιο σημαντικό είναι ότι δέχεται επίσης μια παράμετρο λέξης-κλειδιού test, η οποία καθορίζει πώς συγκρίνονται τα κλειδιά κατά την εισαγωγή, την αναζήτηση και την αφαίρεση κλειδιών και τιμών. Οι τιμές του ορίσματος test μπορούν να είναι μία από τις 'eq, 'eql, 'equal ή 'equalp, οι οποίες αντιστοιχούν στα γενικά κατηγορήματα ισότητας. Η προεπιλεγμένη τιμή είναι 'eql.

Συνήθεις λειτουργίες σε πίνακες κατακερματισμού

Για να πάρεις μια τιμή με το κλειδί της, χρησιμοποιείς τη gethash. Η gethash δέχεται ένα [προαιρετικό όρισμα][concept-defualt-arguments] που λειτουργεί ως η τιμή που θα επιστραφεί αν το κλειδί δεν υπάρχει στον πίνακα κατακερματισμού. Η gethash επιστρέφει επίσης πολλαπλές τιμές (εξηγούνται σε άλλη έννοια). Η πρώτη τιμή είναι η τιμή αυτού του κλειδιού στον πίνακα κατακερματισμού, η προεπιλεγμένη τιμή αν έχει δοθεί, ή NIL. Η δεύτερη τιμή είναι Boolean (λογική τιμή) που δείχνει αν το κλειδί υπήρχε στον πίνακα κατακερματισμού ή όχι.

Για να εισαγάγεις ένα ζεύγος κλειδιού-τιμής, χρησιμοποιείς τη setf μαζί με τη gethash.

Για να αφαιρέσεις ένα κλειδί και την τιμή του, χρησιμοποίησε τη remhash.

Για να αφαιρέσεις όλα τα κλειδιά και τις τιμές, χρησιμοποίησε τη clrhash.

Αν και ένας πίνακας κατακερματισμού στη Common Lisp, όπως και σε άλλες γλώσσες, δεν έχει εγγυημένη σειρά, μερικές φορές μπορεί να είναι χρήσιμο να τον διατρέξεις επεξεργαζόμενος κάθε ζεύγος κλειδιού/τιμής. Αυτό μπορεί να γίνει με τη maphash:

(maphash #'(lambda (key value) (print (cons key value))) *hash-table*)

(Αυτό θα εκτυπώσει κάθε κλειδί και τιμή ως ζεύγος cons, ένα ανά γραμμή.)

Αναφορά

(setf *hash-table* (make-hash-table))     ; => #<HASH-TABLE :TEST EQL :COUNT 0 {100375FD23}>
(gethash :foo *hash-table*)               ; => NIL
                                          ;    NIL
(gethash :foo *hash-table* 
         :default-value)                  ; => :DEFAULT-VALUE
                                          ;    NIL

(setf (gethash :foo *hash-table*) :bar)   ; => :BAR
(gethash :foo *hash-table*)               ; => :BAR
                                          ;    T

(setf (gethash :key *hash-table*) :value) ; => :RIGHT
(gethash :key *hash-table*)               ; => :VALUE
                                          ;    T

(remhash :key *hash-table*)               ; => T
(gethash :key *hash-table*)               ; => NIL
                                          ; => NIL
                            
(clrhash *hash-table*)                    ; => #<HASH-TABLE :TEST EQL :COUNT 0 {1005A90103}>
(gethash :foo *hash-table*)               ; => NIL
                                          ;    NIL
Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα

Μάθε την έννοια Πίνακες κατακερματισμού

Η εξάσκηση είναι κλειδωμένη

Ξεκλείδωσε 3 ακόμη ασκήσεις για να εξασκηθείς στην έννοια Πίνακες κατακερματισμού