当前位置: 首页 > news >正文

查找算法复习

先序

在了解查找算法之前,需要熟悉几个概念,不然后面容易产生理解错误。

查找表:即被查找的对象,通常由几个关键字组成。

关键字:就是数据项、字段的意思。关键字有主次之分,其中主关键字取值是唯一的。

查找长度:给定的关键字在查找表中的比较次数。(查找就是拿要找的数在对应的字段中一个个比较)

静态、动态查找:静态查找只执行查找操作(判断有无和位置在哪),不改变数据;动态查找除了查找还会改变数据。

一、顺序查找(静态查找)

原理:极其简单,就是拿给定值和对应的关键字中的所有数按照指定顺序(从前到后等)一个个比较知道找到或比较完所有值。

考点:顺序查找包括不带监视哨和带监视哨两种类型

不带监视哨的顺序查找

def SeqSearch(self, key):iPos = 0    # 数据元素在查找表中的位置,从第一个开始while iPos < self.length and self.data[iPos] != key:    iPos += 1    # 只要没找到就往后加1return (iPos if iPos < self.length else -1)    # 找到了返回对应位置;没找到返回-1

上述代码中我们需要判断iPos < self.length,即防止越界。为了提高效率,可以把查找表的第一个元素作为监视哨。

带监视哨的顺序查找

def SeqSearch(self, key):self.data[0].key = key    # 将第一个元素作为监视哨iPos = self.length - 1    # 从最后一个数据开始比较while self.data[iPos].key != key:iPos -= 1    # 没找到往前加而不是减一,就不可能越界,也就不用判断。return iPos if iPos > 0 else -1

二、折半查找(静态查找)

条件:折半查找要求查找表必须是有序的

过程:

  1. 首先确定查找范围(左边low, 右边high,两者差大于等于0就有范围),若范围为空则查找失败

  1. 若范围不为空,则在查找范围的中间位置比较,若相同则查找成功

  1. 若小于中间数,则在中间数左边部分(low不变,high为中间位置减一)继续按照上述步骤查找(确定查找范围,比较中间数)

  1. 若大于中间数,则在中间数右边部分(high不变,low为中间位置加一)继续按照上述步骤查找(确定查找范围,比较中间数)

三、二叉排序树(动态查找)

  • 二叉排序树的概念:

它要么是空树,要么是满足以下性质的二叉树:

① 若根结点的左子树非空,则左子树中所有结点的值都小于根结点的值。

② 若根结点的右子树非空,则右子树中所有结点的值都大于根结点的值。

③ 根结点的左、右子树均是一棵二叉排序树。

  • 二叉排序树的创建:采用插入算法。很简单,根据给定的顺序,第一个被插入的作为根节点,后面插入的与根节点比较按照其性质放置在左右子树中。

例:关键字{11,12,8,5,10,15}

关键字{5,12,8,11,10,15}

  • 二叉排序树的查找:类似于折半查找,从根节点开始比较,然后往左右子树的根节点比较,就类似与折半查找比较中间位置。

  • 二叉树删除关键字:

分三种情况,被删除的节点为叶子结点、只有左子树或者右子树、左右子树都有。

前两种很简单,第一种直接删了,其双亲的指针域改成空;第二种让双亲指针指向下一个根节点即可

第三种提一下,有两种办法,下图的是其中一种,即找到要被删除的节点的左子树中最大的节点。然后把该删除的节点删掉用左子树的最大的节点补充即可。

当然还有第二种办法,就是找到右子树中最小的节点然后把该删除的删除,用右子树最小的节点代替即可。

四、平衡二叉树、B-树的概念(动态查找)

平衡二叉树:二叉树查找中二叉树的高度越小平均查找长度就会越小,所以平衡二叉树就是使得二叉树的深度尽可能的小并满足原来二叉树性质的特殊的二叉树。别名AVL树

平衡二叉树的性质:每个节点的左右子树的深度之差的绝对值小于等于1(-1,0,1)

B-树:解决数据元素太大查找效率低下的问题。

http://www.lryc.cn/news/14421.html

相关文章:

  • 腾讯前端必会面试题(必备)
  • 探访上汽通用武汉奥特能超级工厂
  • 【Linux】线程函数和线程同步详细整理(金针菇般细)
  • Python学习笔记6:抽象
  • 自己手写一个redux
  • mysql调优参数
  • JavaEE简单示例——再插入的同时获取插入的主键列
  • sql语句练习
  • 广州蓝景—结合chatGPT下的教育模式变化
  • 大数据框架之Hadoop:MapReduce(三)MapReduce框架原理——shuffle机制
  • 4|无线传感器网络与应用|无线传感器网络原理及方法-许毅版|第3章:无线传感器网络通信-3.1协议结构 3.2物理层|青岛科技大学|课堂笔记
  • 关机时,如何控制systemd服务的关闭顺序
  • 关于MySQL镜像构建过程中添加自动初始化数据库
  • CS144-Lab2
  • Linux内核驱动之efi-rtc
  • Java 字符串
  • 麦克风阵列波束基本概念理解
  • JAVA保姆式JDBC数据库免费教程之02-连接池技术
  • 视频片段怎么做成gif图?快试试这2种方法
  • 2.20计算机如何工作
  • [golang gin框架] 5.Cookie以及Session
  • 【牛客刷题专栏】0x0B:JZ3 数组中重复的数字(C语言编程题)
  • js中的隐式类型转换有哪些
  • WuThreat身份安全云-TVD每日漏洞情报-2023-02-17
  • 掌握MySQL分库分表(三)水平分库分表常见策略range、hash
  • CTFer成长之路之CTF中的SQL注入
  • python snap7读写PLC
  • 使用物联网进行智能能源管理的10大优势
  • 工业4.0和工业物联网如何协同工作
  • Python机器学习入门笔记(3)—— 线性回归