1. 程式人生 > >散列表(hash表)

散列表(hash表)

關系 技術 優點 圖片 數據 span height 中間 表頭

1. hash表: 又稱散列表,以key-value的形式存儲數據,能夠由key快速定位到其指定的value,而不經過查找。它采用了函數式的映射思想,將記錄的存儲位置與關鍵詞相關聯,從而快速定位進行查找,復雜度為O(1)。 2. hash函數:
  • key和value的映射關系稱為HASH函數,通過該函數可以計算key所對應的存儲位置(表中存儲位置,不是實際物理地址),即HASH地址。
  • 構造HASH地址的方法有:
(1)直接定址法:取關鍵詞或關鍵詞的某個線性函數為hash地址。 (2)平方取中法:關鍵詞的平方取中間某幾個數構成hash地址。
(3)折疊法:將關鍵詞拆分成幾部分,然後以特定方式組合構成hash地址。
  • 避免hash地址發生沖突的解決辦法:
(1)開放定址法:當一個關鍵字和另一個關鍵字發生沖突時,使用某種探測技術在Hash表中形成一個探測序列,然後沿著這個探測序列依次查找下去,當碰到一個空的單元時,則插入其中。 (2)鏈地址法:采用數組和鏈表相結合的辦法,將Hash地址相同的記錄存儲在一張線性表中,而每張表的表頭的序號即為計算得到的Hash地址。                           技術分享圖片 3. HASH表的優缺點: 優點:O(1)時間復雜度進行查找,刪除和插入操作容易。
缺點:不能排序,占用空間大,記錄的關鍵詞不能重復。 4.常用hash函數:
/*    除余法哈希函數( 不適用於表很大的情況 )  */
int hash(const std::string & key,int tablesize)
{
    int hashvalue = 0;
    for(unsigned int i=0;i<key.length();++i)
        hashvalue += key[i];
    return hashvalue % tablesize;
}

/*   RS哈希函數  */
int RSHash(const
std::string & str) { int b = 378551; int a = 63689; int hash = 0; for(unsigned int i = 0; i < str.length(); i++) { hash = hash * a + str[i]; a = a * b; } return hash; }

散列表(hash表)