雜湊表: 本章介紹了雜湊表的各種問題。
雜湊函式:除法雜湊,乘法雜湊,全域雜湊。 其中除法雜湊是簡單的mod. 乘法雜湊為h(k) = m(ka mod 1). 即關鍵字k乘常數a, 然後取小數部分, 乘以m.
全域雜湊是一組雜湊函式,這些函式都可以將關鍵字域u對映到相同的集合中, 同時對k, l 屬於u. 滿足h(k) = h(l)的雜湊函式的個數最多是: 雜湊函式的數目/集合的大小.
雜湊表的2種解決衝突的辦法: 鏈結法和開放定址法。
鏈結法比較簡單, 開發定址法解決衝突的探查函式有幾種: 線形探察, 二次探察, 雙重雜湊。 其中雙重探察的探察序列最多,所以相應雜湊效果更好。
最後介紹了完全雜湊, 這節難度較大, 沒有看太明白, 主要是對於全域雜湊的證明很頭疼阿。
我自己的鏈結法的實現: 因為很少用到雜湊, 所以只是做了少量的測試。 而且雜湊函式的返回值一定是int_type. 對於雜湊的應用了解少了點,所以模板引數的定義可能不是很合理。
template >
class linkhash
~linkhash()}}
size_t size() const
data_type get(const key_type& key)
else
}bool insert(const key_type& key, const data_type& value)
bool insert(value_const_reference data)
else
}bool has_key(const key_type& key)
bool erase(const key_type& key)
linknodenodeimp;
node_type node = &nodeimp;
node->m_next = m_container[index];
while(node->next())
node = node->next();
}return false;
}private:
node_type find(const key_type& key)
node_type node = m_container[index];
while(node)
node = node->next();
}return 0;
}int hash(const key_type& key)
private:
linkhash(const linkhash&);
linkhash& operator=(const linkhash&);
std::vector< node_type > m_container;
hash m_function;
size_t m_size;
};
演算法導論第十一章習題11 2 4
linknode.h includeusing namespace std class link class linknode linknode int num key num next null int getkey link.h include linknode.h class head cla...
演算法導論 第十一章 雜湊表
當將乙個域u中的元素對映到乙個雜湊表t中時,我們如何對映?若對映到同一位置怎麼辦?前乙個問題我們通過hash函式來解決,後乙個問題我們通過 衝突處理 解決。1 除法 h k k mod m m的選取 素數,且不要太靠近 2的冪次方 2 乘法 其中,0 eg 當m 8 2 3,w 7時 3 全域雜湊 ...
演算法導論 第十一章 雜湊表
演算法導論 第十章 雜湊表 雜湊表大概就是把給每個要儲存的資料都用雜湊函式給定乙個關鍵字,對應到乙個槽。由於不同的資訊可能對應同樣的關鍵字,也就是說對應同乙個槽,這時要解決其衝突,解決衝突可以用鏈結法,和開放定址法。對於鏈結法,其對於衝突採取鍊錶進行解決,這樣就保證了資料不會發生衝突。其查詢的平均時...