查找的本质: 已知对象求位置
K1: 有序安排对象:全序,半序
K2: 直接算出对象位置:散列
散列查找法的两项基本工作
计算位置:构造散列函数确定关键词存储位置
解决冲突:应用某种策略解决多个关键词位置问题
时间复杂度几乎是常量;O(1) ,即查找时间与问题规模无关。
散列表(哈希表):
**类型名称:**符号表(Symbol Table)
数据对象集:符号表是“名字(Name)----属性(Attribute)"对的集合。
操作集:
1.创建一个长度为TableSize的符号表
2.查找特定的名字Name是否符号Table中;
3.获取table中的指定名字Name对应的属性
4.将table中指定名字Name的属性修改为Attr
5.向Table中插入一个新名字Name及其属性attr
6.从Table中删除一个名字Name及其属性
装填因子(lpading Factor):设置散列表的空间大小为m,则称α=n/m为散列表的装填因子;
好的散列函数:
1.计算简单,以便提高转换速度;
2.关键词对应的地址空间分布均匀,以尽量减少冲突。
常见的函数构建方法:
数字关键词
1.直接定址法:取关键词的某个线性函数值为散列地址
2.除留余数法:h(key)=key mod p
3.数字分析法:分析数字关键字在各位上的变化情况,取比较随机的位作为散列地址。
4.折叠法:将关键词分割成位数相同的几个部分,然后叠加。
5.平方取中法:将数字关键词进行平方,然后取中间数。
字符关键词:
1.ASCll码加和法:
2.对1的改进,前三个字符移位法
3.移位法:
Index Hash(const char *Key,int TableSize)
{
unsigned int h = 0;
while(*Key!='\0')
h = (h << 5) + *Key++;
return h % TableSize;
}