一. 本章学习小结
1.顺序查找:平均查找长度:成功情况下:ASL=(n+1)/2
失败情况下:比较次数=n
数据元素类型定义:
typedef struct{ Keytype key; InfoType otherinfo; }ElemType;
设置监视哨的顺序查找:
int Search_Seq(SSTable ST,KeyType key) {//在顺序表ST中顺序查找其关键字等于key的数据元素。若找到,则函数值为该元素在表中的位置,否则为0 ST.R[0].key=key; for(i=ST.length;ST.R[i]key!=key;--i); return i; }
时间复杂度为O(n),算法简单,但当n很大时,不宜采用顺序查找
2.折半查找:要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列
算法描述:
int search(int a[],int n,int x) {//在a[i]中查找值为x的元素,返回下标或0 int l=1,r=n; while(l<=r){ mid=(l+r)/2; if(x==a[mid]) return mid; else if(x<a[mid]) r=mid-1; else l=mid+1; } return 0;}
对有序表:T(n)=O(log2(n)) S(n)=O(1)
对无序表:T(n)=O(nlg(n))
当n较大时,ASL=log2(n+1)-1
折半查找不适用于数据元素经常变动的线性表,数据量太大也不行(超出内存可用连续空间)
3.树表查找: 二叉排序树:性质:(1)若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值
(2)若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值
(3)它的左、右子树也分别为二叉排序树
查找:
BSTNode* search(BSTree t,KeyType x) { if(t==NULL) return NULL; if(x==t->data.key) return t; if(x<t->data.key) return search(t->lchild,key) else return search(t->rchild,key); }
最差情况下ASL=(n+1)/2,此时时间复杂度为O(n);最好情况下ASL与log2n成正比,此时时间复杂度为O(log2n)
4.散列表:查找时间复杂度为O(1)
构造方法:数字分析法:从关键字中提取数字分布比较均匀的若干位作为散列地址
适用于事先必须明确知道所有的关键字每一位上各种数字的分布情况
平方取中法:取关键字平方后的中间几位或其组合作为散列地址
适用于不能事先了解关键字的所有情况,或难于直接从关键字中找到取值较分散的几位
折叠法:将关键字分割成位数相同的几部分,然后取这几部分的叠加和(舍去进位)作为散列地址
适用于散列地址的位数较少,而关键字的位数较多,且难于直接从关键字中找到取值较分散的几位
二.目标
上次的目标达成的还行吧
下周目标:临近期末好好复习