查找 -数据结构

查找 -数据结构

几种查找算法:顺序查找,折半查找,分块查找,散列表

一、顺序查找的基本思想:

从表的一端开始,向另一端逐个按给定值kx 与关键码进行比较,若找到,查找成功,并给出数据元素在表中的位置;若整个表检测完,仍未找到与kx 相同的关键码,则查找失败,给出失败信息。

说白了就是,从头到尾,一个一个地比,找着相同的就成功,找不到就失败。很明显的缺点就是查找效率低。

【适用性】:适用于线性表的顺序存储结构和链式存储结构。

平均查找长度=(n+1)/2.

【顺序查找优缺点】:

缺点:是当n 很大时,平均查找长度较大,效率低;

优点:是对表中数据元素的存储没有要求。另外,对于线性链表,只能进行顺序查找。

二、有序表的折半查找基本思想:

在有序表中,取中间元素作为比较对象,若给定值与中间元素的关键码相等,则查找成功;若给定值小于中间元素的关键码,则在中间元素的左半区继续查找;若给定值大于中间元素的关键码,则在中间元素的右半区继续查找。不断重复上述查找过程,直到查找成功,或所查找的区域无数据元素,查找失败。

【步骤】
① low=1;high=length; // 设置初始区间
② 当low>high 时,返回查找失败信息// 表空,查找失败
③ low≤high,mid=(low+high)/2; //确定该区间的中点位置
      a. 若kx<tbl.elem[mid].key,high = mid-1;转② // 查找在左半区进行
      b. 若kx>tbl.elem[mid].key,low  = mid+1; 转② // 查找在右半区进行
      c. 若kx=tbl.elem[mid].key,返回数据元素在表中位置// 查找成功

有序表按关键码排列如下:

7,14,18,21,23,29,31,35,38,42,46,49,52

在表中查找关键码为14 的数据元素:

【算法实现】

[cpp] view plain copy

print?

  1. int Binary_Search(ElemType a[], ElemType kx, int length)
  2. {
  3. int mid,low,high, flag = 0;
  4. low = 0; high = length;                   /* ①设置初始区间*/
  5. while(low <= high)                        /* ②表空测试*/
  6. {    /* 非空,进行比较测试*/
  7. mid = (low + high)/2;                /* ③得到中点*/
  8. if(kx < a[mid]) high = mid-1;        /* 调整到左半区*/
  9. else if(kx > a[mid]) low = mid+1;    /* 调整到右半区*/
  10. else {                                /* 查找成功,元素位置设置到flag 中*/
  11. flag=mid;
  12. break;
  13. }
  14. }
  15. return flag;
  16. }

【性能分析】

平均查找长度=Log2(n+1)-1

从折半查找过程看,以表的中点为比较对象,并以中点将表分割为两个子表,对定位到的子表继续这种操作。所以,对表中每个数据元素的查找过程,可用二叉树来描述,称这个描述查找过程的二叉树为判定树。

(7,14,18,21,23,29,31,35,38,42,46,49,52)折半查找的判定树

可以看到,查找表中任一元素的过程,即是判定树中从根到该元素结点路径上各结点关键码的比较次数,也即该元素结点在树中的层次数。对于n 个结点的判定树,树高为k,则有2k-1 -1<n≤2k-1,即k-1<log2(n+1)≤k,所以k= 。因此,折半查找在查找成功时,所进行的关键码比较次数至多为。

接下来讨论折半查找的平均查找长度。为便于讨论,以树高为k 的满二叉树(n=2k-1)为例。假设表中每个元素的查找是等概率的,即Pi= ,则树的第i 层有2i-1 个结点,因此,折半查找的平均查找长度为:

所以,折半查找的时间效率为O(log2n)。

注:

虽然折半查找的效率高,但是要将表按关键字排序。而排序本身是一种很费时的运算,所以二分法比较适用于顺序存储结构。为保持表的有序性,在顺序结构中插入和删除都必须移动大量的结点。因此,折半查找特别适用于那种一经建立就很少改动而又经常需要查找的线性表。

三、分块查找(索引查找)的基本思想:

分块查找又称索引顺序查找,是对顺序查找的一种改进。分块查找要求将查找表分成 若干个子表,并对子表建立索引表,查找表的每一个子表由索引表中的索引项确定。索引 项包括两个字段:关键码字段(存放对应子表中的最大关键码值) ;指针字段(存放指向对 应子表的指针) ,并且要求索引项按关键码字段有序。查找时,先用给定值kx 在索引表中 检测索引项,以确定所要进行的查找在查找表中的查找分块(由于索引项按关键码字段有序,可用顺序查找或折半查找) ,然后,再对该分块进行顺序查找。

 

如关键码集合为:

                           (22,12,13,9,20,33,42,44,38,24,48,60,58,74,49,86,53)

按关键码值31,62,88 分为三块建立的查找表及其索引表如下:

                              

 

 

设表共n个结点,分b块,s=n/b

(分块查找索引表)平均查找长度=Log2n/s+1+s/2

(顺序查找索引表)平均查找长度=(S2+2S+n)/(2S)

注:

分块查找的优点是在表中插入或删除一个记录时,只要找到该记录所属块,就在该块中进行插入或删除运算(因块内无序,所以不需要大量移动记录)。它主要代价是增加一个辅助数组的存储控件和将初始表分块排序的运算。

它的性能介于顺序查找和二分查找之间。

 

时间: 2024-08-16 09:20:47

查找 -数据结构的相关文章

索引学习 查找 数据结构 梳理

索引是啥? 索引是数据结构,在数据结构有一章叫查找,在国外的一本书上名字就找索引. 准确的说就是: 加快查找的数据结构. 查找的那一章: 1.有序数组的二分查找 2.二叉查找 ,在此处,为了效率防止退化,引入了平衡的调整. 3.在上述的平衡的定义,为左右高度至多差1,要求太严,调整频露高,于是红黑树应运而生,它对平衡的定义要求最长的比最短的最多2倍,降低平衡要求的目的是提高性能. 红黑树的5条性质如下: 1.节点为黑或红. 2.根和叶子为黑. 3.不能出现红红. 4,每个节点到叶子黑色高度相同.

Python 常用查找数据结构及算法

一.基本概念 二.无序表查找 三.有序表查找 3.1 二分查找(Binary Search) 3.2 插值查找 3.3 斐波那契查找 四.线性索引查找 4.1 稠密索引 4.2 分块索引 4.3 倒排索引 五.二叉排序树 六. 平衡二叉树 七.多路查找树(B树) 7.1 2-3树 7.2 2-3-4树 7.3 B树 7.4 B+树 八.散列表(哈希表) 8.1 散列函数的构造方法 8.2 处理散列冲突 8.3 散列表查找实现 8.4 散列表查找性能分析 参考书目<大话数据结构> 一.基本概念

5、查找——数据结构【基础篇】

查找 查找的基本概念 查找的目的是从给定的同一类型的数据集合中,找出人们所需要的数据元素(或记录) 线性表的查找--静态查找 在对查找表实施静态查找时,查找表的组织结构可以是顺序表结构,也可以是单链表结构 静态查找的方法: 顺序查找: 顺序查找是用待查找记录与查找表中的记录逐个比较,如果找到相等记录,则查找成功,否则查找失败 顺序查找对关键字的是否有序没有要求,但是查找效率低下 时间复杂度为O(n) 注意:当n较大时,不宜采用顺序查找 折半查找(二分查找) 折半查找的前提条件:查找表有序且顺序存

常用的查找算法

顺序查找 二分法查找 分块查找 散列表查找(哈希表) 顺序查找的基本思想: 从表的一端开始,顺序扫描表,依次将扫描到的结点关键字和给定值(假定为a)相比较,若当前结点关键字与a相等,则查找成功:若扫描结束后,仍未找到关键字等于a的结点,则查找失败. 说白了就是,从头到尾,一个一个地比,找着相同的就成功,找不到就失败.很明显的缺点就是查找效率低. 适用于线性表的顺序存储结构和链式存储结构. 计算平均查找长度. 例如上表,查找1,需要1次,查找2需要2次,依次往下推,可知查找16需要16次, 可以看

排序和数据结构

目录 各种排序算法时间复杂度及空间复杂度对比 各种排序算法 1.python内置方法sorted()和list.sort()排序 2.冒泡排序 3.选择排序 4.插入排序 5.快速排序 6.希尔排序 7.计数排序 8.归并排序 列表查找 数据结构 malloc()到底如何申请内存空间? 数组和链表 各种排序算法时间复杂度及空间复杂度对比 Timsort与其他比较排序算法时间复杂度(time complexity)的比较 空间复杂度(space complexities)比较 各种排序算法 同等硬

[算法系列之二十八]并查集(不相交集合)

一 概述 并查集(Disjoint set或者Union-find set)是一种树型的数据结构,常用于处理一些不相交集合(Disjoint Sets)的合并及查询问题. 有一个联合-查找算法(union-find algorithm)定义了两个操作用于此数据结构: Find:确定元素属于哪一个子集.它可以被用来确定两个元素是否属于同一子集. Union:将两个子集合并成同一个集合. 因为它支持这两种操作,一个不相交集也常被称为联合-查找数据结构(union-find data structur

Hadoop 中SequenceFile的简介

概念 SequenceFile是一个由二进制序列化过的key/value的字节流组成的文本存储文件,它可以在map/reduce过程中的input/output 的format时被使用.在map/reduce过程中,map处理文件的临时输出就是使用SequenceFile处理过的. 所以一般的SequenceFile均是在FileSystem中生成,供map调用的原始文件. 特点 SequenceFile是 Hadoop 的一个重要数据文件类型,它提供key-value的存储,但与传统key-v

并查集(union/find)

在计算机科学中,并查集是一种树型的数据结构,其保持着用于处理一些不相交集合(Disjoint Sets)的合并及查询问题.有一个联合-查找算法(union-find algorithm)定义了两个操作用于此数据结构: Find:确定元素属于哪一个子集.它可以被用来确定两个元素是否属于同一子集. Union:将两个子集合并成同一个集合. 因为它支持这两种操作,一个不相交集也常被称为联合-查找数据结构(union-find data structure)或合并-查找集合(merge-find set

Android RakNet 系列之二 功能介绍

简介 RakNet 已经成功地在Android平台上测试成功.RakNet的文档很多,实现起来很简单,下面对Raknet功能细节进行详细了解. 详情 1.RakNet使用哪些数据结构? 结构文件 描述 DS_BinarySearchTree.h 二叉搜索树,以及AVL平衡二叉搜索树 DS_BPlusTree.h B+树,用于快速查询,删除,和插入 DS_BytePool.h 返回某个大小门限的数据块,减少内存碎片 DS_ByteQueue.h 用于读写字节的队列 DS_Heap.h 堆数据结构体