排序是为了查找,而在排序过程中也需要查找比较。
查找长度即是比较次数,平均查找长度ASL,是每个元素查找需要的比较次数*其查找概率之和。每个元素查找概率相等即1/n。
线性表查找
- 顺序查找,ASL=(1+...+n)*(1/n)=(n(n+1)/2)*(1/n)=(n+1)/2。
平均时间复杂度 O(n)。顺序查找适用于数据量较小,数据量较大时需要采用缩小顺序查找范围的基本原则,措施有数据元素排序、建立索引、散列存储、创建二叉排序树。
- 二分查找,binary search,也称折半查找,采用分治策略,要求线性表是按关键字有序顺序表,只适用于静态查找表。
中间点位置=⌊(low+high)/2⌋,符号使用的是下中括号,不是上中括号⌈⌉。
二分查找过程可以用二叉树来描述,称为描述二分查找的判定树,即二叉判定树(binary decision tree)或比较树。
ASL=((n+1)/n)*lg(n+1)-1≈lg(n+1)-1。
树深度=⌈lg(n+1)⌉。
平均时间复杂度 O(lgn)。采用二分查找的前提条件:顺序存储结构、数据元素排序。当数据量较大量,排序也要花费时间,因此效率仍然较低。
- 分块查找(索引顺序查找),性能介于顺序和二分查找之间,要求线性表分块有序。
它的索引表是由各块中的最大关键字及块起始位置组成的有序表。
先查找索引表,确定块,再在块内顺序查找。
- 哈希查找(杂凑法、散列法)
不通过比较,直接在关键字和存储地址之间建立映射关系,通过关键字直接定位到记录在的位置。即通过哈希函数建立哈希表。
索引
索引采用分治策略,是将一个关键字与一组数据元素及其存储位置建立的关联关系。
将大数据量集划分为互不相交的若干块,每块内包含相同特性的元素,在块内进行顺序查找。
分块原则:每块元素特性用一个关键字识别,用索引项保存每块的特性、索引信息、存储地址。
索引表和主表:存储索引项的数据表称为索引表,存储数据元素的数据结构称为主表。
静态索引分为两类:稀疏索引和位图索引。
动态索引:
散列
是一种按关键字编址的存储和查找技术。散列表 Hash Table采用一维数据存储数据元素集合,根据元素的关键字确定存储位置。散列技术的关键步骤是设计散列函数和处理冲突,
树表之二叉排序树
比排序线性表更好的是二叉排序树,采用二叉树树存储排序集合的元素。
平衡二叉树是查找效率更高的二叉排序树。
二叉排序树,又称二叉查找树。
运算:插入、生成、删除、查找。
平衡二叉树是指任一结点的左右子树的高度大致相同。
B-树、平衡树
忽律横杠读作B树,即Balance Tree,多路平衡查找树。度为m的B树称为m阶B树。度数大则高度小,较大的度数使结点中的关键字较多,相比减小了磁盘访问次数。
一般地,文件中查找性能,受到的磁盘IO的次数的影响,远大于内存中比较的次数的影响。B树用于对较大的,存放在外部存储器上的文件内查找,是一种尽可能降低磁盘IO次数的文件组织方式。Mysql的数据索引存储即是基于Hash表或者B+树。
非根结点关键字数j:⌈m/2⌉-1<=j<m-1。
https://www.sohu.com/a/154640931_478315
散列(Hash)技术
和排序类似,要突破lgn的下界,就不能只依赖比较。
将结点按关键字的散列地址,存储到散列表中的过程,称为散列。
散列函数的作用是压缩待处理的下标范围|U|到m=O(|K|),即|K|的线性阶数量级,|K|<= m <|U|,所以从所有情况来看,冲突总会出现。
散列函数的标准是简单和均匀。有平方取中法、除余法、相乘取整法、随机数法。
处理冲突的方法:开放定址法(线性探查法、二次探查法、双重散列法)、拉链法。
地址单元为空的地址称为开放地址。
开放定址是当冲突发生时,用某种探查法在散列表中找到一个地址来放置这个冲突的结点。
散列表上的查找:
1.在散列表中查找散列地址h(K),若其单元为空,则查找失败。
2.比较其单元和K值是否相等,若相等则查找成功。
3.按冲突处理方法计算下一个散列地址h(K)。
映射
分为散列映射和树映射
260



被折叠的 条评论
为什么被折叠?



