"KDTree" (数据结构)

"KDTree"

表示实数坐标组的 k-d 树二进制空间分割.

更多信息

  • A k-d 树在维度 时可高效分割 n 个坐标的坐标组,这样可以快速进行搜索,如最近邻搜索. 每个节点有两个数据元素,索引参数为 0 和 1. 数据元素既可以是另一个 k-d 树节点或点索引参数的列表 {i1,i2,} 其中 0<ik<=n. 每个数据元素都有唯一的机器整数 ID.
  • CreateDataStructure["KDTree",coordinates]coordinates 中创建一个都可由实数表示的新 "KDTree".
    CreateDataStructure["KDTree",coordinates, n]coordinates 中创建一个每个分支中至多有 n 个条目的新 "KDTree".
    Typed[x,"KDTree"]赋予 x 类型 "KDTree".
  • 对于类型 "KDTree" 的数据结构 ds 而言,可使用下列运算:
  • ds["DataBounds"]返回坐标的总体边界时间:O(1)
    ds["DataCoordinates"]返回坐标时间:O(1)
    ds["Graphics"]在二维空间中显示坐标的空间分割时间:O(n)
    ds["ID"]返回 ds 的 ID时间:O(1)
    ds["ID", b]返回 dsb(0 或 1)数据元素的 ID时间:O(1)
    ds["Indexes",b]返回 dsb(0 或 1)叶片数据元素表示的边框内包含的坐标索引时间:O(1)
    ds["LeafQ", b]dsb(0 或 1)数据元素为叶片则返回 True时间:O(1)
    ds["Node",b]dsb(0 或 1)节点数据元素返回 "KDTree"时间:O(1)
    ds["SplitDimension"]ds 的空间分割返回维度时间:O(1)
    ds["SplitPosition"]ds 的空间分割返回位置时间:O(1)
    ds["SubtreeIndexes",sd]返回 ds 表示的子树中的所有坐标索引时间:O(n)
    ds["SubtreeLength"]ds 表示的子树包围的坐标数量时间:O(n)
    ds["TreeSize"]返回数据元素的数量时间:O(1)
    ds["Visualization"]返回 ds 的可视化表示时间:O(n)

范例

打开所有单元关闭所有单元

基本范例  (1)

可用 CreateDataStructure 创建一个新的 "KDTree" 对象:

为二维数据显示图形:

检验 0 和 1 数据元素中是否有叶片:

获取 1-数据元素叶片中包含的点,并在图形中以红色点的形式高亮:

获取 0-数据元素表示的 k-d 树:

不包括在子树中的坐标的部分在图形中以粉色表示:

可视化 k-d 树的树结构:

获取 k-d 树的分割维度和位置:

获取 k-d 树的 1-元素数据的坐标索引:

检验坐标是否都位于分割维度中分割位置之上:

获取 1-元素子树 k-d 树的所有坐标索引,并检查它们是否都位于分割位置之下:

范围  (3)

信息  (1)

可使用 CreateDataStructure 创建新的 "KDTree"

数据结构 ds 的信息:

叶片尺寸  (1)

每个可在 CreateDataStructure 中可指定为附加参数的箱中有至多给定数量的坐标之前,分支会继续计算:

将坐标数量限制在至多 5 个:

默认设置是在构建与叶片上的遍历成本和运算成本之间选择一个平衡点:

任意精度  (1)

如果赋予坐标的精度大于 MachinePrecision 位数,那么计算会在合适的精度下进行:

应用  (2)

最近邻搜索  (1)

设置程序使用 "KDTree" 数据结构寻找离给定点最近的坐标组中的元素:

在每个节点处,处理该点所在或离第一个点最近的一边:

对于叶片数据元素,检验所有点;对于节点数据元素,则递归:

在三维空间中用一百万个坐标的坐标组测试函数:

对比由 Nearest 返回的结果:

与仅计算所有点的 Norm 的用时进行比较:

k-d 树的构建会比单次扫描更耗时,但如果在需要多次搜索的情况下这个时间是值得的:

范围搜索  (1)

设置一个程序,其会使用 "KDTree" 对象在给定范围内寻找坐标组中所有元素:

在每个节点上,处理匹配每个节点分割维度范围的边:

对于叶片数据元素,检验包含的所有点;对于节点数据元素,则递归:

我们精选了一些属性,下面是所有这些属性都已知的国家的数据集:

获取相应数字数据,并根据它创建 "KDTree" 数据结构:

查找人口低于一百万但 GDP 高于 100 亿美元的国家:

查找人口高于一千万且面积小于十万 km2 的国家: