已知的几种查找方法:
- 顺序查找 O(N)
- 二分查找(静态查找) O(log2N)
- 二叉搜索树、平衡二叉树 O(h) h为二叉查找树的高度 O(log2N)
查找的本质:一直对象找位置。
- 有序安排对象:全序、半序
- 直接“算出”对象位置:散列
散列查找法的两项基本工作:
- 计算位置:构造散列函数确定关键词存储位置;
- 解决冲突:应用某种策略解决多个关键词位置相同的问题。
时间复杂度几乎是常量:O(1),即查找时间与问题规模无关!
类型名称:符号表(SymbolTable)
数据对象集:符号表是“名字(Name)-属性(Attribute)”对的集合。
操作集:Table∈SymbolTable,Name∈NameType,Attr∈AttributeType
1、SymbolTable InitializeTable(int TableSize):
创建一个长度为TableSize的符号表;
2、Boolean Isln(SymbolTable Table,NameType Name):
查找特定的名字Name是否在符号表Table中
3、AttributeType Find(SymbolTable Table,NameType Name):
获取Table中指定名字Name对应的属性;
4、SymbolTable Modefy(SymbolTable Table,NameType Name,AttributeType Attr):
将Table中指定名字Name的属性修改为Attr;
5、SymbolTable Insert(SymbolTable Table, NameType Name, AttributeType Attr):
向Table中插入一个新名字Name及其属性Attr;
6、SymbolTable Delete(SymbolTable Table,NameType Name):
从table中删除要给名字Name及其属性。
“散列”的基本思想是:
(1)以关键字key为自变量,通过一个确定的函数h(散列函数),计算出对应的函数值h(key),作为数据对象的存储地址。
(2)可能不同的关键字会映射到同一个散列地址上,即h(keyi) = h(keyj) (当keyi≠keyj),称为“冲突(Collision)”。
------需要某种冲突解决策略
一个“好”的散列函数一般应该考虑下列两个因素:
1.计算简单,以便提高转换速度;
2.关键词对应的地址空间分布均匀,以尽量减少冲突。
数字关键词的散列函数构造
1.直接定址法
2.除留余数法
3.数字分析法
4.折叠法
5.平方取中法