CS61B - Lec 27 - kd Tree


之前学习的数据结构都是一维的,当要处理二维或更高维的问题时,比如图像视频,就会需要存储多维的数据结构。

Multi-dimensional Data

首先看问题:有多少黄点是在绿框之中呢?离马最近的黄点是哪个?
在这里插入图片描述
应用之前所学的一维数据结构是这样解决的,建一个HashTable(或者数组我感觉就行了?),存储所有的黄点对象,对象的变量包括xPos和yPos(当然需要重写HashCode方法),然后遍历HashTable,找到有多少个黄点对象在绿框中/离马最近的黄点对象。需要的复杂度是O(N)。

Uniform Partitioning

第一个减少查找复杂度的方法是,将区域均匀划分为n个网格。只查找相关网格中的对象。然而这样做,当点是均匀随机分布在平面内,查找一个网格需要的复杂度仍然是O(N)。
在这里插入图片描述

QuadTrees

一个点相对于另一个点只有四种相对方向:左上,右上,左下,右下(边界可以自行选择归到哪类)。因此可以建一个四个分支的树形结构,就可以表示某两个节点的相对方向。
在这里插入图片描述

Higher Dimensional Data

但是当比较的维度再升高,QuadTree的分支就会呈指数上升,这不太好。因此最常见的解决办法还是k-d Tree(k-Dimensional Tree)。

这里k-d Tree的构造方法是这样的:最开始的A将平面按x轴方向分成两部分,然后左边添加E,右边添加D。然后插入C,这时候B变成了y轴方向划分平面(x, y划分是间隔的),C在B之上,插入B右边,后面D, F依次插入。
在这里插入图片描述
这是一种简单的插入方式,实际应用中,每一步得计算数据的方差,判断在什么方向上划分空间。

可以这么实现nearest方法:
在这里插入图片描述

发布了20 篇原创文章 · 获赞 0 · 访问量 170

猜你喜欢

转载自blog.csdn.net/fourier_transformer/article/details/105557971