数据结构——查找

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


前言

查找的基本概念

顺序查找

折半查找


一、查找的基本概念

1.基本概念

查找:指定某个值,在查找表中确定是否存在一个记录,该记录的关键字等于给定值。

(1) 关键字:记录(数据元素)中的某个数据项的值。

(2) 主关键字:该关键字可以唯一地标识一个记录。

(3) 次关键字:该关键字不能唯一标识一个记录。

(4) 静态查找表:对查找表的查找仅是以查询为目的,不改动查找表中的数据。【无需动态修改查找表(顺序查找、折半查找、散列查找);】

(5) 动态查找表:在查找的过程中同时插入不存在的记录,或删除某个已存在的记录。【需要动态修改和删除的查找表(二叉排序树查找、散列查找)】

(6) 分为查找成功和查找失败

(7) 查找成功:查找表中存在满足查找条件的记录。

(8) 查找不成功:查找表中不存在满足查找条件的记录

(9) 内查找:整个查找过程都在内存中进行。

(10) 外查找:在查找过程中需要访问外存

(11) 平均查找长度ASL------查找方法时效的度量:为确定记录在查找表中的位置,需和给定值进行比较的关键字个数的期望值。

查找成功时的ASL计算方法:

n:记录的个数

pi:查找第i个记录的概率,且 ( 不特别声明时认为等概率 pi =1/n )

ci:找到第i个记录所需的比较次数

(12) 为确定记录在查找表中的位置,需和给定值进行比较的关键字个数的期望值

(13) 平均查找长度:一次查找长度是需要比较的关键字的次数

二、顺序查找&&折半查找

顺序查找

概念:主要用于线性表中查找,分为无序线性表和有序线性表查找

1.一般线性表顺序查找

(1)从线性表一端开始逐个关键字是否满足要求,若满足则查找成功,若查找到末尾还未查找到则失败,其中引入哨兵作用是不必判断数组是否越界,因为当i==0时,循环一定会跳出

(2) ASL成功 =(n+1)/2, ASL不成功=n+1;当n较大时,平均查找长度较大,效率低;优点是对元素存储无要求;对线性的链表只能顺序查找

3.有序表的顺序查找

(1)概念:查找失败时可以不用再比较到表的另一端就能返回查找失败的信息,可以用如下判定树表示

(2) ASL成功=(n+1)/2, ASL不成功=n/2+n/(n+1)

顺序表的查找

c 复制代码
int Search(Elemtype a[], int n,KeyType x)
{ //在顺序表a中顺序查找其关键字等于x的元素.若找到,函数值为该元素
   // 在表中的位置否则为0 
  i=n;flag=0;
  while(i>0) if(a[i].key==x)
                {return i;
                 flag=1;
                 break;}
              else i--;          
  if(flag==0) return 0;
   }

折半查找

1.概念:又叫二分查找,仅适用于按关键字排列有序的顺序表
其基本过程是:

将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。

其中mid=(low+high)/2,当high<low时,表示不存在这样的子表空间,查找失败。

折半查找算法

c 复制代码
int Search_Bin(elemType a[],int n,  elemType x)
   /*在有序表ST中折半查找其关键字等于key的元素,若找到,则函数值为该元素在表中的位置,否则为0*/
{   low=0 ;
    high=n-1; 
    while (low<=high)
       { mid=(low+high) / 2;
         if (x= =a[mid])  
         return  mid ;/*找到待查元素*/
        else  if (key<a[mid])  high=mid-1;
                         /*未找到,则继续在前半区间进行查找*/
              else  low=mid+1; /*继续在后半区间进行查找*/
          }
      }

例题

例题:已知11个元素有序表{7,10,13,16,19,29,32,33,37,41,43},查找11和32,可以用如下二叉树表示查找过程;树最下面都是方形,表示查找不成功的情况;查找成功的查找长度为从根结点到目的结点的路径上的结点数,而不成功的情况为从根结点到对应失败结点的父结点路径上结点数;若有序序列有n个结点,判定树有n个圆形非叶子结点和n+1个方形叶结点,是为二叉排序树

查找成功:ASL=(1x1+2x2+3x4+4x4)/11=3

查找不成功:ASL=(3x4+4x8)/12=11/3

  1. 折半查找方法的优点 是比较次数少,查找速度快,平均性能好;

  2. 其缺点是要求待查表为顺序存储的有序表,插入删除困难。

  3. 因此,折半查找方法适用于不经常变动而查找频繁的有序列表


总结

查找的基本概念

顺序查找

折半查找

相关推荐
Hera_Yc.H1 分钟前
数据结构之一:复杂度
数据结构
肥猪猪爸1 小时前
使用卡尔曼滤波器估计pybullet中的机器人位置
数据结构·人工智能·python·算法·机器人·卡尔曼滤波·pybullet
linux_carlos1 小时前
环形缓冲区
数据结构
readmancynn1 小时前
二分基本实现
数据结构·算法
Bucai_不才1 小时前
【数据结构】树——链式存储二叉树的基础
数据结构·二叉树
盼海2 小时前
排序算法(四)--快速排序
数据结构·算法·排序算法
一直学习永不止步2 小时前
LeetCode题练习与总结:最长回文串--409
java·数据结构·算法·leetcode·字符串·贪心·哈希表
珹洺3 小时前
C语言数据结构——详细讲解 双链表
c语言·开发语言·网络·数据结构·c++·算法·leetcode
几窗花鸢3 小时前
力扣面试经典 150(下)
数据结构·c++·算法·leetcode
.Cnn3 小时前
用邻接矩阵实现图的深度优先遍历
c语言·数据结构·算法·深度优先·图论