KD树口胡 今天突发奇想想学一学kd树,于是就打开了一个博客这里,大概搞明白了KD树是个什么东西,然而并不会写。 前置知识 -线段树 -线段树套树 -平衡树 首先我们考虑线段树是什么状况。 线段树是通过对所有需要元素在某一个维度上进行分治。 这样我们便获得了一个较为和谐的 O(log(n)) 级别的查询结构。 那么如何将这个优美的数据结构拓展到多维呢? 显然树套树可以解决这种问题。 一个简单的理解就是在维护的序列上每个节点挂了一个另一个维度的序列。 这样可以实现 O(log2(n)) 级别的查询。 little problem 显然线段树(维护序列的版本)需要的空间是 O(kn) 的(k是个常数)。 怎么优化这玩意呢? 平衡树。 实际上应该是二叉搜索树,然而可能被卡成 (O(n2)) ,因此默认平衡树==二叉搜索树 这种方法的思想就是利用每个实际存在的节点顺便完成线段树完成的对值域二分的操作。 考虑另一种二维线段树(平面树?)。 这个版本的二维线段树就比较类似于kd树的思想了。 kd树就是把上面那个版本的区间换成类似于平衡树的节点就完事了。 完了。