在理論學習篇中,我提到要學會hash表初始化、插入元素、查詢元素三大操作。
在介紹三大操作之前,首先介紹所用到的資料結構。
一、資料結構
1.hash表的結構
接下來介紹的都是hash表的拉鍊法。有兩種hash表的結構,推薦使用結構二。詳細說明見下面。
結構一
//hash table
typedef
struct
_hash_tablehash_table;
結構二
struct
yk_hash_counter_entry ;
2.hash表的桶的結構,即hash表中鍊錶的結點結構
結構一//node
typedef
struct
_nodenode;
結構二
struct
yk_hash_key ;
說明:
1)hash表中鍊錶的結點結構是一樣的,即包含資料(未hash過的真實資料)及next指標。
2)hash表的結構推薦結構二,因為在結構二中,包含了除了鍊錶以外的其他資訊,更加方便使用。
那麼接下來詳細論述一下三大操作。
二.hash表初始化
1.固定長度的hash表初始化
固定長度的hash表初始化是最簡單的也是最常用的一種初始化方式。
hash表初始化:就是為hash表陣列分配空間,並都賦值為0.
給出結構二的hash表初始化
void
hashtest_init()
for(i = 0; i < backet_len; i++)
}
2.長度動態變化的hash表初始化
目前我只在nginx的hash實現中看到長度動態變化的hash表的初始化。其原理是根據要插入的元素的數目,動態調整hash表陣列的長度。
詳見文章:
三、插入元素
插入元素key的原理:
記hash函式為hash_func,要插入元素為key。
1)對於每乙個元素key,首先計算其hash值,hash_value=hash_func(key)。通過hash_value定位到hash表的第hash_value個元素。
2)如果hash表的第hash_value個元素為空,那麼直接插入乙個結點,結點內容就是該key
3)如果hash表的第hash_value個元素不為空,那麼檢查hash表中是否存在相同元素key,如果存在就退出,不存在的話繼續執行。
4)遍歷完整個hash表,依舊不存在相同元素key,那麼就新建乙個結點,結點內容是該key,然後將該結點插入到鍊錶的末尾。
函式實現:
status insert_data_into_hash(hash_table * hashtb,type data)
/*if*/
if( (find_data_from_hash(hashtb,data)) )
for(;pnode->next;)
/*for*/
if((pnewnode = (node*)malloc(
sizeof
(node))) == null)
return
false;
memset(pnewnode,0,
sizeof
(node));
pnewnode->data = data;
pnewnode->next = null;
pnode->next = pnewnode;
/*insert data to end of chain*/
return
true;
}
四、查詢元素
插入元素key的原理:
記hash函式為hash_func,要插入元素為key。
1)對於每乙個元素key,首先計算其hash值,hash_value=hash_func(key)。通過hash_value定位到hash表的第hash_value個元素。
2)如果hash表的第hash_value個元素為空,返回null,不存在該結點
3)如果hash表的第hash_value個元素不為空,那麼檢查hash表中是否存在相同元素key,如果存在就返回該結點的位址,不存在的話返回null。
node* find_data_from_hash(hash_table * hashtb,type data)
for(;pnode;pnode = pnode->next)
printf(
"no data\n"
);return
null;
}
五、總結
這是hash的基礎內容,要想進一步學習,就必須先學會這些基本內容。
資料結構HASH總結四 程式高階篇
問題一 搜尋引擎會通過日誌檔案把使用者每次檢索使用的所有檢索串都記錄下來,每個查詢串的長度為1 255位元組。假設目前有一千萬個記錄 這些查詢串的重複度比較高,雖然總數是1千萬,但如果除去重複後,不超過3百萬個。乙個查詢串的重複度越高,說明查詢它的使用者越多,也就是越熱門。請你統計最熱門的10個查詢...
資料結構之二(hash)
hash表 hash表作為一種動態集合資料結構,一般只支援 插入 查詢 刪除操作 而且每個操作的時間複雜度一般控制在o 1 內。hash表是普通陣列的一種推廣。因為陣列可以在直接通過下標來定位要查詢的元素,時間為o 1 因此hash表目標也是使用一些技術,以達到可以在o 1 的時間內完成操作。嚴格來...
資料結構 hash
雜湊表 hash table,也叫雜湊表 是根據鍵 key 而直接訪問在記憶體儲存位置的資料結構。分為兩個步驟 hash函式 通過乙個關於鍵值的hash函式,得到所查詢的資料對映到表中乙個位置。訪問資料 不同的key 經過hash函式 可能計算得到相同的輸出。此時叫做衝突,衝突的資料又成乙個表。一般...