(一)查找的基本概念:查找表,关键字,动态查找表(能对表做修改操作),静态查找表,ASL--平均查找长度ASL=Σpc(从i到n)
(二)查找 : 首先是要注意设置哨兵:例 ST.R[0].key=key; 将第一个元素的值赋值为key; 可以防止确保访问不会越界。
然后是二分查找:(需要注意的是,二分查找要求的是采用顺序存储结构,元素按关键字有序排列)
int Search_Bin(SSTable ST,int x,int length) { int mid; int low=1; int high = length;//设置初值 while(low<=high) { mid=(low+high)/2; if(x==ST.R[mid]) { return mid;}//找待查元素 else if(x
注意:顺序查找的时间复杂度为O(n),而二分查找的时间复杂度为O(log2n)
(三)二叉排序树
二叉排序树或者是一棵空树,或者是具有下列性质的二叉树:
(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;
(2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;
(3)左、右子树也分别为二叉排序树;
对于二叉排序树,其基本过程为查找,所以时间复杂度也为O(log2n)
平衡二叉树:
(1)左子树与右子树的深度差的绝对值不超过1;
(2)左子树与右子树也是平衡二叉树;
平衡因子定义为左右子树的深度之差平衡因子只为0,-1,1;这部分内容还有具体看书,,(还有后面的B树和B+树的内容)
(四)散列表
不需要元素有序排列 还引入了冲突和同义词的概念(这里比较熟,就不罗列了)
散列函数的构造方法:数字分析法,平方取中法,折叠法,除留取余法(这种方法用得较多)
下面就是处理冲突的方法:
开放地址法和链地址法;
1.开放地址主要有线性探测和二次探测,即在发生冲突时,从发生冲突地址的下一单元出发寻找空单元,这两种方法只是间隔不同。
2.链地址法:即把具有相同散列地址的记录放在同一个单链表中