【基础不牢,地动山摇】K-D树

为什么在这里介绍最为基础的数据结构“树”呢?
因为在最近邻算法中树有很重要的作用。首先回顾一下二叉树:

二叉树

二叉树是每个结点最多有两个子树的树结构。通常子树被称作“左子树”和“右子树”。二叉树常被用于实现二叉查找树和二叉堆。一张图快速理解二叉树:
[图片上传失败...(image-d630b-1563793502634)]
二叉树的搜索和构造就不再这里介绍了,大家可以参考这篇文章。link

K-D树

为什么在上一节介绍二叉树?因为K-D树是每个节点都为k维点的二叉树。是一种对K维空间内的实例点进行存储,以便对其进行快速的搜索的方法。构造K-D 树相当于不断的用垂直与座标轴的超平面将K维空间切分。K-D树的每个节点对应一个K维超矩形区域。很拗口?来个例子吧

例子

一个二维数据集

  • (1)选择轴的6个数据点2,4,5,7,8,9的中位数7,分为两个矩形。(这里需要看下源代码,理解下这里的中位数)
point_list.sort(key=itemgetter(axis))
median = len(point_list) // 2 # choose median
location=point_list[median]
  • (2)左矩形以轴4分为两个子矩形,右矩形以分为两个子矩形。
  • (3)递归哈划分,直到完成。

在这里插入图片描述

如何构造KD树?
具体的算法流程如下所是:
输入: K维空间的数据集
输出: KD树

  • 构造根节点,根节点对应与包含的K维空间的超矩形区域。以的中位数且分为两个矩形区域,
  • 重复切分步骤
  • 直到两个子区域没有且分点为止。

K-D树搜索

输入: KD树,目标点
输出: KD树

  • 在KD树中找到包含目标点的叶节点。从根节点出发,递归的向下访问KD树。若目标点x维当前的坐标小于切分的的坐标,则移动到左节点,否则到右节点。
  • 以此节点为当前的最近点。
  • 递归的向上回退。

你可能感兴趣的:(【基础不牢,地动山摇】K-D树)