本章里我们学习了查找

基本概念:

  查找表:由同一类型的数据元素(或记录)构成的集合(在查找时对表做修改操作,如插入和删除,则称为动态查找表;否则称为静态查找表)

  关键字:数据元素(或记录)中某个数据项的值(如果一个查找表里只存储了关键字,意义不是很大

  平均查找长度ASL:从1到第n个数据元素  查找第 i 个记录的概率 * 找到第 i 个记录所需的比较次数  之和

查找主要分为线性表的查找、树表的查找、散列表的查找。

线性表的查找:顺序查找、折半查找、分块查找(更适用于静态查找表)

顺序查找:适用于线性表的顺序存储结构、链式存储结构

1 int Search_Seq(SSTable ST, KeyType key)
2 {//在顺序表ST中顺序查找其关键字等于key的数据元素。
3  //若找到,则函数值为该元素在表中的位置;否则为0。
4     ST.R[0].key = key ; //哨兵
5     for(int i = ST.length ; ST.R[i].key != key ; --i) ; //从后往前找
6     return i ;
7 }
顺序查找

时间复杂度:O(n);

ASL = (1+2+...+n)/ n = (n+1)/ 2

折半查找:要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列

 1 int Search_Bin(SSTable ST, KetType key)
 2 {
 3     int low = 0 ;
 4     int high = ST.length - 1 ;
 5     
 6     while(low <= high)
 7     {
 8         int mid = (low + high) / 2 ;
 9         if(key == ST.R[mid].key)    return mid ; //找到待查元素
10         else if(key < ST.R[mid].key)    high = mid - 1 ; //继续在前一子表进行查找
11         else low = mid + 1 ; //继续在后一子表进行查找
12     }
13     return 0 ; //表中不存在待查元素
14 }
折半查找

时间复杂度:O(log2n);

ASL=log2(n + 1)-1

分块查找:块内无序,块间有序

树表的查找:二叉排序树、平衡二叉树、B+、B-树

二叉排序树:(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值; (2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值; (3)左、右子树也分别为二叉排序树;

1 BSTree SearchBST(BSTree T, KeyType key)
2 {
3     if( (!T ) || key == T->data.key)    return T ;
4     else if (key < T->data.key)    return SearchBST(T->lchild, key) ;
5     else return SearchBST(T->rchild, key) ;
6 }
二叉排序树的递归查找

时间复杂度:如果数据呈有序排列,则二叉排序树是线性的,查找的时间复杂度为O(n); 反之,如果二叉排序树的结构合理,则查找速度较快,查找的时间复杂度为 O(log2 n)。

平衡二叉树:左子树和右子树的深度之差的绝对值不超过1,左子树和右子树也是平衡二叉树,或者是空树。

时间复杂度:O(log2 n)

B+、B-树:多叉树

散列表的查找

构造方法:数字分析法、平方取中法、折叠法、除留余数法

处理冲突的方法:开放地址法(线性探测法、二次探测法、伪随机探测法);链地址法(把具有相同散列地址的记录放在同一个单链表中,称为同义词链表)

装填因子:表中填入的记录数 / 散列表的长度