查找

  • 查找的基本概念
  • 线性表的查找
    • 顺序查找(线性查找)
    • 折半查找(二分或对分查找)
    • 分块查找(索引顺序表查找)
    • 总结
  • 树表的查找
    • 二叉排序树(二叉搜索树、二叉排序树)
      • 基础知识
      • 查找
      • 插入
      • 生成
      • 删除
    • 平衡二叉树
      • 定义
      • 失衡平衡二叉排序树的分析与调整
  • 哈希表的查找
    • 散列表的基本概念
    • 散列函数的构造方法
    • 处理冲突的方法
    • 散列表的查找
    • 结论

查找的基本概念

  1. 查找表是由同一类型的数据元素(或记录)构成的集合,由于“集合”中的数据元素之间存在着松散的关系,因此查找表是一种应用灵便的结构
  2. 查找:根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素或记录
  3. 关键字:用来标识一个数据元素(或记录)的某个数据项的值
  • 主关键字:可唯一标识一个记录的关键字
  • 次关键字:用以识别若干记录的关键字
  1. 若查找表中存在这样一个记录,则称“查找成功
    –查找结果给出整个记录的信息,或指示该记录在查找表中的位置;
    否则称“查找不成功
    –查找结果给出“空记录”或“空指针”
  2. 查找目的:对查找表经常进行的操作:查询数据元素、检索数据元素的属性、插入数据元素、删除数据元素
  3. 查找表的分类:静态查找表(仅进行“查询、检索”)、动态查找表(插入和删除)
  4. 查找算法的评价指标:关键字的平均查找次数,即平均查找长度(ASL)
    ASL=∑(i=1→n)pi*ci(关键字比较次数的期望值)
    pi:查找第i个记录的概率(通常为1/n)
    ci:找到第i个记录所需的比较次数

线性表的查找

顺序查找(线性查找)

  1. 应用范围:顺序表或线性链表表示的静态查找表、表内元素之间无序
  2. 顺序表的表示:
    数据元素类型定义:
typedef struct {KeyType key; //关键字域......//其他域
}ElemType;typedef struct {//顺序表结构类型定义ElemType *R;//表基址int length; //表长
}SSTable;//顺序查找表
SSTable ST; //定义顺序表ST
  1. 在顺序表ST中查找值为key的数据元素,表长为n的表,分配n+1个空间,其中0号单元不用,查到返回位置i,失败返回0
    – 改进(设置监视哨的顺序查找):令ST.R[0].key=key,然后从后往前逐个查找,可免去查找过程中每一步都要检测是否查找完毕,加快速度(相比平常从后往前查找算法要判断值相等和下标>0),其中ASL几乎减少一半
  2. 时间复杂度:查找成功时的平均查找长度,设表中各记录查找概率相等ASL=(1+2+…+n)/n=(n+1)/2
    空间复杂度:一个辅助空间O(1)
  3. 优点:算法简单,逻辑次序无要求,且不同存储结构均适用
    缺点:ASL太长,时间效率太低

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

  1. 折半查找:每次将待查记录所在区间缩小一半
  2. 查找步骤
    mid=(low+high)/2;
    key<mid,则high=mid-1;
    key>mid,则low=mid+1
    key==mid,则找到
    high<low,结束,查找失败
    ①非递归算法·
int Search_Bin(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_Bin;

②递归算法

int Search_Bin(SSTable ST, KeyType key, int low, int high) {if (low > high) return 0;mid = (low+high) / 2;if (key == ST.R[mid].key) return mid;else if (key < ST.R[mid].key)  return Search_Bin(ST,key,low, mid-1);else return Search_Bin(ST,key,mid+1,high);
}
  1. 折半查找的性能分析——判定树

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

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

  1. 条件:
    (1)将表分成几块,且表或者有序,或者分块有序
    若i<j,则第j块中所有记录的关键字均大于第i块中的最大关键字
    (2)建立“索引表”(每个系欸但含有最大关键字域和指向本块第一个结点的指针,且按关键字有序)
  2. 查找过程:先确定待查记录,所在块(顺序或这般查找),再在块内查找(顺序查找)
  3. 查找效率ASL=Lb(对索引表查找ASL)+Lw(对块内查找的ASL)
  4. 优点:插入和删除比较容易,无需进行大量移动
    缺点:要增加一个索引表的存储空间并对初始索引表进行排序运算
    适用情况:如果线性表纪要快速查找又经常动态化,则可采用分块查找法

总结

树表的查找

动态查找表:表是动态生成的
对于给定值key,若表中存在,则返回成功;否则插入关键字等于key的记录

二叉排序树(二叉搜索树、二叉排序树)

基础知识

二叉排序树或是空树,或是满足如下性质的二叉树:

  1. 若其左子树非空、,则左子树上的所有结点的值(图3)均小于根结点的值
  2. 若其右子树非空,则右子树上所有结点的值均大于等于根结点的值
  3. 其左右子树本身又各是一棵二叉排序树

    中序遍历二叉排序树,结果为递增有序的序列

查找

  1. 查找步骤:
  • 若查找的关键字等于根结点,成功
  • 否则,若小于根结点,查其左子树;若大于根结点,查其右子树
  • 在左右子树的操作类似
typedef struct {KeyType Key; //关键字项InfoType otherInfo;  //其它数据域
}ElemType;typedef struct BSNode {ElemType data;  //数据域struct BSNode *lchild, *rchild; //左右孩子指针
}BSNode, *BSTree;BSTree T; //定义二叉排序树T
  1. 【算法思想】
  2. 若二叉排序树为空,则查找失败,返回空指针
  3. 若二叉排序树非空,将给定值key与根节点的关键字T->data.key进行比较
    ①若key等于T->data.key,则查找成功,返回根结点地址
    ②若key小于T->data.key,则进一步查找左子树
    ③若key大于T->data.key,则进一步查找右子树
BSTree SearchBST(BSTree T, KeyType key) {if((!T) || key==T->data.key) return T;else if(key < T->data.key)return SearchBST(T->lchild, key); //在左子树中继续查找else return SearchBST(T->rchild, key); //在右子树中继续查找
}//SearchBST
  1. 二叉排序树的平均查找长度ASL
    含有n个结点的二叉排序树的平均查找长度和树的形态有关
    最好情况:完全二叉树 最坏:每一层一个结点

插入

插入的元素一定在叶节点上
【算法思想】

  • 若二叉排序树为空,则插入结点作为根结点插入到空树中。
  • 否则,继续在其左、右子树上查找。
    ①树中已有,不再插入
    ②树中没有,查找直至某个叶子结点的左子树或右子树为空为止,则插入结点应为该叶子结点的左孩子或右孩子

生成

  1. 从空树出发,经过一系列的查找、插入操作之后,可生成一棵二叉排序树。
  2. 一个无序序列可通过构造二叉排序树而变成一个有序序列,构造树的过程就是对无序序列进行排序的过程。
  3. 插入的结点均为叶子结点,故无需移动其他结点,相当于在有序序列上插入记录而无需移动其他记录。

关键字的输入顺序不同,建立的二叉排序树不同

删除

  1. 从二叉排序树中删除一个结点,不能把以该结点为根的子树都删去,只能删掉该结点,并且还应保证删除后所得的二叉树仍然满足二叉排序树的性质不变。
  2. 由于中序遍历二叉排序树可以得到一个递增有序的序列。那么,在二叉排序树中删去一个结点相当于删去有序序列中的一个结点。
  • 将因删除结点而断开的二叉链表重新链接起来
  • 防止重新链接后树的高度增加

1) 被删除的结点为叶子结点,直接删去该结点

2) 被删除的结点只有左子树或者只有右子树,用其左子树或者右子树替换它(结点替换)

3)被删除的结点既有左子树,又有右子树
①其序前驱替换之(值替换),然后再删除该前驱结点。(前驱是左子树中最大的结点)
②用其后继替换之,然后再删除该后继结点。(后继是右子树中最小的结点)


平衡二叉树

定义

平衡二叉树,又称AVL树

  • 一棵平衡二叉树或者是空树,或者是具有下列性质的二叉排序树(首先得是二叉排序树):
    ①左子树和右子树的高度之差的绝对值小于等于1
    ②左子树和右子树也是平衡二叉排序树
  1. 为了方便起见,给每个结点附加一个数字,为该结点左子树与右子树的高度差。这个数字称为结点的平衡因子(BF)
  2. 平衡因子 = 结点左子树的高度 - 结点右子树的高度
  3. 根据平衡二叉树的定义,平衡二叉树上所有结点的平衡因子只能是 -1、0、1
  4. 对于一棵有 n 个结点的AVL树,其高度保持在O(log2 n)数量级,ASL也保持在O(log2 n)量级

失衡平衡二叉排序树的分析与调整

如果在一棵AVL树中插入一个新结点后造成失衡,则必须重新调整树的结构,使之恢复平衡
平衡调整的四种类型:LL型、LR型、RL型、RR型

哈希表的查找

散列表的基本概念

  • 基本思想:记录的存储位置与关键字之间存在对应关系,对应关系——hash函数,Loc(i) = H(keyi)(hash函数)
  • 优点:查找效率高
  • 缺点:空间效率低
  • 若干术语:
  • ①散列方法(杂凑法):选取某个函数,依该函数按关键字计算元素的存储位置,并按此存放。查找时,由同一个函数对给定值k计算地址,将k与地址单元中元素关键码进行对比,确定查找是否成功。
  • ②散列函数(杂凑函数):散列方法中使用的转换函数
  • ③散列表(杂凑表):按上述思想构造的表
  • ④冲突:按散列函数计算得出的不同的关键码映射到同一散列表
  • ⑤同义词:具有相同函数值的多个关键字
  • ⑥散列存储:选取某个函数,依该函数按关键字计算元素的存储位置

散列函数的构造方法

  1. 直接定址法
  • Hash(key) = a·key + b (a、b为常数)
  • 优点:以关键码key的某个线性函数值为散列地址,不会产生冲突。
  • 缺点:要占用连续地址空间,空间效率低
  1. 除留余数法
  • Hash(key) = key mod p (p是一个整数)

关键:选取合适的p——设表长为m,取p≤m且为质数

处理冲突的方法

1. 开放定址法(开地址法)

  • 基本思想:有冲突时就去寻找下一个空的散列地址,只要散列表足够大,空的散列地址总能找到,并将数据元素存入
  • 常用方法:线性探测法、二次探测法、伪随机探测法


1) 线性探测法
Hi =Hash(key) + di) mod m (1≤i<m),m为散列表长度,di为增量序列1,2,…,m-1,且di=i
一旦产生冲突,就找下一个地址,直到找到空地址存入

2) 二次探测法

3)伪随机探测法
Hi = (Hash(key)+dj) mod m (1≤i<m),其中m为散列表长度 di为伪随机数
** 2. 链地址法(拉链法)**

  • 基本思想:相同散列地址的记录链成一单链表,m个散列地址就设 m 个单链表,然后用数组将 m 个单链表的表头指针存储起来,形成一个动态的结构。
  • 建立散链表步骤
    ①取数据元素的关键字key,计算其散列函数值(地址)。若该地址对应的链表为空,则将该元素插入此链表;否则执行步骤2解决冲突;
    ②根据选择的冲突处理方法,计算关键字key的下一个存储地址,若该地址对应的链表不为空,则利用链表的前插法或后插法将该元素插入此链表。
  • 优点:非同义词不会冲突,无“聚集”现象;链表上结点空间动态申请,更适合于表长不确定的情况
  1. 再散列法(双散列函数法)
  2. 建立一个公共溢出区

散列表的查找




使用平均查找长度ASL来衡量查找算法,ASL取决于:

  • 散列函数
  • 处理冲突的方法
  • 散列表的装填因子α
    • α = 表中填入的记录数 / 哈希表的长度
    • α越大,表中记录越多,说明表装的越满,发生冲突的可能性就越大,查找时比较次数就越多

结论

  • 散列表技术具有很好的平均性能,优于一些传统的技术
  • 链地址法优于开地址法
  • 除留余数法做散列函数优于其他类型函数

数据处理技术——查找技术相关推荐

  1. 三维点云数据处理软件供技术原理说明_海量点云数据处理理论与技术

    海量点云数据处理理论与技术 作者:程效军,贾东峰,程小龙 主编 出版时间:2014年版 内容简介 程效军.贾东峰.程小龙编著的<海量点云数据处理理论与技术>共分8章.第1章绪论,简要介绍海 ...

  2. Linux中文件查找技术大全

    Linux中文件查找技术大全 转载出处:http://tech.sina.com.cn/c/2001-10-29/6739.html 文/Linuxdoor 每一种操作系统都是由成千上万个不同种类的文 ...

  3. 查找技术:有序表的对分查找(折半查找)类

    一 查找技术相关总结: 1.顺序查找:(1)如果线性表为无序表(即表中元素的排序是无序的),则不管是顺序存储结构还是链式存储结构,都只能用顺序查找:(2)即使是有序线性表,如果采用链式存储结构,也只能 ...

  4. 大数据处理的关键技术(一)

    关于大数据的学习以及了解大数据的用途都是很多人比较关注的,毕竟大数据这个词是近几年才兴起并迅速火热起来,也有越来越多的朋友想要加入到大数据行业.如果想要学好大数据就必须对大数据处理的关键技术有所了解, ...

  5. 大数据处理的关键技术是什么?

    大数据处理的关键技术是什么? [导语]大数据是需要新处理模式才能具有更强的决策力.洞察发现力和流程优化能力的海量.高增长率和多样化的信息资产,目前,企业通过大数据技术进行数据处理,已经成为了一种趋势, ...

  6. 20176408李俊 查找技术

    关键码:可以标识一个记录的某个数据项. 键值:关键码的值. 主关键码:可以唯一地标识一个记录的关键码. 次关键码:不能唯一地标识一个记录的关键码. 查找 :在具有相同类型的记录构成的集合中找出满足给定 ...

  7. 惠普新笔记本将采用Tile查找技术,可智能定位笔记本电脑

    全球领先的智能定位公司Tile与惠普正使用Tile的查找技术引入其他PC设备,以使千百万人可以安心地居家工作或准备返回办公室.从今天开始,惠普深受欢迎的EliteBook 800 G8系列(包括x36 ...

  8. 数据结构笔记 第六章 查找技术

    查找技术 在计算机科学中定义为:在一些(有序的/无序的)数据元素中,通过一定的方法找出与给定关键字相同的数据元素的过程叫做查找.也就是根据给定的某个值,在查找表中确定一个关键字等于给定值的记录或数据元 ...

  9. 使用pig对钓鱼网站链接url做词频统计【大数据处理与分析技术】

    使用pig对钓鱼网站链接url做词频统计(大数据处理与分析技术) 数据展示:(verified_online.csv) grunt> A = load 'verified_online.csv' ...

最新文章

  1. Landsat 8 OLI_TIRS 卫星数字产品
  2. mysql带AND关键字的多条件查询
  3. C语言字符串相关一级指针内存模型
  4. Web开发的那点事--业务层常用功能
  5. 第二个Spring冲刺周期团队进展报告
  6. win7必须重新启动计算机才能应用这些更改,专家支招:当商用计算机遇到必须重新启动才能生效的更新...
  7. SCCM2012 R2系统部署时,客户端报0x80004005错误(2)
  8. Python风格总结:模块调用
  9. SpringMVC架构
  10. 高等数学(工本)选择题
  11. 服务器用户配置文件在哪里找,SharePoint Server 中的服务器到服务器身份验证和用户配置文件...
  12. 【背包问题】基于matlab遗传算法求解多背包问题【含Matlab源码 122期】
  13. 雪花算法生成数字id_全局唯一iD的生成 雪花算法详解及其他用法
  14. python对电商运营有帮助吗_做电商运营需要学习python嘛?
  15. ch340是什么芯片
  16. 宇枫资本投资过程中要注意这些习惯
  17. 【Python编写漏洞测试工具入门】
  18. 上传应用到苹果一直卡住验证中(authentication with the app store)问题解决
  19. spring cloud alibaba全家桶之nacos
  20. 星星之火-9:详解信道特性与奈奎斯特定理和香农定理

热门文章

  1. 海量数据常用十大解决方案
  2. 赶集网mysql36条军规_赶集网MySQL的36条军规
  3. 我的 Chrome 插件集
  4. flink connector phoenix
  5. SHA256 算法实现
  6. javaee之spring3
  7. Android persist类property 知识点
  8. Navicat导出错误(ORA-00911: invalid character)
  9. ESP32-C3入门教程 WiFi篇③——WiFi SoftAP 模式开启AP热点
  10. 均值滤波、中值滤波【MATLAB】【图像处理】