1.散列
以执行插入,删除和查找的数据结构,但是不能求最值,也不能排序。
键:查找的标准。
设表的大小为size(),则索引从0变化到size()-1。
散列函数:将每个键映射到唯一一个0-size()-1中的数的函数。
冲突:两个键散列到同一个值。
好的散列:保证表的大小为素数,,这样键的分布比较均匀。
对于键是字符串的散列:
将字符串的ASCII码求和,再对size()取模。当表很大而键的字符数很小时,键主要集中于散列表的前半部分。
散列不一定把key全用上,假设键至少有3个字符, ,这种方法叫进制哈希。
,将key映射成一个多项式。
int hash(const string & key, int tablesize) {
int hashval = 0;
for (int i = 0; i < key.size(); i++)
hashval = 37 * hashval + key[i];
hashval %= tablesize;
if (hashval < 0)hashval += tablesize;//溢出
return hashval;
}
2.解决冲突的方法
先欠着,详见洛谷例题。