IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> kd-tree(KDT) 时间复杂度证明 -> 正文阅读

[数据结构与算法]kd-tree(KDT) 时间复杂度证明

前言

如果有错欢迎指出 qwq

本文前置知识:主定理



kd-tree(KDT) 时间复杂度证明

kd-tree 是一种可以高效处理 k k k 维空间的数据结构

在算法竞赛类的题目中一般有 k = 2 k=2 k=2

还有个比较有趣的结论,当 k = 1 k=1 k=1 时其实它就是一棵线段树

下文中的 n n n 为kd-tree中的结点数量, k k k 为kd-tree的维度


一、建树

一般建树有三种

  1. 随机划分(玄学)
  2. 轮换划分:每个维度轮着划分
  3. 方差划分:优先划分方差较大的维度

我可不想分析玄学的划分

1. 轮换划分

显然有递推式 T ( n ) = 2 T ( n / 2 ) + O ( n ) T(n) = 2T(n/2) + O(n) T(n)=2T(n/2)+O(n)

根据主定理,有 a = 2 , b = 2 , log ? b a = 1 , f ( n ) = O ( n ) a=2,b=2,\log_b{a}=1,f(n)=O(n) a=2,b=2,logb?a=1,f(n)=O(n)

∵ ? ? ≥ 0 \because \exist \epsilon \ge 0 ??0 使得 f ( n ) = Θ ( n log ? b a log ? ? n ) f(n) = \Theta(n^{\log_b{a}}\log^{\epsilon}n) f(n)=Θ(nlogb?alog?n) ,此时 ? = 0 \epsilon = 0 ?=0

∴ T ( n ) = Θ ( n log ? n ) \therefore T(n) = \Theta(n\log n) T(n)=Θ(nlogn)

2. 方差划分

注意到 T ( n ) = 2 T ( n / 2 ) + O ( k n ) T(n) = 2T(n/2) + O(kn) T(n)=2T(n/2)+O(kn)

因此时间复杂度为 T ( n ) = Θ ( n k log ? n ) T(n) = \Theta(nk\log n) T(n)=Θ(nklogn)

一般在算法竞赛中,由于 k k k 很小(一般 k = 2 k=2 k=2 ),因此有

T ( n ) = Θ ( n log ? n ) T(n) = \Theta(n\log n) T(n)=Θ(nlogn)

本划分方法能较好保证树高,且不易被卡


二、插入&删除

一般采用替罪羊树的插入&删除操作

利用重构子树的方式维持平衡

均摊复杂度为 O ( log ? n ) O(\log n) O(logn)

证明可以去看替罪羊树的,这里先留个坑以后补上


三、Range Query

个人感觉算kd-tree的核心操作吧

支持将一个超长方体区域内的点划分为 O ( n ) O(\sqrt{n}) O(n ?) 个点所管辖的区域

R R R 为待查询的超长方体,则对于树上结点所管辖的超长方体分类,存在以下三种情况

  1. R R R 的交集为空

  2. 全部包含于 R R R

  3. R R R 有交集且不包含于 R R R

算法在查询过程中,碰到第1,2类点不会继续递归其子树

因此算法的时间复杂度就与第3类点的数量有关

我们以轮换划分来分析,则在相邻的 k k k 轮中,分别对每一维进行了划分

显然会产生 2 k 2^k 2k 个部分,每个部分的大小均为原来的 1 2 k \dfrac{1}{2^k} 2k1?

由于一个用于划分的超平面至多跨越 2 k ? 1 2^{k-1} 2k?1 个部分(可以由归纳法证明,此处略)

则有 T ( n ) = 2 k ? 1 T ( n / 2 k ) + O ( 1 ) T(n) = 2^{k-1}T(n/2^k)+O(1) T(n)=2k?1T(n/2k)+O(1)

根据主定理,有 a = 2 k ? 1 , b = 2 k , log ? b a = k ? 1 k , f ( n ) = O ( 1 ) a=2^{k-1},b=2^k,\log_b{a} = \dfrac{k-1}{k},f(n)=O(1) a=2k?1,b=2k,logb?a=kk?1?,f(n)=O(1)

∵ ? ? > 0 \because \exist \epsilon > 0 ??>0 使得 f ( n ) = O ( n log ? b a ? ? ) f(n) = O(n^{\log_b{a}-\epsilon}) f(n)=O(nlogb?a??) ,此时 ? = k ? 1 k \epsilon = \dfrac{k-1}{k} ?=kk?1?

∴ T ( n ) = Θ ( n 1 ? 1 k ) \therefore T(n) = \Theta\left(n^{1-\frac{1}{k}}\right) T(n)=Θ(n1?k1?)

k = 2 k=2 k=2 时, T ( n ) = Θ ( n ) T(n) = \Theta(\sqrt{n}) T(n)=Θ(n ?)


总结

本文简单分析了一下kd-tree的时间复杂度

参考文献

[1] KDT小记

转载请说明出处

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-03-04 15:50:05  更:2022-03-04 15:53:07 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 16:50:25-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码