文章目录

  • 基本概念
  • 顺序查找
    • 1.顺序查找的实现
    • 2.哨兵实现
    • 3.顺序查找的优化
      • ①用有序表
      • ②被查概率不相同的情况
    • 小结
  • 折半查找
    • 1.算法
    • 2.代码
    • 3.查找效率
    • 4.折半查找判定树
    • 小结
  • 分块查找(索引查找)
    • 1.算法
    • 2.查找效率
    • 小结
  • ~~B树~~
    • 1.概念
    • 2.特点
    • 3.B树的最大、最小高度
  • ~~B树插入和删除~~
    • 1.插入
    • 2.删除
      • ①删除终端结点(未小于最小值)
      • ②删除非终端结点
      • ③兄弟够借(删除后小于最低值了)
      • ④兄弟不够借
    • 小结
  • ~~B+树~~
    • 小结
  • 散列查找
    • 1.处理冲突的方法
      • ①拉链法
      • ②开放定址法
        • Ⅰ.线性探测法
        • Ⅱ.平方定址法
        • Ⅲ.伪随机序列法
      • ③再散列法
    • 2.常见的散列函数
      • ①除留余数法
      • ②直接定址法
      • ③数字分析法
      • ④平方取中法
    • 小结

基本概念

静态查找:只查找
动态查找:边查找还要边修改



评价⼀个查找算法的效率时,通常考虑查找成功/查找失败两种情况的 ASL

顺序查找

1.顺序查找的实现


从0开始找,每次要判断是否超过表长&&是否等于要查目标,不是的话查下一个,是的话就返回值

2.哨兵实现


哨兵,从后往前查,0号位放目标信息,其他信息从1开始存,只用判断是否等于目标值,最后如果失败了就会返回0(查到0了也没找到),减少了判断的时间

优点:无需判断是否越界,效率更高

效率:O(n)

3.顺序查找的优化

①用有序表


对于失败来说,优化了不少

⼀个成功结点的查找长度 = 自身所在层数
⼀个失败结点的查找长度 = 其父节点所在层数(上面那个查完了,就知道失败了)

②被查概率不相同的情况


把概率大的放前面,可以减少总的查询次数

小结


顺序查找的时间复杂度O(n)

折半查找

折半查找,⼜称“⼆分查找”,仅适⽤于有序的顺序表。

1.算法


12<mid(mid指的不等于目标值),于是把high指向mid-1(因为high也≠mid,然后mid=(low+high)/2,如果不是整数就往下取整,循环,最后mid=目标值成功,low>high失败)


2.代码

3.查找效率

4.折半查找判定树



一直从中间分成两半(mid是向下取整的)


很简单,因为mid要么就是靠左边的

折半查找的判定树⼀定是平衡⼆叉树



时间复杂度:O(log2n)

小结


折半查找不是一定比顺序查找快:比如第一个就是查找目标,只是平均起来更好

分块查找(索引查找)

1.算法


块内是随便放的,索引表是按顺序排放的,进了分块就挨个查找




折半查找查索引,要修改条件,low>high就在low所指分块里查找(因为索引里存的都是块里的最大值,多半都是对不上的)

如果low超出索引范围就失败

2.查找效率


里面bs=n,然后s=ns= \sqrt{n}s=n​,这个是用导数算的,不过也很好想,就是组数和组内元素数目一样,这个时候查找次数最少


分开算就行了

小结



动态查找表这样,方便修改

B树

1.概念


点点看成区间,分叉=关键字+1,最下面的失败结点也是一些区间

B树里的关键字是不会重复的

2.特点


m叉查找树中,规定对于任何⼀个结点,其所有⼦树的⾼度都要相同。


每个结点最多m棵子树,m-1个关键字

根结点可以只有两个子树(不是所有都得满足那个)

所有的叶子结点都是空的,看作失败结点

3.B树的最大、最小高度

大部分学校算B树的高度不包括叶子结点(失败结点)

算出最多结点数,然后每个结点里最多m-1个关键字


n个关键字把数域分为n+1个区间,因为关键字在B树里不重复,分成n+1个区间则有n+1个叶子结点。然后另一方面用每一层都最少的分叉点算出最后一层的叶子结点(最小的情况),这个肯定比n+1是小的,以此算出h的最大值

另一个求最大值的方法:得出最小结点数,再得到最少关键字数,这个数肯定<n

B树插入和删除

1.插入


超过上限了,就把结点裂开,中间的放到父结点那,左右连上这两个。(中间的作为父结点的第一个)


新元素只能插在最下面一层


满了之后又是把中间的弄到上一层(没有就新建,有就放进去)



还是把80弄到上面去,其他的老样子




继续分裂上去


注意几个点:
①分裂出去,结点里关键字个数要大于⌈m/2⌉-1
②插入一定在最底层
③分裂一直往上传,直到不能传为止

2.删除

①删除终端结点(未小于最小值)

也就是最底层

若被删除关键字在终端节点,则直接删除该关键字(要注意节点关键字个数是否低于下限 ⌈m/2⌉ − 1),如果低于最小值那么见②③的操作

②删除非终端结点


说白了就是转换成删掉终端结点

③兄弟够借(删除后小于最低值了)


删除后关键字不够了,找兄弟借


当兄弟富裕时(借了也不会小于最低值),借过去(前驱后驱都行)调整一波,符合B树的特性(排序)


④兄弟不够借

如果兄弟没钱的话,就和他还有上层管这两兄弟的关键字拿来合在一起,上层如果因此小于最低值了就继续这个操作(没钱了就把爸和兄弟一起坑了,哄堂大孝了)

小结

B+树


结点里的分支数和关键字个数是一样的

B+树里面是重复存的

也可以顺序查找,第一个那里有个指针可以遍历完所有叶子结点

每个结点里也是至少有 ⌈m/2⌉ 棵子树(关键字也是)



对比:B+树一定停在叶子结点(走到最下面),而B树有可能中间查到就结束了


小结

散列查找

1.处理冲突的方法

①拉链法


同义词存在链表里
找的时候找到位置,直接遍历链表


查找长度:对比关键字的次数(这链表都是空的,无需对比,所以是0)

也有学校把空的判定算作一次



最好的情况还是O(1),各自占一个(散列函数的冲突越少,查的越快)

②开放定址法


发生冲突就把后面空着的位置给霸占了(后面正主都会被逼走)

Ⅰ.线性探测法


发生冲突就一直往后查,找到空位为止

原住民84,被20占了个位,一样得往后找(也算冲突)

哈希函数值域[0,12],冲突处理函数值域[0,15],留了几个位置处理冲突



空位置的比较也算一次


遇到空位置就失败(或者出范围),因为这表示没装这个数据进来


删的时候要做个标记,不然直接删成空的按上面查找的方法,遇到空的就等于查找失败,就坏了



查找效率具体计算,按里面的看着算


先找0——1次,然后都是要出范围才失败(具体问题具体分析)

线性探测法很容易造成同义词、⾮同义词的“聚集(堆积)”现象,严重影响查找效率(堆在一起导致本来在那的也要往后查才能找到)

Ⅱ.平方定址法


第一次冲突+1,然后-1(都是以原点参照),然后+4,-4……+k2,-k2,k≤m/2

就是往后往前移,不过要注意这个因为取模所以是一个环形(前后接着的)

好处:不容易堆在一起

非重点小坑:散列表长度m必须是⼀个可以表示成4j + 3的素数,才能探测到所有位置

Ⅲ.伪随机序列法


随便给的一个序列

③再散列法


再散列法就是用一个函数算出来冲突就直接换一个函数重算

每次冲突都要重算,计算时间增加

2.常见的散列函数

①除留余数法


用质数取模,分布的更均匀,冲突更少(因为全是偶数,那么余数不可能为奇数,但是取质数就可以使均匀分布)


如果一个一个的来,那么取8反而更均匀,当然这只是个特例

散列函数的设计要结合实际的关键字分布特点来考虑,不要教条化

②直接定址法


直接用一个线性的函数来,关键字必须是连续的不然会浪费很多空间

③数字分析法


适合已知的关键字集合,这样可以专门选几位均匀的位数来作为散列地址

④平方取中法



散列查找是典型的“⽤空间换时间”的算法,只要散列函数设计的合理,则散列表越⻓,冲突的概率越低。(直接一对一,就是长了点)

小结

数据结构第七章:查找相关推荐

  1. 王道408数据结构——第七章 查找

    文章目录 一.基本概念 二.顺序查找(线性查找) 一般线性表的顺序查找 有序表的顺序查找 二.折半查找(二分查找) 三.分块查找(索引顺序查找) 四.B树 五.B+树 六.散列表 构造散列函数 1. ...

  2. (王道408考研数据结构)第七章查找-第三节:B树(基本概念及其操作)

    文章目录 一:B树的基本概念 (1)B树 (2)B树(假设 m m m阶)特点及效率 二:B树操作 (1)插入 (2)查找 (3)删除 一:B树的基本概念 (1)B树 B树(B-tree)

  3. (王道408考研数据结构)第七章查找-第二节3:分块查找

    文章目录 一:分块查找基本思想 二:注意问题 三:效率分析 一:分块查找基本思想 分块查找:我们可以对数据集进行分块,使其分块有序,然后再对每一块建立一个索引项.分块有序具体是指 块内无序: 也即块内 ...

  4. (王道408考研数据结构)第七章查找-第二节2:二分查找及其判定树

    文章目录 一:二分查找法基本思想 二:二分查找法代码 三:二分查找法效率分析 三:二分查找判定树的构造 (1)规律 (2)构造 (3)特点 (4)时间复杂度 一:二分查找法基本思想 二分查找法(Bin ...

  5. (王道408考研数据结构)第七章查找-第二节1:顺序查找及其优化

    文章目录 一:顺序查找基本思想 二:效率分析 三:顺序查找优化(针对查找表为有序表) 四:顺序查找优化(针对查找概率不相等) 一:顺序查找基本思想 顺序查找(Sequential Search):又叫 ...

  6. (王道408考研数据结构)第七章查找-第一节:查找的基本概念、平均查找长度

    文章目录 一:查找的基本概念 (1)查找表和关键字 (2)查找的概念 二:静态查找表和动态查找表 三:查找算法评价指标--平均查找长度 一:查找的基本概念 (1)查找表和关键字 查找表(Search ...

  7. (王道408考研数据结构)第七章查找-第四节:哈希表(基本概念及其操作)

    文章目录 一:哈希表基本概念 (1)哈希表 (2)建立一个简单的哈希表(快速入门以及相关术语) (3)ASL计算 二:常见哈希函数 (1)直接定址法 ( 常 考 ) _{(常考)}

  8. 【数据结构总结】第七章 查找

    第七章 查找 提示:本文主要是以思维导图的形式概括数据结构第一章的精华内容,基本不会用到文字性的内容,目的是为了给大家梳理每个重要的知识点的相关概念,方便大家在复盘的时候快速阅读和浏览,加快记忆速度, ...

  9. 【数据结构】第七章 查找

    第七章 查找 目录 第七章 查找 7.1 基本概念 7.2 顺序查找和折半查找 一.顺序查找 二.折半查找 三.分块查找 7.3 树形查找 一.二叉排序树(BST) 定义 查找具体值的代码实现 插入 ...

  10. 《数据结构》-第七章 查找(知识点总结)

    第七章 查找 本章开始介绍关于前几章这些数据结构的相应的运算-查找.关于查找的不同算法为每年考试考查的重点,主要分为线性结构的查找.树形结构的查找.散列结构的查找及字符串模式匹配,同时分析各个查找方法 ...

最新文章

  1. 【Java源码分析】Vector源码分析
  2. 忘记Windows系统密码不用急 这个办法轻松帮你破解
  3. 记录一次cookie导致登录失败的惨案
  4. Android Theme
  5. python词云下载什么_python词云安装什么库
  6. lucene可用中文分词IKAnalyzer,maven pom下载代码及配置文件
  7. SpringCloud学习笔记008---杂七杂八002_spring 注解@Value详解_@Value(quot;#{}quot;)与@Value(quot;${}quot;)的区别
  8. 自学python能学成吗-自学Python能学会吗 零基础怎么学
  9. A股数据采集、策略制定
  10. JavaScriptjQuery.函数
  11. iPhone清理喇叭灰尘_手机喇叭用久了灰尘多,与其经常换手机,不如自己动手清理...
  12. 2021华为机考笔试题
  13. 城市信息化重要载体“无线城市”
  14. 古琴入门之基本指法(右手)一
  15. wangyi3-数据挖掘研究员
  16. CDR智能填充—图形颜色填充好帮手
  17. 一套完整的Android通用框架
  18. 2023中国矿业大学计算机考研信息汇总
  19. 25 Creative Ways to Promote Your App for Free
  20. TM1652控制-2

热门文章

  1. 虚拟机桥接网段与本机不一致
  2. AltiumDesigner那些让你效率翻倍的技巧汇总 (持续更新)
  3. 合肥工业大学计算机学院专业排名,2019合肥工业大学专业排名
  4. [浙大网新易盛] 程序员你12点前睡觉了吗?
  5. Spring--Bean的使用
  6. 基于java SSM框架的游戏商城系统
  7. 自考-数据结构、C++、信息系统开发
  8. idhttpserver接收数据
  9. Ardupilot 编译问题汇总
  10. ps怎样导出dw的html,Photoshop切图怎么导入dreamweaver?