二叉树进阶:二叉搜索树、平衡二叉树、KD树(实现KNN算法的快速寻找k个邻居)

news/2024/10/8 0:29:06

二叉搜索树

二叉搜索树又称为二叉排序树、二叉查找树。请记住,本篇所介绍的所有树,都是二叉搜索树,也就是说都用到了二分查找的思想。

  • 二叉搜索树的特征:每个结点的左结点都小于结点本身,右结点都大于结点本身。用中序遍历来遍历一棵二叉搜索树,结果必然是有序的。
  • 时间复杂度很低
    查找元素:二分查找,O(logN)。当树形状退化为链表时,时间复杂度增加到O(N)
    增加元素:二分查找,直到找到一个位置时空,O(logN)。同样受到树的形状影响。
    删除元素:
    1. 删除叶子节点:找到并删除即可
    2. 删除只有左子树或者右子树的结点:直接把子树放到被删除节点的原本位置
    3. 删除既有左子树又有右子树的结点:先删除左子树的最大值或者右子树的最小值,并放到原本要被删除节点的位置

平衡二叉树(AVL)

定义:左子树的高度和右子树的高度的差不超过1的二叉查找树
作用:避免退化为链表
原理:对于每个新加入的结点计算平衡因子:左子树高度减右子树高度。平衡因子只可以是-1、0或1,否则会需要旋转调整。旋转的作用是调整树的形状,让树变得平衡。
具体旋转操作:分为左旋和右旋,旋转前后的中序遍历结果相同(等价,只有树高度变化)。旋转的具体过程较为复杂,不便演示,可以去网上寻找动画资料学习。这里给出一个网址链接:平衡二叉树(AVL树)

KD树

简介:所谓KD树,其实就是数据特征有K维的平衡二叉树。我们都知道二叉搜索树的一个特点是查找速度快,但是只有当节点数据是一维数据的时候二叉搜索树才可以进行查找。如果将数据规模扩展到多维的时候,我们就需要KD树(k-dimension)来帮助我们实现快速查找了。KD树的本质是多维下的二分查找,依次对每一维都采用二分查找的方式,试图去找到一个总体来说距离较近的点。

典型用途:在实现KNN算法时,我们会需要找到与某个点距离最近的N个点,通常我们的样本特征维度都会大于1,此时就可以使用KD树算法。当数据维度不超过20时,KD树的效率会显著高于暴力搜索。

以2D树为例(这是我自己取的名字):如果我们的数据是二维的,在一个平面上,我们的数据以点状分布,此时使用2D树,可以快速找到与我们相邻最近的N个点。

  • 用已有的训练数据构建KD树:对于我们已经有的数据,我们首先要构建一棵KD树。

    • 步骤一:如图所示,二维平面上有数个点,每个点有2个维度的特征。我们的做法是先确定一个坐标轴(例:x轴),根据对应的坐标(x坐标),在所有数据中找到一个中位点a(\(x_{0}\),\(y_{0}\))(图中为a(6.5,5)),利用其所在的垂直于该轴的直线x=\(x_{0}\)(图中为x=6.5)将平面划分为两块P左和P右。如果在多维空间中,这将会是一个超平面。这样,我们的数据就依据x坐标值被分为了两部分,即x小于\(x_{0}\)的数据点和x大于\(x_{0}\)的数据点。这个数据点a会被作为KD树的根结点。每个结点,需要保存四个信息:这个样本的特征向量、左节点、右节点以及它是依据哪个维度被选择为中位点的。x小于\(x_{0}\)的数据点被放入a点的左子树中,但是暂时没有进行构建。同理,x大于\(x_{0}\)的数据点被放入a点的右子树中。
    • 步骤二:选择样本数据的第二个特征维度,对于每个被分出来的块P左和P右,我们依据这个维度再一次进行划分。对于这个二维例子,就是依据y坐标的值进行划分。同样,我们可以把每个划分区域再次一分为二。
    • 步骤三:重复第二个步骤,不断遍历所有的特征维度,以此作为我们寻找中位数据的依据,直到每个块中只有不超过一个的数据点时,我么的2D树就构建好了。
  • 搜索KD树

  1. 寻找最近邻的点
    以KNN为例,如果我们想要找到最近的K个邻居点(KNN算法具体流程暂不讨论),我们可以先准备好一个容量为k的列表,用来保存最近的k个邻居。然后从根节点开始,依次将当前节点切分维度的特征值与目标样本相同维度的特征值进行比较。例如:对于根节点,切分维度为第一个维度,即x值。如果目标点为s(1,8),显然s的x坐标1小于根节点的x坐标6.5,所以我们可以进入到x=6.5这条直线的左侧继续进行下一轮寻找。
    第二轮,我们找到根节点的左孩子结点,此时我们应该按照第二个维度进行比较了,因为这个节点的切分维度为y轴。显然 \(y_{s}\)=8要大于第二个结点(在坐标轴上即为位于切分线上的点)的y坐标-3,所以我们从y=-3这条切分线上方继续去寻找,重复这个过程,直至找到一个叶子节点,即某一块中只有一个数据位置。这个数据,我们就放入k列表中,作为找到的第一个邻居(临时)。同时,我们标记这个点为已经访问过。
  2. 进行回溯
    回溯过程又有一大堆可以写,分到下一篇再补充了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/28177.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

岩土工程监测中振弦采集仪的布设方案及实施步骤简析

岩土工程监测中振弦采集仪的布设方案及实施步骤简析 岩土工程监测中,河北稳控科技振弦采集仪是一种常用的地下水位和土层压缩性监测工具。它通过采集振弦的振动信号来确定地下水位和土层的压缩性,为岩土工程的设计、施工和监测提供重要的数据支持。下面将对振弦采集仪的布设方…

活动回放 | 如何进行全增量一体的异构数据库实时同步

如何在不影响并保持现有业务系统正常运转的前提下,实现数据向新业务系统的持续同步,并保障异构数据同步的完整性、准确性、一致性、时效性。以 AI 领域为代表的新技术不断涌现,新的应用风口也逐渐清晰。为了加紧跟上技术发展的步伐,越来越多的企业开始着手,对仍以传统关系…

(前++) 和 (后++)的练习题

打印也是一种运算,因此是先打印出5,再-1。每天进步一点点,快乐生活多一点。

关于聊天机器人的阅读笔记

目录智能对话机器人的类型知识问答机器人任务型对话机器人闲聊机器人混合机器人 智能对话机器人的类型 知识问答机器人 主要应用场景包括智能客服、政务咨询、知识获取等 其主要实现方式是预定义大量的问题和答案存储在知识库中,当用户发送问题时,该程序会对该问题和知识库的…

问题管理员的工作角色、职责和技能

问题管理就是识别、分析和解决反复出现的根本原因问题并永久修复它们。听起来很简单对吧,不幸的是,情况并非总是如此。对于组织来说,IT问题管理一直是一门棘手的 ITSM 学科。一个经常被忽视的关键因素是有效的问题 管理不仅仅是工具和流程。 它需要熟练的人来带路 问题管理员…

BOSHIDA AC/DC电源模块的高效能源管理与效率优化

BOSHIDA AC/DC电源模块的高效能源管理与效率优化 AC/DC电源模块是一种常见的电源转换装置,用于将交流电转换为直流电。它被广泛应用于各种电子设备中,如计算机、通信设备、工业自动化设备等。在现代化的科技社会中,高效能源管理和效率优化变得越来越重要。本文将探讨如何在A…

Unity计时器(全)

Unity计时器游戏中有非常多的计时功能,比如:各种cd,以及需要延时调用的方法; 一般实现有一下几种方式: 1.手动计时float persistTime = 10f float startTime = Time.time; if(Time.time - startTime > persistTime) {Debug.Log("计时结束"); }float curTime = …

是面试官放水,还是公司实在是太缺人?这都没挂,华为原来这么容易进...

华为是大企业,是不是很难进去啊?” “在华为做软件测试,能得到很好的发展吗? 一进去就有9.5K,其实也没有想的那么难” 直到现在,心情都还是无比激动! 本人211非科班,之前在字节和腾讯实习过,这次其实没抱着什么特别大的希望投递,没想到华为可以再给我一次机会,还是挺…