關於雜湊表的表大小

來源:互聯網
上載者:User

最近我在做一個項目,其中要用到一個資料結構――Hash
Table(雜湊表),以前只有理論知識,現在實卻發現很不簡單,所以寫下來和大家共分享。

我們知道,雜湊表是一個固定大小的數組,數組的每個元素是一個鏈表(單向或雙向)的頭指標。如果Key一樣,則在一起,如果Key不一樣,則不在一
起。雜湊表的查詢是飛快的。因為它不需要從頭搜尋,它利用Key的“雜湊演算法”直接定位,尋找非常快,各種資料庫中的資料結構基本都是它。但帶來的問題
是,雜湊表的尺寸、雜湊演算法。

雜湊表的數組是定長的,如果太大,則浪費,如果太小,體現不出效率。合適的數組大小是雜湊表的效能的關鍵。雜湊表的尺寸最好是一個質數,最小的質數
尺寸是17。

當然,根據不同的資料量,會有不同的雜湊表的大小。對於資料量很時多時少的應用,最好的設計是使用動態可變尺寸的雜湊表,那麼如果你發現雜湊表尺寸
太小了,比如其中的元素是雜湊表尺寸的2倍時,我們就需要擴大雜湊表尺寸,一般是擴大一倍。下面的數庫是雜湊表變化尺寸時尺寸大小的一個列表。

static int prime_array[] = {
    17,             /* 0 */
   
37,             /* 1 */
    79,             /* 2 */
   
163,            /* 3 */
    331,            /* 4 */
   
673,            /* 5 */
    1361,           /* 6 */
   
2729,           /* 7 */
    5471,           /* 8 */
   
10949,          /* 9 */
    21911,          /* 10 */
   
43853,          /* 11 */
    87719,          /* 12 */
   
175447,         /* 13 */
    350899,         /* 14 */
   
701819,         /* 15 */
    1403641,        /* 16 */
   
2807303,        /* 17 */
    5614657,        /* 18 */
   
11229331,       /* 19 */
    22458671,       /* 20 */
   
44917381,       /* 21 */
    89834777,       /* 22 */
   
179669557,      /* 23 */
    359339171,      /* 24 */
   
718678369,      /* 25 */
    1437356741,     /* 26 */
   
2147483647      /* 27 (largest signed int prime) */
};               

#define PRIME_ARRAY_SIZE  (28)

要使用雜湊表,就一定要用一個雜湊演算法,來確定KEY值,這似乎是個很難的事,下面是一個雜湊演算法:

typedef struct _hTab{
    hLinks* link;    /* 一個鏈表 */
   
int  num;     /* 成員個數 */
    int  size;    /* 表的尺寸 */
} 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是雜湊表數組的大小)

這個演算法被實施證明是比較不錯的,能夠達到分散資料的效果,如果你有更好的演算法,歡迎和我交流。(litmouse@km169.net


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.