北航软件工程专业考研991数据结构总结:
七、文件及查找
1.顺序查找法以及平均查找长度(ASL)的计算;
2.折半查找法以及平均查找长度(ASL)的计算,包括查找过程对应的“判定树”的构造;
3.散列(Hash)表的构造、散列函数的构造,散列冲突的基本概念、处理散列冲突的基本方法以及散列表的查找和平均查找长度的计算。
1、顺序查找法以及平均查找长度ASL
挨个比较查询
for(int i = 0; i < n; i++)
{
if(K[i] == data)
return i;
}
return -1;
平均查找长度为 1/n * n(n+1) / 2 = (n+1)/2
算法时间复杂度 O(n)
2、折半查找法以及平均查找长度ASL
排序顺序存储文件
平均查找长度:log2 (n+1) -1
算法时间复杂度:O(log2n)
将要查找的关键字值与序列的居中位置的元素值进行比较,若相等,则查找成功;
若小于居中元素,则从前半部分继续查找
若大于居中元素,则从后半部分继续查找
若查找失败,返回-1 失败的条件是 low > heigh
n 元素个数
low 初始1
heigh 初始n
mid = (low + heigh)/2 取整
int BinSearch(int A[], int n, int data)
{
int low = 1, heigh = n;
int mid;
while(low <= heigh)
{
mid = (low + heigh) / 2;
if(A[mid] == data)
return mid;
else if(data < A[mid])
heigh = mid - 1;
else
low = mid + 1;
}
return -1;
}
3、哈希,散列,杂凑文件
A = H(k)
k为关键字,A为存储地址,H为哈希(散列)函数
对关键字通过构造散列函数映射到地址中
会造成冲突,但是不会随着问题的规模n呈现复杂度的上升,难点在于哈希函数的确定和冲突解决的方案
散列函数构造的原则
1)、散列函数的定义域需要包含全部的关键字k 值域为关键字的个数
2)、利用散列函数计算出来的地址应该尽可能均匀地分布在地址空间
3)、散列函数应该尽可能简单,能够尽快得出结果
值域,均匀,简单
散列函数的构造步骤
1)、确定关键字
2)、构造散列函数
3)、确定冲突处理方法
空间,函数,冲突
常见的散列函数
1)、直接地址
2)、除留余数
3)、
常见的冲突处理方法:
为冲突的元素再找一个地址,如果又冲突,继续找,直到不冲突位置
1)、开放地址法(闭散列)
Di = (H(K) + d)mod m
1)、线性 d = 1,2,3,4,...,m-1 (m就是地址总数)
2)、二次
3)、伪
2)、再散列
3)、链地址