数据处理技术——查找技术
查找
- 查找的基本概念
- 线性表的查找
- 顺序查找(线性查找)
- 折半查找(二分或对分查找)
- 分块查找(索引顺序表查找)
- 总结
- 树表的查找
- 二叉排序树(二叉搜索树、二叉排序树)
- 基础知识
- 查找
- 插入
- 生成
- 删除
- 平衡二叉树
- 定义
- 失衡平衡二叉排序树的分析与调整
- 哈希表的查找
- 散列表的基本概念
- 散列函数的构造方法
- 处理冲突的方法
- 散列表的查找
- 结论
查找的基本概念
查找表
是由同一类型的数据元素(或记录)构成的集合,由于“集合”中的数据元素之间存在着松散的关系,因此查找表是一种应用灵便的结构查找
:根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素或记录关键字
:用来标识一个数据元素(或记录)的某个数据项的值
主关键字
:可唯一标识一个记录的关键字次关键字
:用以识别若干记录的关键字
- 若查找表中存在这样一个记录,则称“
查找成功
”
–查找结果给出整个记录的信息,或指示该记录在查找表中的位置;
否则称“查找不成功
”
–查找结果给出“空记录”或“空指针”查找目的
:对查找表经常进行的操作:查询数据元素、检索数据元素的属性、插入数据元素、删除数据元素查找表的分类
:静态查找表(仅进行“查询、检索”)、动态查找表(插入和删除)查找算法的评价指标
:关键字的平均查找次数,即平均查找长度(ASL)
ASL=∑(i=1→n)pi*ci(关键字比较次数的期望值)
pi:查找第i个记录的概率(通常为1/n)
ci:找到第i个记录所需的比较次数
线性表的查找
顺序查找(线性查找)
- 应用范围:顺序表或线性链表表示的
静态查找表
、表内元素之间无序
- 顺序表的表示:
数据元素类型定义:
typedef struct {KeyType key; //关键字域......//其他域
}ElemType;typedef struct {//顺序表结构类型定义ElemType *R;//表基址int length; //表长
}SSTable;//顺序查找表
SSTable ST; //定义顺序表ST
- 在顺序表ST中查找值为key的数据元素,表长为n的表,分配n+1个空间,其中0号单元不用,查到返回位置i,失败返回0
– 改进(设置监视哨的顺序查找):令ST.R[0].key=key,然后从后往前逐个查找,可免去查找过程中每一步都要检测是否查找完毕,加快速度(相比平常从后往前查找算法要判断值相等和下标>0),其中ASL几乎减少一半- 时间复杂度:查找成功时的平均查找长度,设表中各记录查找概率相等ASL=(1+2+…+n)/n=(n+1)/2
空间复杂度:一个辅助空间O(1)- 优点:算法简单,逻辑次序无要求,且不同存储结构均适用
缺点:ASL太长,时间效率太低
折半查找(二分或对分查找)
折半查找
:每次将待查记录所在区间缩小一半- 查找步骤
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)将表分成几块,且表或者有序,或者分块有序
若i<j,则第j块中所有记录的关键字均大于第i块中的最大关键字
(2)建立“索引表”(每个系欸但含有最大关键字域和指向本块第一个结点的指针,且按关键字有序)- 查找过程:先确定待查记录,所在块(顺序或这般查找),再在块内查找(顺序查找)
- 查找效率ASL=Lb(对索引表查找ASL)+Lw(对块内查找的ASL)
- 优点:插入和删除比较容易,无需进行大量移动
缺点:要增加一个索引表的存储空间并对初始索引表进行排序运算
适用情况:如果线性表纪要快速查找又经常动态化,则可采用分块查找法
总结
树表的查找
动态查找表:表是动态生成的
对于给定值key,若表中存在,则返回成功;否则插入关键字等于key的记录
二叉排序树(二叉搜索树、二叉排序树)
基础知识
二叉排序树或是空树,或是满足如下性质的二叉树:
- 若其左子树非空、,则左子树上的
所有结点的值
(图3)均小于根结点的值- 若其右子树非空,则右子树上
所有结点的值
均大于等于根结点的值- 其左右子树本身又各是一棵二叉排序树
中序遍历二叉排序树,结果为递增有序的序列
查找
- 查找步骤:
- 若查找的关键字等于根结点,成功
- 否则,若小于根结点,查其左子树;若大于根结点,查其右子树
- 在左右子树的操作类似
typedef struct {KeyType Key; //关键字项InfoType otherInfo; //其它数据域
}ElemType;typedef struct BSNode {ElemType data; //数据域struct BSNode *lchild, *rchild; //左右孩子指针
}BSNode, *BSTree;BSTree T; //定义二叉排序树T
- 【算法思想】
- 若二叉排序树为空,则查找失败,返回空指针
- 若二叉排序树非空,将给定值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
- 二叉排序树的平均查找长度ASL
含有n个结点的二叉排序树的平均查找长度和树的形态有关
最好情况:完全二叉树 最坏:每一层一个结点
插入
插入的元素一定在叶节点上
【算法思想】
- 若二叉排序树为空,则插入结点作为根结点插入到空树中。
- 否则,继续在其左、右子树上查找。
①树中已有,不再插入
②树中没有,查找直至某个叶子结点的左子树或右子树为空为止,则插入结点应为该叶子结点的左孩子或右孩子
生成
- 从空树出发,经过一系列的查找、插入操作之后,可生成一棵二叉排序树。
- 一个无序序列可通过构造二叉排序树而变成一个有序序列,构造树的过程就是对无序序列进行排序的过程。
- 插入的结点均为叶子结点,故
无需移动其他结点
,相当于在有序序列上插入记录而无需移动其他记录。
关键字的输入顺序不同,建立的二叉排序树不同
删除
- 从二叉排序树中删除一个结点,不能把以该结点为根的子树都删去,只能删掉该结点,并且还应保证删除后所得的二叉树仍然满足二叉排序树的性质不变。
- 由于中序遍历二叉排序树可以得到一个递增有序的序列。那么,在二叉排序树中删去一个结点相当于删去有序序列中的一个结点。
- 将因删除结点而断开的二叉链表重新链接起来
- 防止重新链接后树的高度增加
1) 被删除的结点为叶子结点,直接删去该结点
2) 被删除的结点只有左子树或者只有右子树,用其左子树或者右子树替换它(结点替换)
3)被删除的结点既有左子树,又有右子树
①其序前驱替换之(值替换),然后再删除该前驱结点。(前驱是左子树中最大的结点)
②用其后继替换之,然后再删除该后继结点。(后继是右子树中最小的结点)
平衡二叉树
定义
平衡二叉树,又称AVL树
- 一棵平衡二叉树或者是空树,或者是具有下列性质的
二叉排序树
(首先得是二叉排序树):
①左子树和右子树的高度之差的绝对值小于等于1
②左子树和右子树也是平衡二叉排序树
- 为了方便起见,给每个结点附加一个数字,为该结点左子树与右子树的高度差。这个数字称为结点的平衡因子(BF)
- 平衡因子 = 结点左子树的高度 - 结点右子树的高度
- 根据平衡二叉树的定义,平衡二叉树上
所有结点的平衡因子
只能是 -1、0、1 - 对于一棵有 n 个结点的AVL树,其高度保持在O(log2 n)数量级,ASL也保持在O(log2 n)量级
失衡平衡二叉排序树的分析与调整
如果在一棵AVL树中插入一个新结点后造成失衡,则必须重新调整树的结构,使之恢复平衡
平衡调整的四种类型:LL型、LR型、RL型、RR型
哈希表的查找
散列表的基本概念
- 基本思想:记录的存储位置与关键字之间存在对应关系,对应关系——hash函数,Loc(i) = H(keyi)(hash函数)
- 优点:查找效率高
- 缺点:空间效率低
- 若干术语:
- ①散列方法(杂凑法):选取某个函数,依该函数按关键字计算元素的存储位置,并按此存放。查找时,由同一个函数对给定值k计算地址,将k与地址单元中元素关键码进行对比,确定查找是否成功。
- ②散列函数(杂凑函数):散列方法中使用的转换函数
- ③散列表(杂凑表):按上述思想构造的表
- ④冲突:按散列函数计算得出的不同的关键码映射到同一散列表
- ⑤同义词:具有相同函数值的多个关键字
- ⑥散列存储:选取某个函数,依该函数按关键字计算元素的存储位置
散列函数的构造方法
- 直接定址法
- Hash(key) = a·key + b (a、b为常数)
- 优点:以关键码key的某个线性函数值为散列地址,不会产生冲突。
- 缺点:要占用连续地址空间,空间效率低
- 除留余数法
- 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的下一个存储地址,若该地址对应的链表不为空,则利用链表的前插法或后插法将该元素插入此链表。 - 优点:非同义词不会冲突,无“聚集”现象;链表上结点空间动态申请,更适合于表长不确定的情况
- 再散列法(双散列函数法)
- 建立一个公共溢出区
散列表的查找
使用平均查找长度ASL来衡量查找算法,ASL取决于:
- 散列函数
- 处理冲突的方法
- 散列表的装填因子α
- α = 表中填入的记录数 / 哈希表的长度
- α越大,表中记录越多,说明表装的越满,发生冲突的可能性就越大,查找时比较次数就越多
结论
- 散列表技术具有很好的平均性能,优于一些传统的技术
- 链地址法优于开地址法
- 除留余数法做散列函数优于其他类型函数
数据处理技术——查找技术相关推荐
- 三维点云数据处理软件供技术原理说明_海量点云数据处理理论与技术
海量点云数据处理理论与技术 作者:程效军,贾东峰,程小龙 主编 出版时间:2014年版 内容简介 程效军.贾东峰.程小龙编著的<海量点云数据处理理论与技术>共分8章.第1章绪论,简要介绍海 ...
- Linux中文件查找技术大全
Linux中文件查找技术大全 转载出处:http://tech.sina.com.cn/c/2001-10-29/6739.html 文/Linuxdoor 每一种操作系统都是由成千上万个不同种类的文 ...
- 查找技术:有序表的对分查找(折半查找)类
一 查找技术相关总结: 1.顺序查找:(1)如果线性表为无序表(即表中元素的排序是无序的),则不管是顺序存储结构还是链式存储结构,都只能用顺序查找:(2)即使是有序线性表,如果采用链式存储结构,也只能 ...
- 大数据处理的关键技术(一)
关于大数据的学习以及了解大数据的用途都是很多人比较关注的,毕竟大数据这个词是近几年才兴起并迅速火热起来,也有越来越多的朋友想要加入到大数据行业.如果想要学好大数据就必须对大数据处理的关键技术有所了解, ...
- 大数据处理的关键技术是什么?
大数据处理的关键技术是什么? [导语]大数据是需要新处理模式才能具有更强的决策力.洞察发现力和流程优化能力的海量.高增长率和多样化的信息资产,目前,企业通过大数据技术进行数据处理,已经成为了一种趋势, ...
- 20176408李俊 查找技术
关键码:可以标识一个记录的某个数据项. 键值:关键码的值. 主关键码:可以唯一地标识一个记录的关键码. 次关键码:不能唯一地标识一个记录的关键码. 查找 :在具有相同类型的记录构成的集合中找出满足给定 ...
- 惠普新笔记本将采用Tile查找技术,可智能定位笔记本电脑
全球领先的智能定位公司Tile与惠普正使用Tile的查找技术引入其他PC设备,以使千百万人可以安心地居家工作或准备返回办公室.从今天开始,惠普深受欢迎的EliteBook 800 G8系列(包括x36 ...
- 数据结构笔记 第六章 查找技术
查找技术 在计算机科学中定义为:在一些(有序的/无序的)数据元素中,通过一定的方法找出与给定关键字相同的数据元素的过程叫做查找.也就是根据给定的某个值,在查找表中确定一个关键字等于给定值的记录或数据元 ...
- 使用pig对钓鱼网站链接url做词频统计【大数据处理与分析技术】
使用pig对钓鱼网站链接url做词频统计(大数据处理与分析技术) 数据展示:(verified_online.csv) grunt> A = load 'verified_online.csv' ...
最新文章
- Landsat 8 OLI_TIRS 卫星数字产品
- mysql带AND关键字的多条件查询
- C语言字符串相关一级指针内存模型
- Web开发的那点事--业务层常用功能
- 第二个Spring冲刺周期团队进展报告
- win7必须重新启动计算机才能应用这些更改,专家支招:当商用计算机遇到必须重新启动才能生效的更新...
- SCCM2012 R2系统部署时,客户端报0x80004005错误(2)
- Python风格总结:模块调用
- SpringMVC架构
- 高等数学(工本)选择题
- 服务器用户配置文件在哪里找,SharePoint Server 中的服务器到服务器身份验证和用户配置文件...
- 【背包问题】基于matlab遗传算法求解多背包问题【含Matlab源码 122期】
- 雪花算法生成数字id_全局唯一iD的生成 雪花算法详解及其他用法
- python对电商运营有帮助吗_做电商运营需要学习python嘛?
- ch340是什么芯片
- 宇枫资本投资过程中要注意这些习惯
- 【Python编写漏洞测试工具入门】
- 上传应用到苹果一直卡住验证中(authentication with the app store)问题解决
- spring cloud alibaba全家桶之nacos
- 星星之火-9:详解信道特性与奈奎斯特定理和香农定理