查找

  • 查找的概念
  • 线性表的查找
    • 顺序查找(线性查找)
    • 折半查找(二分或对分查找)
    • 分块查找

查找的概念

主关键字:可唯一地标识一个记录的关键字就是主关键字
次关键字:用以识别若干记录的关键字就是次关键字

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

  1. 查询某个“特定的”数据元素是否在查找表中;
  2. 检索某个“特定的”数据元素的各种属性;
  3. 在查找表中插入一个数据元素;
  4. 删除查找表中的某个数据元素;

查找表可以分为两类:

  • 静态查找表:
      仅作“查询”(检索)操作的查找表;
  • 动态查找表:
      作“插入”和“删除”操作的查找表;
      有时在查询之后,还需要将“查询”结果为“不在查找表中”的数据元素插入到查找表中;或者,从查找表中删除其“查询”结果为“在查找表中”的数据元素,此类为动态查找表;

查找算法的评价指标:
关键字的平均比较次数,也称平均查找长度ASL(Average Search Length)

A S L = ∑ i = 1 n p i c i ( 关 键 字 比 较 次 数 的 期 望 值 ) ASL= \sum_{i=1}^n {p_i}{c_i}\,(关键字比较次数的期望值) ASL=i=1∑n​pi​ci​(关键字比较次数的期望值)
n n n:记录的个数;
p i p_i pi​:查找第i个记录的概率(通常认为 p i p_i pi​ = 1 / n 1/n 1/n);
c i c_i ci​:找到第i个记录所需的比较次数;

  查找的方法取决于查找表的结构,即表中数据元素是依何种关系组织在一起的;
  因为“查询”或“检索”在计算机应用系统中使用频度都很高,因此需要设法提高查找表的查找效率;
  为提高查找效率,一个办法就是在构造查找表时,在集合中的数据元素之间认为地加上某种确定的约束关系;

线性表的查找

顺序查找(线性查找)

顺序查找的特点:
优点:算法简单,逻辑次序无要求,且不同存储结构均适用;
缺点:ASL太长,时间效率低;

应用范围:

  • 顺序或线性链表表示的静态查找表
  • 表内元素之间无序

顺序表的表示:

//数据元素类型定义
typedef struct{KeyType key; //关键字域......            //其他域
}ElemType;
//顺序表结构定义类型
typedef struct{ElemType *R; //表基址int length;        //表长
}SStable;           //Sequential Search Table
SStable ST;         //定义顺序表ST


算法:

int Search_Seq(SSTable ST, KeyType key){//若成功返回其位置信息,否则返回0for(i = ST.length; i >= 1; --i){if(ST.R[i].key == key)   return i;else return 0;}
}

其他形式:

int Search_Seq(SSTable ST, KeyType key){for(i = ST.length; i >= 1;ST.R[i].key != key; --i)if(i <= 0) break;if(i > 0) return i;else return 0;
}

改进:把待查关键字key存入表头(“哨兵”、“监视哨”),从后往前逐个比较,可免去查找过程中每一个都要检测是否完毕,加快速度

//设置监视哨的顺序查找
int Search_Seq(SSTable ST, KeyType key){ST.R.key = key;for(i = ST.length; ST.R[i].key != key; --i);return i;
}

时间复杂度: O ( n ) O(n) O(n)
A S L s ( n ) = ( 1 + 2 + . . . + n ) / n = ( n + 1 ) / 2 ASL_s(n)=(1+2+...+n) /n= (n+1)/2 ASLs​(n)=(1+2+...+n)/n=(n+1)/2

1、记录的查找概率不相等时如何提高查找效率

查找表存储记录原则——按查找概率高低存储:
1)查找概率越高,比较次数越少;
2)查找概率越低,比较次数越多;


2、记录的查找概率无法测定时如何提高查找效率

方法——按查找概率动态调整记录顺序
1)在每个记录中设一个访问频度域;
2)始终保持记录按非递增有序的次序排列;
3)每次查找后均将刚查到的记录直接移至表头;

折半查找(二分或对分查找)


折半查找:每次将待查记录所在区间缩小一半

折半查找的特点:
优点:效率比顺序查找高;
缺点:只适用于有序表,且限于顺序存储结构(对线性链表无效);




算法:

int Search_Binary(SSTable St, KeyType key){low = 1;high = ST.length;                   //置区间初值while(low <= high){mid = (low + high)/2;if(ST.R[mid].key == key)return mid;                  //找到待查元素else if(key < ST.R[mid].key) //缩小查找区间high = mid - 1;                //继续在前半区间进行查找else low = mid +1;               //继续在后半区间进行查找}return 0;     //顺序表中不存在待查元素
}//Search_Binary

递归算法:

int Search_Binary(SStable ST, keyType key, int low, int high){if(low > high) return 0;            //查找不到时返回0mid = (low + high)/2;if(key == ST.elem[mid].key)return mid;else if(key < ST.elem[mid].key)......   //递归,在前半区间进行查找else...... //递归,在后半区间进行查找
}




如果为顺序查找,则 A S L = ( 11 + 1 ) / 2 = 6 ASL= (11+1)/2 = 6 ASL=(11+1)/2=6

平均查找长度ASL(成功时):
设表长 n = 2 h − 1 n = 2^h - 1 n=2h−1, 则 h = l o g 2 ( n + 1 ) h = log_2(n+1) h=log2​(n+1)(此时,判定树为深度 = h的满二叉树),且表中每个记录的查找概率相等: P i = 1 / n P_i = 1/n Pi​=1/n,则:
A S L = ∑ i = 1 n p i c i = 1 n ∑ i = 1 n c i = n ∑ j = 1 h j ⋅ 2 j − 1 ASL=\sum_{i=1}^{n} p_ic_i = \frac{1}{n}\sum_{i=1}^{n}c_i= {n}\sum_{j=1}^{h}j·2^{j-1} ASL=i=1∑n​pi​ci​=n1​i=1∑n​ci​=nj=1∑h​j⋅2j−1
= n + 1 n l o g 2 ( n + 1 ) − 1 = \frac{n+1}{n}log_2(n+1)-1 =nn+1​log2​(n+1)−1
≈ l o g 2 ( n + 1 ) − 1 ( n > 50 ) ≈log_2(n+1)-1(n > 50) ≈log2​(n+1)−1(n>50)
j j j 为第 j j j 层的每个结点要比较的次数; 2 j − 1 2^{j-1} 2j−1 为第 j j j 层结点数

分块查找




优点:插入和删除比较容易,无需进行大量移动;
缺点:要增加一个索引表的存储空间并对初始索引表进行排序运算;
适用情况:如果线性表既要快速查找又经常动态变化,则可采用分块查找;

查找方法的比较:

数据结构——线性表的查找相关推荐

  1. 数据结构-线性表的查找

    文章目录 查找(一) 9.1 查找基本概念 9.2 线性表的查找 9.2.1 顺序查找 9.2.2 折半查找 9.2.3 索引存储结构 参考资料 本篇文章用于记录,不适合参考. 查找(一) 9.1 查 ...

  2. 数据结构——线性表的查找:顺序查找、设置监视哨的顺序查找、折半查找

    算法7.1顺序查找 #include<iostream> using namespace std;typedef int KeyType; typedef int InfoType; #d ...

  3. 【数据结构和算法笔记】线性表的查找(平均查找长度,二分法,判定树)

    查找: 给定一个值k,在含有n个元素的表中找出关键字等于k的元素,若找到,则查找成功,否则,查找失败 查找前首先确定(1)存放数据的数据结构是什么(2)元素是否有序 动态查找表:查找的同时做修改操作( ...

  4. 数据结构与算法--线性表的查找

    一.查找的基本概念 1) 查找表: 查找表是由同一类型的数据元素(或记录)构成的集合         2) 由于集合中的数据元素之间存在着松散的关系,因此查找表是一种应用灵便的结构 3) 查找: 根据 ...

  5. 数据结构之线性表的查找

    目录 查找的基本概念 线性表的查找 顺序查找(线性查找) 折半查找(二分或对分查找) 折半查找的性能分析--判定树 分块查找(索引顺序查找) 分块查找性能分析 三种方法比较 查找的基本概念 查找表是由 ...

  6. 数据结构摧毁线性表用c语言,[简述]数据结构-线性表(c语言实现)

    [简述]数据结构-线性表(c语言实现)second60 20180422 1. 线性表的定义 线性表是具有相同特性的数据元素的一个有限序列. 2. 线性表抽象数据类型描述 ADT  List { 数据 ...

  7. java实现线性表的案例_数据结构—线性表(LinearList)的原理以及Java实现案例

    线性表:零个或多个数据元素的有限序列.包括数组.链表.栈空间.队列等结构都属于线性表. 本文将介绍Java线性表中的数组.链表的实现逻辑,并附有数组线性表.单链表.静态链表的Java实现源码. 数据结 ...

  8. 数据结构——线性表(三)

    数据结构--线性表(三) 作者:黑衣侠客 一.线性表的定义 线性表,从名字来看,可以发现,是具有像线一样性质的表 线性表:零个或多个数据元素的有限序列. 首先,它是一个序列,也就是说,元素之间是有顺序 ...

  9. 数据结构-线性表(严书代码实现)

    数据结构-线性表的顺序表示代码 //头文件内容实现 #ifndef SEQLIST_H_INCLUDED #define SEQLIST_H_INCLUDED #include<string.h ...

最新文章

  1. 文件管理器android实现,Android开发之简单文件管理器实现方法
  2. jQuery之文本框得失焦点
  3. java 打印心形图案_简单漂亮的心形礼品盒折纸手工教程
  4. C# 离线使用nuget
  5. 华为鸿蒙游戏引擎,打破技术封锁!鸿蒙OS后,国产顶级游戏引擎也已问世!
  6. 医疗人工智能市场有多大?
  7. 12699元的iPhone 11 Pro Max物料成本却不足3500元,苹果赚疯了?
  8. 难道千元机的品质真的不如旗舰机吗?
  9. 线性方程组的5种描述方式
  10. 【BZOJ-2888】资源运输 LCT + 启发式合并
  11. 达芬奇DaVinci Resolve Studio Mac v17.4.6
  12. 通讯录获取源码_[源码和文档分享]基于Java语言的C/S模式通讯录备份和查询软件...
  13. php 所有国家时区,php输出全球各个时区列表
  14. JAVA POI Excel导出,数据源可以是ListMap或者ListModel类型
  15. 优思学院|六西格玛:如何最有效地制定目标?
  16. Linux安装rar压缩软件
  17. rk3399性能_(三)感知与大脑——5.机器人大脑嵌入式主板性能对比
  18. 计算机教育 专业知识,计算机教育
  19. 3.27下午 口语练习P41
  20. CSS语法及其选择器

热门文章

  1. jdk8u121下载长城网太坑官网下不到
  2. 我的计算机窗口打不开,我的电脑打不开,双击出现选择打开程序窗口
  3. Linux的打包命令都有哪些呢?
  4. 记一次实习面试失败的经历(大数据)
  5. centos 8 epel 私有仓库
  6. Makefile入门: 用最美味的例子
  7. 让你满头黑线的错误,这么看
  8. 幼儿计算机培训老师,幼儿园教师计算机的培训计划方案
  9. 说说Kindle那些事
  10. 【免费制作电子杂志】云展网教程 | 设置杂志框架条显示或隐藏