Kd-tree介绍和使用

news2024/12/27 1:44:52

GeoHash原理介绍以及在redis中的应用-CSDN博客 这边文章中介绍了GeoHash编码原理以及它的一个应用——利用GeoHash编码可以建立一个索引,从而实现快速的空间搜索。今天,我们介绍一个常见的数据结构Kd-Tree,利用它也可以快速实现多位数据的搜索(包括空间搜索)。

1、Kd-Tree基础知识

Kd-树是K-dimension tree的缩写,1975年,来自斯坦福大学的Jon Louis Bentley在ACM杂志上发表的一篇论文:Multidimensional Binary Search Trees Used for Associative Searching 中正式提出和阐述的了如下图形式的把空间划分为多个部分的k-d树。

1.1)KDTree介绍

在介绍Kd-tree的相关算法前,我们先回顾一下二叉查找树(Binary Search Tree,BST)的相关概念和算法。BST是具有如下性质的二叉树:

  1. 若它的左子树不为空,则左子树上所有结点的值均小于它的根结点的值;
  2. 若它的右子树不为空,则右子树上所有结点的值均大于它的根结点的值;
  3. 它的左、右子树也分别为二叉排序树;

例如,图1中是一棵二叉查找树,其满足BST的性质。

将一个1维数据集用一棵BST树存储后,当我们想要查询某个数据是否位于该数据集合中时,只需要将查询数据与结点值进行比较然后选择对应的子树继续往下查找即可,查找的平均时间复杂度为:O(logN),最坏的情况下是O(N)。

如果我们要处理的对象集合是一个K维空间中的数据集,那么是否也可以构建一棵类似于1维空间中的二叉查找树呢?答案是肯定的,只不过推广到K维空间后,创建二叉树和查询二叉树的算法会有一些相应的变化(后面会介绍到两者的区别),这就是下面我们要介绍的Kd-tree算法。

Kd-tree是对数据点在k维空间(如二维(x,y),三维(x,y,z),k维(x1,y,z..))中划分的一种数据结构,主要应用于多维空间关键数据的搜索(如:范围搜索和最近邻搜索)。一般来说,Kd-tree是BST的一种变体

1.2)创建Kd-tree的一些思考

对于Kd-tree这样一棵二叉树,我们首先需要确定怎样划分左子树和右子树,即一个K维数据是依据什么被划分到左子树或右子树的。

在构造1维BST树时,一个1维数据根据其与树的根结点和中间结点进行大小比较的结果来决定是划分到左子树还是右子树,同理,我们也可以按照这样的方式,将一个K维数据与Kd-tree的根结点和中间结点进行比较,只不过不是对K维数据进行整体的比较,而是选择某一个维度Di,然后比较两个K维数在该维度Di上的大小关系,即每次选择一个维度Di来对K维数据进行划分,相当于用一个垂直于该维度Di的超平面将K维数据空间一分为二,平面一边的所有K维数据在Di维度上的值小于平面另一边的所有K维数据对应维度上的值。也就是说,我们每选择一个维度进行如上的划分,就会将K维数据空间划分为两个部分,如果我们继续分别对这两个子K维空间进行如上的划分,又会得到新的子空间,对新的子空间又继续划分,重复以上过程直到每个子空间都不能再划分为止。以上就是构造Kd-Tree的过程,上述过程中涉及到两个重要的问题:

  1. 每次对子空间的划分时,怎样确定在哪个维度上进行划分;
  2. 在某个维度上进行划分时,怎样确保在这一维度上的划分得到的两个子集合的数量尽量相等,即左子树和右子树中的结点个数尽量相等。

1)问题1: 每次对子空间的划分时,怎样确定在哪个维度上进行划分?

最简单的方法就是轮着来,即如果这次选择了在第i维上进行数据划分,那下一次就在第j(j≠i)维上进行划分,例如:j = (i mod k) + 1。想象一下我们切豆腐时,先是竖着切一刀,切成两半后,再横着来一刀,就得到了很小的方块豆腐。

可是“轮着来”的方法是否可以很好地解决问题呢?再次想象一下,我们现在要切的是一根木条,按照“轮着来”的方法先是竖着切一刀,木条一分为二,干净利落,接下来就是再横着切一刀,这个时候就有点考验刀法了。因此,如果K维数据的分布像上面的豆腐一样,“轮着来”的切分方法是可以奏效,但是如果K维度上数据的分布像木条一样,“轮着来”就不好用了。因此,还需要想想其他的切法。

如果一个K维数据集合的分布像木条一样,那就是说明这K维数据在木条较长方向代表的维度上,这些数据的分布散得比较开,数学上来说,就是这些数据在该维度上的方差(invariance)比较大,换句话说,正因为这些数据在该维度上分散的比较开,我们就更容易在这个维度上将它们划分开,因此,这就引出了我们选择维度的另一种方法:最大方差法(max invarince),即每次我们选择维度进行划分时,都选择具有最大方差维度。

说明:从方差大的维度开始切分可以取得很好的切分效果及平衡性。

2)问题2:在某个维度上进行划分时,怎样确保在这一维度上的划分得到的两个子集合的数量尽量相等,即左子树和右子树中的结点个数尽量相等?

假设当前我们按照最大方差法选择了在维度i上进行K维数据集S的划分,此时我们需要在维度i上将K维数据集合S划分为两个子集合A和B,子集合A中的数据在维度i上的值都小于子集合B中。首先考虑最简单的划分法,即选择第一个数作为比较对象(即划分轴,pivot),S中剩余的其他所有K维数据都跟该pivot在维度i上进行比较,如果小于pivot则划A集合,大于则划入B集合。把A集合和B集合分别看做是左子树和右子树,那么我们在构造一个二叉树的时候,当然是希望它是一棵尽量平衡的树,即左右子树中的结点个数相差不大。而A集合和B集合中数据的个数显然跟pivot值有关,因为它们是跟pivot比较后才被划分到相应的集合中去的。好了,现在的问题就是确定pivot了。给定一个数组,怎样才能得到两个子数组,这两个数组包含的元素个数差不多且其中一个子数组中的元素值都小于另一个子数组呢?方法很简单,找到数组中的中值(即中位数,median),然后将数组中所有元素与中值进行比较,就可以得到上述两个子数组。同样,在维度i上进行划分时,pivot就选择该维度i上所有数据的中值,这样得到的两个子集合数据个数就基本相同了。

解决了上面两个重要的问题后,就得到了Kd-Tree的构造算法了。

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

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

相关文章

调用智谱AI,面试小助手Flask简单示例

文章目录 1.接入AI获取API密钥Python代码 2.小助手的实现流程3.Flask应用示例Python文件.pyindex.html运行Flask应用地址栏输入 http://localhost:5000/ 1.接入AI 获取API密钥 在智谱AI的官方网站上注册,右上角点击API密钥,新建并复制一个 API Key&…

掌握未来:产品经理学习AI大模型的重要性解析

前言 在AI大模型时代,技术的迅猛进步正在重塑各行各业的面貌。作为产品经理,我们不仅要紧跟时代步伐,更要深入探索与运用这一前沿技术。学习大模型等AI技术,不仅是为了理解其背后的工作原理和应用潜力,更是为了将智能…

天选思路怎能不会!小波变换+CNN完美融合,最新idea发了CV顶会!

今天给大家推荐一个涨点发顶会的好方向:小波变换CNN。这俩热点的结合可以轻松实现“11>2”的效果。 这是因为,一方面小波变换可以作为预处理步骤,提取出关键的局部特征,加速CNN收敛并提升性能;另一方面&am…

配置树莓派打开SSH服务

在树莓派终端中查看IP 在终端中输入命令来查看IP地址。最常用的命令是:hostname -I注意,这里的参数I是大写的,它表示查看本机上所有配置的IP地址(包括IPv4和IPv6,如果有的话)。如果你只需要查看IPv4地址&am…

Linux:磁盘管理

一、静态分区管理 静态的分区方法不可以动态的增加或减少分区的容量。 1、磁盘分区-fdisk 该命令是用于查看磁盘分区情况,和分区管理的命令 命令格式:fdisk [选项] 设备文件名常用命令: -h:查看分区信息 fdisk系统常用命令&…

19、网络安全合规复盘

数据来源:5.网络安全合规复盘_哔哩哔哩_bilibili

山大电力研发费用率远弱同行,先分红上亿再补流9000万?

《港湾商业观察》施子夫 8月9日,证监会网站披露深交所已向山东山大电力技术股份有限公司(以下简称,山大电力)发出第三轮审核问询函。据悉,2023年6月,山大电力递表深交所,保荐机构为兴业证券。 …

Linux中find命令详解

记录linux中find命令的详细用法。 文章目录 find命令简介基本语法常用选项-name-iname-type-size-mtime,-atime,-ctime-perm-user-group-delete-exec-printand or find --help find命令简介 find 是一个搜索目录树以查找一个文件或一组文件的程序。它遍历目录树并报告与用户规…

VMware虚拟机NAT模式配置

1、宿主机 2、宿主机网络适配器 VMnet8 ①要与虚拟机在同一网段 ②不能和宿主机同一网段 3、VMware 4、虚拟机

短视频剪辑工具有哪些?推荐4个简单好用的工具

短视频如今充斥着我们的生活,刷短视频已经成了很多人的生活必备。所以掌握短视频剪辑技能是一件很重要的事情,能够为视频创作者带来很多的流量。如果想要学习剪辑的话,可以先从选择一款合适的剪辑工具开始,这几款功能丰富的软件&a…

Google ads投广中的这些问题,看你中了没

谷歌广告是一个强大的工具,可以显著提升外贸独立站的流量和销售。但是,要想充分发挥其潜力,需要深入了解其工作原理,并掌握如何设定预算、选择关键词、创建广告文案等技巧。以下是一些在谷歌广告投放过程中网友遇到的一些问题及其…

基于ESP8266—AT指令连接阿里云+MQTT透传数据(1)

在阿里云创建MQTT产品的过程涉及几个关键步骤,主要包括注册阿里云账号、实名认证、开通MQTT服务实例、创建产品与设备等。以下是详细的步骤说明: 一、准备工作 访问阿里云官网,点击注册按钮,填写相关信息(如账号、密码、手机号等)完成注册。注册完成后,需要对账号进行实…

Solaris11.4配置远程桌面登录

Solaris11.4配置远程桌面登录 一. 版本信息 1. 内核版本信息 rootsolaris11:~# uname -a SunOS solaris11 5.11 11.4.27.82.1 sun4v sparc sun4v rootsolaris11:~# rootsolaris11:~# rootsolaris11:~# cat /etc/releaseOracle Solaris 11.4 SPARCCopyright (c) 1983, 2020, …

【EXCEL数据处理】000009 案列 EXCEL单元格数字格式。文本型数字格式和常规型数字格式的区别

前言:哈喽,大家好,今天给大家分享一篇文章!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 【EXCEL数据处理】000009 案列 EXCEL单元格数字格式。文本型数字格式和…

2024年国外优质API:情绪识别口碑佳

随着全球一体化进程的加速,跨语言沟通需求提升,进而催生出大量语种识别类型API服务。此类服务致力于协助使用者便捷且精确地辨识文本所属的语种,从而实现各类多语言文本处理、自动化翻译及文本解析等功能。 目前,市面上已出现多种…

麒麟服务器装完系统后删除backup以及swap分区的操作步骤

一、需求描述 将V10-SP3服务器的klas-backup、klas-swap两个lvm分区删除掉。 现场原来lvm结构如下: 二、注意事项 在缩减lvm前,必须做好数据备份。 三、操作步骤 1、执行vgs、lvs查看vg、lv [root@server-sp3 ~]# vgsVG #PV #LV #SN Attr VSize VFreeklas 1 3 …

微服务——服务保护

1.雪崩问题 级联失败或雪崩问题指的是在微服务架构中,由于服务间的相互依赖和调用,当一个服务出现故障时,会引起调用它的服务也出现故障,进而引发整个调用链路的多个服务都出现故障,最终导致整个系统崩溃的现象。 产生…

阿里巴巴国际站获取商品详情item_get接口技术分享

在跨境电商日益繁荣的今天,如何高效、准确地获取商品信息成为了商家们关注的焦点。阿里巴巴作为全球领先的B2B电商平台,其提供的item_get API接口成为了跨境电商获取商品信息的必备工具。本文将详细介绍item_get接口的功能、优势、应用场景以及返回数据字…

yolov5/v7/v8随机种子固定方法

参考:https://blog.csdn.net/qq_45062768/article/details/133852543 https://blog.csdn.net/qq_45062768/article/details/133204618 yolov7的 import pkg_resources as pkg def check_version(current0.0.0, minimum0.0.0, nameversion , pinnedFalse, hardFal…

Transformer算法7个面试常见问题

1.Transformer为何使用多头注意力机制?(为什么不使用一个头) 英文论文中是这么说的: Multi-head attention allows the model to jointly attend to information from different representation subspaces at different position…