OSDN Git Service

Update k-dtree.md
author雷蒻 <34390285+hsfzLZH1@users.noreply.github.com>
Sun, 28 Jul 2019 06:11:24 +0000 (14:11 +0800)
committerGitHub <noreply@github.com>
Sun, 28 Jul 2019 06:11:24 +0000 (14:11 +0800)
docs/ds/k-dtree.md

index f841487..6ecefae 100644 (file)
@@ -1,9 +1,11 @@
 author: hsfzLZH1
 
-k-D Tree(k-Dimension Tree) 是一种可以 **高效处理 $k$ 维空间信息** 的数据结构。
+k-D Tree(KDT , k-Dimension Tree) 是一种可以 **高效处理 $k$ 维空间信息** 的数据结构。
 
 在结点数 $n$ 远大于 $2^k$ 时,应用 k-D Tree 的时间效率很好。
 
+在算法竞赛的题目中,一般有 $k=2$ 。在本页面分析时间复杂度时,将认为 $k$ 是常数。
+
 ## 建树
 
 k-D Tree 具有二叉搜索树的形态,二叉搜索树上的每个结点都对应 $k$ 维空间内的一个点。其每个子树中的点都在一个 $k$ 维的超长方体内,这个超长方体内的所有点也都在这个子树中。
@@ -31,3 +33,4 @@ k-D Tree 具有二叉搜索树的形态,二叉搜索树上的每个结点都
 我们来回顾一下快速排序的思想。每次我们选出一个数,将小于该数的置于该数的左边,大于该数的置于该数的右边,保证该数在排好序后正确的位置上,然后递归排序左侧和右侧的值。这样的期望复杂度是 $O(n\log_2 n)$ 的。但是由于 k-D Tree 只要求要中位数在排序后正确的位置上,所以我们只需要递归排序包含中位数的 **一侧** 。可以证明,这样的期望复杂度是 $O(n)$ 的。在 `algorithm` 库中,有一个实现相同功能的函数 `nth_element()` ,要找到 `s[l]` 和 `s[r]` 之间的值按照排序规则 `cmp` 排序后在 `s[mid]` 位置上的值,并保证 `s[mid]` 左边的值小于 `s[mid]` ,右边的值大于 `s[mid]` ,只需写 `nth_element(s+l,s+mid,s+r+1,cmp)` 。
 
 借助这种思想,构建 k-D Tree 时间复杂度是 $O(n\log_2 n)$ 的。
+