Lisp語言 雜湊表 hash table

2021-08-27 01:56:30 字數 2119 閱讀 7977

雜湊表,也就是hash-table,在程式設計過程中會經常使用到,它以「關鍵字--數值」這樣的對應關係儲存資料,適合用於儲存那些需要通過關鍵字查詢數值的資料。

再說,這種涉及理論的高深話題也不是我這種半途出家的人能說明白的,就是叫我講我也不一定講的清楚。說來慚愧,在剛開始工作的第一年中,我幾乎是在完全無知的狀態下異常開心地使用著雜湊表,直到有一天抓住乙個實習的計算機研究生,以「不恥上問」的態度死纏爛打才問明白。

在lisp中建立雜湊表很簡單,簡單到不需要引數,直接呼叫make-hash-table就可以了,如以下樣例:

(setf my-hash-t (make-hash-table))
以上**通過(make-hash-table)建立了乙個雜湊表,再將它賦予變數my-hash-t。

如果需要獲取雜湊表中某乙個關鍵字對應的數值,可以使用gethash函式,如以下**可以獲取雜湊表my-hash-t中關鍵字nb001對應的數值:

(gethash 'nb001 my-hash-t)
當然,如果只是建立了雜湊表,並沒有新增元素,以上**會返回nil的。

為了給雜湊表新增元素,可以直接使用setf函式,第乙個引數是gethash獲得的關鍵字位置,第二個引數是希望新增的數值,如:

(setf (gethash 'nb002 my-hash-t) "tom")
以上**為雜湊表my-hash-t新增了一對元素,其關鍵字為nb002,數值為「tom」

需要注意的是雜湊表中乙個關鍵字只能對應乙個數值,同乙個關鍵字無法賦予兩個不同的值。如下面的**會將nb001的數值設定為「jerry」。後面那句setf生效,這個和變數的賦值的類似的。

(setf (gethash 'nb001 my-hash-t) "mike")

(setf (gethash 'nb001 my-hash-t) "jerry")

最後是有關雜湊表的遍歷,lisp中的雜湊表可以通過maphash函式進行迭代,形式如下:

(maphash #'(lambda (key value) 

(format *query-io* "key: ~a value: ~a ~%" key value))

my-hash-t)

以上**使用了lambda定義了乙個匿名函式,該函式接受key和value兩個引數,函式中輸出key和value的值。

maphash函式呼叫的形式是:(maphash 匿名函式 雜湊表), maphash函式會將雜湊表中的關鍵字和對應數值逐對提取出來,賦予「匿名函式」的兩個引數,然後呼叫匿名函式。

有關lambda的使用我們後面再詳細討論,這裡簡單把它看作是乙個匿名函式就可以了。

下面是lisp中使用雜湊表的完整樣例和對應執行截圖:

lisp不是函授型語言 LISP語言

拼音 lisp yuyan 外文 lisp 為非數值符號運算而設計的表處理語言。lisp是英文list processing 表處理 的縮寫。lisp語言是1960年j.麥卡錫在遞迴函式論基礎上首先設計出來的。lisp語言的形式化程度高,表達力強,適合於描述各種知識和編寫問題求解的程式,因此一直是用...

雜湊表新增(C語言(雜湊表(icoding

雜湊表新增 雜湊表 hash table,也叫雜湊表 是根據鍵 key 而直接訪問在記憶體儲存位置的資料結構。也就是說,它通過計算乙個關於鍵值的函式,將所需查詢的資料對映到表中乙個位置來訪問記錄,這加快了查詢速度。這個對映函式稱做雜湊函式,存放記錄的陣列稱做雜湊表。雜湊表相關定義如下 typedef...

雜湊表 雜湊表 C語言簡單實現

本文參考自 大話資料結構 通過某個函式f計算出記錄的儲存位置,而不需要通過比較,這就是一種新的儲存技術 雜湊技術。雜湊技術是在記錄的儲存位置和它的關鍵字之間建立乙個確定的對應關係f,使得每個關鍵字key對應乙個儲存位置f key 在查詢時,根據這個確定的對應關係找到給定值key的對映f key 若查...