考研复习之数据结构笔记(十三)查找(上)(概念与静态查找,顺序查找、折半查找、分块查找)

目录

一、基本概念

1.1 相关概念

1.2 分类与算法评价

二、顺序查找

三、折半查找

3.1 经典折半查找

3.2 静态数表查找

四、分块查找


一、基本概念

1.1 相关概念

查找表:由同一类型的数据元素(或记录)构成的集合
查找:也叫检索,是根据给定的某个值,在表中确定一个关键字等于给定值的记录或数据元素
关键字:是数据元素中某个数据项的值,它可以标识一个数据元素

对查找表经常进行的操作:

  •  查询某个“特定的”数据元素是否在查找表中;
  •  检索某个“特定的”数据元素的各种属性;
  • 在查找表中插入一个数据元素;
  • 从查找表中删去某个数据元素

1.2 分类与算法评价

查找表可分为两类:

静态查找表——仅作查询和检索操作的查找表;
动态查找表——在查找过程中同时插入不在查找表中的数据元素,或者删除在查找表中存在的数据元素。

查找方法评价:

  •  查找速度
  •  占用存储空间多少
  •  算法本身复杂程度
  •  平均查找长度ASL(Average Search Length):为确定记录在表中的位置,需要与给定值进行比较的次数的期望值叫查找算法的~

考研复习之数据结构笔记(十三)查找(上)(概念与静态查找,顺序查找、折半查找、分块查找)_第1张图片

 图1.2-1 平均查找长度ASL

静态查找表的查找方法有顺序查找、折半查找、散列查找等;适合动态查找表的查找方法有二叉排序树的查找、散列查找(哈希表)等。二叉平衡树和B树都是二叉排序树的改进。

二、顺序查找

 查找过程:从表的一端开始逐个进行记录的关键字和给定值的比较
 适用条件:以顺序表或线性链表表示的静态查找表

考研复习之数据结构笔记(十三)查找(上)(概念与静态查找,顺序查找、折半查找、分块查找)_第2张图片

 图2.1-1 查找过程

代码实现如下:

int Search_Seq( SSTable ST, KeyType key)
{  
   int i;
   ST.elem[0].key=key;//设置”监视哨”
   for(i=ST.length;ST.elem[i].key!=key;i--)
        ;
   return(i);
}
//查找成功——返回元素下标查找失败——返回0

考研复习之数据结构笔记(十三)查找(上)(概念与静态查找,顺序查找、折半查找、分块查找)_第3张图片

  图2.1-2 平均查找长度

 优点:算法简单,对表的逻辑次序和存储结构无要求
 缺点:平均查找长度较大

考研复习之数据结构笔记(十三)查找(上)(概念与静态查找,顺序查找、折半查找、分块查找)_第4张图片

  图2.1-3 减少平均查找长度的方式

三、折半查找

3.1 经典折半查找

 查找过程:每次将待查记录所在区间缩小一半
 适用条件:采用顺序存储结构的有序静态查找表
 算法实现:

  1. 设表长为n,low、high和mid分别指向待查元素所在区间的下界、上界和中点,k为给定值
  2. 初始时,令low=1,high=n,mid=(low+high)/2向下取整。
  3. 将mid指向的记录与k比较(假设有序表升序)
    若k==r[mid].key,查找成功
    若k 若k>r[mid].key,则low=mid+1
  4. 重复上述操作,直至找到记录,查找成功;或low>high,查找失败

考研复习之数据结构笔记(十三)查找(上)(概念与静态查找,顺序查找、折半查找、分块查找)_第5张图片

 图3-1 折半查找演示

int  Search_Bin( SSTable ST, KeyType k)
{  int low,high,mid;
   low=1;  high=ST.length;
   while(low<=high)
   {  mid=(low+high)/2;
      if(k>ST.elem[mid].key)  low=mid+1;
      else if(k==ST.elem[mid].key)  return mid;
      else   high=mid-1;
   }
      return(0);
}

 

考研复习之数据结构笔记(十三)查找(上)(概念与静态查找,顺序查找、折半查找、分块查找)_第6张图片

考研复习之数据结构笔记(十三)查找(上)(概念与静态查找,顺序查找、折半查找、分块查找)_第7张图片

考研复习之数据结构笔记(十三)查找(上)(概念与静态查找,顺序查找、折半查找、分块查找)_第8张图片

  图3-2 折半查找算法分析

优点:平均查找长度较小,查找效率高于顺序查找
缺点:只适用于顺序存储的有序表,不适用于一般顺序表和链式存储结构

3.2 静态数表查找

在不等概率查找的情况下,折半查找不是有序表查找的最好方法。

考研复习之数据结构笔记(十三)查找(上)(概念与静态查找,顺序查找、折半查找、分块查找)_第9张图片

 图3.2-1 折半查找存在部分问题

静态最优查找树:查找性能达最佳的判定树,即PH值为最小的二叉树

PH:带权内路径长度之和

考研复习之数据结构笔记(十三)查找(上)(概念与静态查找,顺序查找、折半查找、分块查找)_第10张图片

其中:
n: 二叉树结点个数,即有序表长度;
hi :第i个结点在二叉树上层次数;
wi :结点的权值, wi =cpi ,c为常量,pi为结点查找概率

构建过程如下:

考研复习之数据结构笔记(十三)查找(上)(概念与静态查找,顺序查找、折半查找、分块查找)_第11张图片

考研复习之数据结构笔记(十三)查找(上)(概念与静态查找,顺序查找、折半查找、分块查找)_第12张图片

图3.1-2 静态最优查找树构造方法

考研复习之数据结构笔记(十三)查找(上)(概念与静态查找,顺序查找、折半查找、分块查找)_第13张图片

 

考研复习之数据结构笔记(十三)查找(上)(概念与静态查找,顺序查找、折半查找、分块查找)_第14张图片

 图3.1-3 静态最优查找树构造演示

四、分块查找

 查找过程:将线性表分成几块,块内无序,块间有序;先确定待查记录所在块,再在块内查找
 适用条件:分块有序表

索引顺序查找(分块查找)的过程也是一个“缩小区间”的查找过程。

考研复习之数据结构笔记(十三)查找(上)(概念与静态查找,顺序查找、折半查找、分块查找)_第15张图片

 图4-1 分块查找算法实现

int Seach_Index(SSTable ST,IndexTable IT[ ],int b,int n,   
                             KeyType k)
{  int i=1,j;
   while((k>IT[i].MaxKey)&&(i<=b))  
          i++;
   if(i>b)
         {  printf("\nNot found");  return(0); }
   j=IT[i].FirstLink;      while((k!=ST.elem[j].key)&&(ST.elem[j].key<=IT[i].MaxKey)  
             &&(j

考研复习之数据结构笔记(十三)查找(上)(概念与静态查找,顺序查找、折半查找、分块查找)_第16张图片

 图4-2 分块查找的ASL

考研复习之数据结构笔记(十三)查找(上)(概念与静态查找,顺序查找、折半查找、分块查找)_第17张图片

  图4-3 查找方法比较

 

你可能感兴趣的:(数据结构,c语言,数据结构,算法)