最近我在做乙個專案,其中要用到乙個資料結構——hash table(雜湊表),以前只有理論知識,現在實卻發現很不簡單,所以寫下來和大家共分享。
我們知道,雜湊表是乙個固定大小的陣列,陣列的每個元素是乙個鍊錶(單向或雙向)的頭指標。如果key一樣,則在一起,如果key不一樣,則不在一起。雜湊表的查詢是飛快的。因為它不需要從頭搜尋,它利用key的「雜湊演算法」直接定位,查詢非常快,各種資料庫中的資料結構基本都是它。但帶來的問題是,雜湊表的尺寸、雜湊演算法。
雜湊表的陣列是定長的,如果太大,則浪費,如果太小,體現不出效率。合適的陣列大小是雜湊表的效能的關鍵。雜湊表的尺寸最好是乙個質數,最小的質數尺寸是17。
當然,根據不同的資料量,會有不同的雜湊表的大小。對於資料量很時多時少的應用,最好的設計是使用動態可變尺寸的雜湊表,那麼如果你發現雜湊表尺寸太小了,比如其中的元素是雜湊表尺寸的2倍時,我們就需要擴大雜湊表尺寸,一般是擴大一倍。下面的數庫是雜湊表變化尺寸時尺寸大小的乙個列表。
static int prime_array = ;
#define prime_array_size (28)
要使用雜湊表,就一定要用乙個雜湊演算法,來確定key值,這似乎是個很難的事,下面是乙個雜湊演算法:
typedef struct _htab htab;
static unsigned int
gethashindex(htab *tabptr, const char *key)
{unsigned int ha = 0;
while (*key)
ha = (ha * 128 + *key++) % tabptr->size;
return ha;
(其中key是乙個字串,htab就是乙個雜湊表結構, tabptr->size是雜湊表陣列的大小)
Perl中陣列和雜湊表的用法小結(ZZ)
1 二維陣列 a b 1 2 3 c 4 5 6 a 0 b a 1 c 1 print a 0 0 n print a 1 0 n print a 0 0 n print a 1 0 n 2 foreach 2 n will print value of b 2 and c 2 print n w...
解析雜湊表中陣列的容量為什麼是質數
hash函式需要把原始資料均勻地分布到hash陣列裡,比如大部分是偶數,這時候如果hash陣列容量是偶數,容易使原始資料hash後不會均勻分布 2 4 6 8 10 12這6個數,如果對 6 取餘 得到 2 4 0 2 4 0 只會得到3種hash值,衝突會很多。如果對 7 取餘 得到 2 4 6 ...
為什麼求模運算要用素數(質數) 雜湊表設計
為什麼求模運算要用素數 質數 雜湊表設計 by admin 2013 年 7 月 25 日 雜記,程式設計技術 在設計用除法來散射的雜湊表時,我們都會用數值模雜湊表大小,得到的餘數來作為id存入雜湊表對應格仔中。所有文章都表明要用乙個較大的素數來作為雜湊表的大小,也就是要模乙個較大的素數。但為什麼就...