第七章学习小结

查找

查找表: 由同一类型的数据元素(或记录)构成的集合,可以用线性表、树表、散列表来实现

动态查找表: 在查找的同时对表做修改操作(插入、删除)

静态查找表: 仅查找

平均查找长度(ASL)----> 衡量查找算法的性能:ASL = P1C1+P2C2 +....+PiCi

一、线性表的查找

(1)顺序查找

设置监视哨的顺序查找:

int Search_Seq(SSTable ST,KeyType key)
{
    ST.R[0].key=key;    //哨兵
    for(i=ST.length;ST.R[i].key!=key;--i)   //从后往前找
    return i;
}

优点:算法简单,对表结构无任何要求,既适用于顺序结构,也适用于链式结构; 无论记录是否按关键字有序均可应用

缺点:平均查找长度较大,查找效率较低,所以当n很大时,不宜采用顺序查找

(2)析半查找(二分查找):不适用于数据元素经常变动的线性表

特点:必须采用顺序存储结构,而且表中元素按关键字有序排列

int Search(SSTable ST ,KeyType key)
{
      low=1;high=ST.length;
      while(low<=high)
    {
          mid=(low+high)/2;
          if(key==ST.R[mid].key)  return mid;
          else if(key<ST.R[mid].key)  high=mid-1;
          else  low=mid+1;
      }
      return 0;   // 表中不存在待查找元素
}

优点: 比较次数少,查找效率高

缺点: (1)对表结构要求高,只能用顺序存储的有序表

            (2)查找前排序,排序很费时; 为了保持有序性,对表进行插入和删除时,平均比较和移动表中一半元素,费时

 

(3)分块查找(索引顺序查找)

除表本身外,还需建立一个索引表:

     
     

     最大关键字

     起始地址

 

如果线性表既要快速查找有经常动态变化,可采用分块查找

缺点: 增加一个索引表的存储空间并对初始索引表进行排序运算

二、树表的查找

二叉排序树(二叉查找树)

特点: (1)中序遍历一颗二叉树时可以得到一个结点值递增的有序序列

          (2)含有n个结点的二叉排序树的平均查找长度和树的形态有关。最差:单支树((1+n)/2);

平衡二叉树(AVL树)

平衡因子: 该结点左子树和右子树的深度之差

平衡调整规律:LL,RR,LR,RL

三、散列表的查找

1, 直接算出位置,与数据量无关
    记录在数组中的存储位置P与其关键字key之间存在对应关系:H(key) = P
2,H函数称为哈希函数
   优点:查找速度极快O(1),与元素个数无关
相关术语
(1)散列函数:转换函数,将关键字转换为位置(下标) (2)散列表 冲突:不同的关键字映射到同一个散列地址 冲突解决:开放地址法 线性探测再散列 二次(平方)探测再散列 随机探测再散列 链地址法:将相同散列地址的链成一个单链表,适合表长不定
(3)同义词:H函数相等的关键字
除留余数法:所选P要小于表长的最大质数
posted @ 2020-06-28 10:08  田晓涵  阅读(133)  评论(0编辑  收藏  举报