当前课程知识点:计算几何 > 07. Geometric Range Search > D. kd-Tree: Algorithm > 07-D-01. Query
刚才我们已经学习了
如何来构造一棵kd树
那么接下来
我们就来看看
如何利用这种数据结构
高效的完成每一次range query
这里给出的就是kd树查找算法的
形式化描述
为了更好的理解这个算法
我们不妨来结合右边的
这样一个实例
可以看到
这里已经通过划分
构造出了一棵kd树
不难验证这棵kd树
总共有零到三
四层
相应的将整个这个空间
划分为叶子层次上的16个子区域
同时我们假设待查找的区间
范围是这个
回到这个算法
我们可以看到这个算法
是递归的
所以与所有的递归函数一样
首先我们要安全性检测
也就是来判断一下
我们的查找是否
已经抵达了终点叶子
如果是
那么我们没有任何的技巧可言了
只需要或者说必须
严格的来做一次判定
从而确定是否应该将这个点
报告出来
一般的情况呢
一般的情况下
我们不是在一个叶子节点
换而言之
这个节点所对应的那个区域里
所包含的点
至少有两个
甚至更多
在这个时候
我们或许可以施展一些技巧
比如我们可以首先来判断一下
当前这个节点的左孩子
所对应的那个区域
它是否严格地包含在我们
要查询的这个区间范围R之内
不要忘了
R在这里就是这个虚框
所表示的这样一个range
我们期望着什么呢
我们当然是期望
它的确是完全的包含在其中
如果真的能够包含在其中
就意味着我们在这个位置上
根本不需要进一步查找
比如说
这里的这个区域
就是这么样一个例子
当我们经过一定的查找以后
我们发现它
如果是作为某一个区间的
左孩子的那个区间
恰好完全的包含在
我们待查询的这个区间的范围之内
那就意味着这个区间
不管它有多大
不管它其中包含有多少个点
所有的内部的那些点
都应该是
我们查询这个问题的答案的一部分
在这种情况下
我们要做的事情
也非常的简单
只需要将这个区间中的所有的顶点
都悉数地报告出来就可以了
还记得怎么报告吗
没错
我们在这个时候
只要做一次遍历
通过一次遍历
我们只需要线性的时间
就可以将其中所有的点
都报告出来
然而很遗憾
不见得总是能够天遂人愿
很可能我们的查找区间
会是像这些柠檬色所代表的区间一样
是这样
这样这样或这样
它们都有什么特点呢
它们没有像这个区间那样
完全的落在这个R范围之内
而是与它若即若离
即和它有公共的部分
却没有完全的落在其中
这是比较讨厌的情况
因为在这种情况下
我们会发现这种区间中的所有的点
其实都是只有嫌疑
它有可能会落在最终的这个区间中
但是我们不能肯定
当然也不能否定
这种情况怎么办
没有更好的办法
我们只能够求助于
像刚才这里程序所写的那样
去做递归
我们要针对当前这个区域
并且以这个查询范围为对象
来再做一次递归的查找
感谢有递归
所以我们能做到这样
接下来对于原来那个
区间的右节点
也就是刚才那个区域的兄弟区域
我们也可以做类似的这个事情
整个这个句子完全是对称的
我们可以看到
如果它也是落在这个区间内部
我们就将这个区间内的所有的点
都通过一次遍历
打印出来
如果否则它也像刚才那样
是一个若即若离的区间
那么我们也不得不去做一次递归
就像这样
其他的呢
从形式上看
这个算法没有其他的东西
我们说这个算法
已经封闭了
然而如果你足够细心的话
你就会发现
似乎这里存在着一些问题
比如如果从软件工程的角度来看
这样一段代码
我们就会发现
其实它是不规范的
你能发现吗
没错
我们注意到这里有一个if
也有一个else if
但是恰恰没有一个else of else
按说在这个位置上
应该还有一个else
这个else哪去了
是的
从软件工程的角度来看
这的确是一个疏忽
甚至可以说是一个很大的疏忽
它往往是很多错误的隐藏的一个诱因
那么在这里
毕竟我们对这个算法
已经有足够的理解
我们会发现
至少从某种意义上来讲
这种省略还是合理的
还是说的过去的
我们看看为什么省略了
当然与其我们说为什么省略了
不如说它省略了什么
它省略的其实就是说
在else这种情况下
我们其实什么都不必做
没错
不必做
那么这个else of else
到底是什么呢
还是回到右侧的这个图
刚才我们讲过
这个if分支
所对应的其实就是这种
绿色的子区域
而else if
所对应的区域
就是这种柠檬色的区域
那么你很容易就可以理解
我们刚才所说的那个else of else
对应的区域
自然的就应该是这种浅色的
刚才没有覆盖的那种区域
这种区域是什么区域呢
我们会看到
它不仅没有包含在
我们待查询的这个范围之内
也与它没有任何的干系
准确的讲
它们是完全的
彻头彻尾的落在这个待查询区域的
外面的那些子区域
这些子区域中
不管它包含了多少个点
我们都可以从几何上看出
它们都不可能是
我们这次查询的答案的一部分
所以呢
所以我们应该将它们
完全的剪除掉
就像我们刚才那段程序里的
处理方法一样
什么都不用做
尽管从软件工程的角度来看
这种写法是值得推敲的
-Before we start
--html
-Evaluation
--html
-Online Judge
--html
-Lecture notes
--html
-Discussion
--html
-A. History of This Course
--00-A. History of This Course
-B. What's Computational Geometry
--00-B. What's Computational Geometry
-B. What's Computational Geometry--作业
-C. How to Learn CG Better
--00-C. How to Learn CG Better
-C. How to Learn CG Better--作业
-D. Why English
-A. Convexity
-A. Convexity--作业
-B. Extreme Points
-B. Extreme Points--作业
-C. Extreme Edges
-C. Extreme Edges--作业
-D. Incremental Construction
--01-D-01. Decrease and Conquer
--01-D-02. In-Convex-Polygon Test
--01-D-03. Why Not Binary Search
-D. Incremental Construction--作业
-E. Jarvis March
--01-E-06. Lowest-Then-Leftmost
-E. Jarvis March--作业
-F. Lower Bound
--01-F-02. CAO Chong's Methodology
-F. Lower Bound--作业
-G. Graham Scan: Algorithm
-G. Graham Scan: Algorithm--作业
-H. Graham Scan: Example
-H. Graham Scan: Example--作业
-I. Graham Scan: Correctness
-I. Graham Scan: Correctness--作业
-J. Graham Scan: Analysis
-J. Graham Scan: Analysis--作业
-K. Divide-And-Conquer (1)
-K. Divide-And-Conquer (1)--作业
-L. Divide-And-Conquer (2)
--01-L-03. Topmost + Bottommost ?
--01-L-07. More Considerations
-L. Divide-And-Conquer (2)--作业
-M. Wrap-Up
-0. Introduction
-0. Introduction--作业
-A. Preliminary
-A. Preliminary--作业
-B. Interval Intersection Detection
-B. Interval Intersection Detection--作业
-C. Segment Intersection Reporting
-C. Segment Intersection Reporting--作业
-D. BO Algorithm: Strategy
--02-D-01. Proximity & Separability
--02-D-02. Comparability & Ordering
-D. BO Algorithm: Strategy--作业
-E. BO Algorithm: Implementation
--02-E-03. Events & Operations
-E. BO Algorithm: Implementation--作业
-F. BO Algorithm: Analysis
--02-F-04. Complexity of Event Queue
--02-F-05. Complexity of Status Structure
-F. BO Algorithm: Analysis--作业
-G. Convex Polygon Intersection Detection
--02-G-01. Problem Specification
--02-G-02. Monotone Partitioning
--02-G-04. Decrease-And-Conquer
-G. Convex Polygon Intersection Detection--作业
-H. Edge Chasing
--02-H-01. Eliminating Sickles
-H. Edge Chasing--作业
-I. Plane Sweeping
-I. Plane Sweeping--作业
-J. Halfplane Intersection Construction
-J. Halfplane Intersection Construction--作业
-0. Methodology
-0. Methodology--作业
-A. Art Gallery Problem
--03-A-02. Lower & Upper Bounds
--03-A-04. Approximation & Classification
-A. Art Gallery Problem--作业
-B. Art Gallery Theorem
--03-B-01. Necessity of floor(n/3)
--03-B-02. Sufficiency by Fan Decomposition
-B. Art Gallery Theorem--作业
-C. Fisk's Proof
--03-C-04. Pigeon-Hole Principle
-C. Fisk's Proof--作业
-D. Orthogonal Polygons
--03-D-01. Necessity of floor(n/4)
--03-D-02. Sufficiency by Convex Quadrilateralization
-D. Orthogonal Polygons--作业
-E. Triangulation
-E. Triangulation--作业
-F. Triangulating Monotone Polygons
--03-F-02. Monotonicity Testing
--03-F-04. Stack-Chain Consistency
-F. Triangulating Monotone Polygons--作业
-G. Monotone Decomposition
-G. Monotone Decomposition--作业
-I. Tetrahedralization
--03-I-01. Polyhedron Decomposition
--03-I-02. Schonhardt's Polyhedron
-I. Tetrahedralization--作业
-A. Introduction
--04-A-02. Dining Halls on Campus
--04-A-03. More Analogies & Applications
-A. Introduction--作业
-B. Terminologies
--04-B-02. Intersecting Halfspaces
--04-B-04. Planar Voronoi Diagram
-B. Terminologies--作业
-C. Properties
--04-C-03. Nearest = Concyclic
--04-C-04. Number of Nearest Sites = Degree
-C. Properties--作业
-D. Complexity
-D. Complexity--作业
-E. Representation
-E. Representation--作业
-F. DCEL
-F. DCEL--作业
-G. Hardness
--04-G-03. Voronoi Diagram In General Position
-G. Hardness--作业
-H. Sorted Sets
--04-H-01. Convex Hull Made Easier
--04-H-02. Convex Hull As A Combinatorial Structure
--04-H-03. Voronoi Diagram As A Geometric Structure
-H. Sorted Sets--作业
-I. VD_sorted
--04-I-06. Sorting Not Made Easier
-I. VD_sorted--作业
-J. Naive Construction
-J. Naive Construction--作业
-K. Incremental Construction
-K. Incremental Construction--作业
-L. Divide-And-Conquer
--04-L-09. Intersecting with Cells
-L. Divide-And-Conquer--作业
-M. Plane-Sweep
--04-M-09. Circle Event: What, When & Where
-M. Plane-Sweep--作业
-A. Point Set Triangulation
-A. Point Set Triangulation--作业
-B. Delaunay Triangulation
-B. Delaunay Triangulation--作业
-C. Properties
-C. Properties--作业
-D. Proximity Graph
--05-D-02. Relative Neighborhood Graph
-D. Proximity Graph--作业
-E. Euclidean Minimum Spanning Tree
-E. Euclidean Minimum Spanning Tree--作业
-F. Euclidean Traveling Salesman Problem
-G. Minimum Weighted Triangulation
-G. Minimum Weighted Triangulation--作业
-H. Construction
--05-H-03. Maximizing The Minimum Angle
--05-H-04. Evolution By Edge Flipping
-H. Construction--作业
-I. RIC With Example
-I. RIC With Example--作业
-J. Randomized Incremental Construction
--05-J-01. Recursive Implementation
--05-J-02. Iterative Implementation
-J. Randomized Incremental Construction--作业
-K. RIC Analysis
--05-K-04. Types Of Edge Change
--05-K-05. Number Of Edge Changes
--05-K-07. Number Of Rebucketings
--05-K-08. Probability For Rebucketing
--05-K-10. Further Consideration
-0. Online/Offline Algorithms
--06-0. Online/Offline Algorithms
-0. Online/Offline Algorithms--作业
-A. Introduction
--06-A-03. Assumptions For Clarity
--06-A-05. Performance Measurements
-A. Introduction--作业
-B. Slab Method
--06-B-02. Ordering Trapezoids
-B. Slab Method--作业
-C. Persistence
--06-C-01. Ephemeral Structure
--06-C-02. Persistent Structure
-C. Persistence--作业
-D. Path Copying
--06-D-03. Storage Optimization
-D. Path Copying--作业
-E. Node Copying
-E. Node Copying--作业
-F. Limited Node Copying
-G. Kirkpatrick Structure
--06-G-01. Optimal And Simpler
--06-G-06. The More The Better
--06-G-07. The Fewer The Better
--06-G-09. Existence Of Independent Subset
--06-G-10. Construction Of Independent Subset
-G. Kirkpatrick Structure--作业
-H. Trapezoidal Map
--06-H-03. Properties & Complexity
--06-H-04. Search Structure: Example
--06-H-05. Search Structure: Nodes
--06-H-06. Search Structure: Performance
-H. Trapezoidal Map--作业
-I. Constructing Trapezoidal Map
--06-I-04. Case 1: Two Endpoints
--06-I-05. Case 2: One Endpoint
--06-I-06. Case 3: No Endpoints
-J. Performance Of Trapezoidal Map
--06-J-03. Number Of Ray Trimmed
--06-J-04. Number Of Trapezoidals Created (1)
--06-J-05. Number Of Trapezoidals Created (2)
--06-J-06. Time For Point Location
--06-J-07. Size Of Search Structure
--06-J-08. Fixed Query Point + Randomly Created Maps
--06-J-10. Probability Of Enclosing Trapezoid Changed
-A. Range Query
--07-A-01. 1-Dimensional Range Query
-A. Range Query--作业
-B. BBST
--07-B-02. Lowest Common Ancestor
-B. BBST--作业
-C. kd-Tree: Structure
-C. kd-Tree: Structure--作业
-D. kd-Tree: Algorithm
-D. kd-Tree: Algorithm--作业
-E. kd-Tree: Performance
--07-E-01. Preprocessing Time + Storage
-E. kd-Tree: Performance--作业
-F. Range Tree: Structure
--07-F-03. x-Query * y-Queries
-F. Range Tree: Structure--作业
-G. Range Tree: Query
-G. Range Tree: Query--作业
-H. Range Tree: Performance
-H. Range Tree: Performance--作业
-I. Range Tree: Optimization
--07-I-04. Fractional Cascading
-A. Orthogonal Windowing Query
-A. Orthogonal Windowing Query--作业
-B. Stabbing Query
-C. Interval Tree: Construction
-C. Interval Tree: Construction--作业
-D. Interval Tree: Query
-D. Interval Tree: Query--作业
-E. Stabbing With A Segment
--08-E-03. Query Algorithm (1)
--08-E-04. Query Algorithm (2)
-F. Grounded Range Query
--08-F-03. 1D-GRQ Using Range Tree
--08-F-04. 1D-GRQ By Linear Scan
-G. 1D-GRQ Using Heap
-G. 1D-GRQ Using Heap--作业
-H. Priority Search Tree
--08-H-03. Sibling Partitioning
-H. Priority Search Tree--作业
-I. 2D-GRQ Using PST
-I. 2D-GRQ Using PST--作业
-J. Segment Tree
--08-J-01. General Windowing Query
--08-J-02. Elementary Interval
--08-J-06. Solving Stabbing Query
--08-J-11. Constructing A Segment Tree
--08-J-12. Inserting A Segment (1)
--08-J-13. Inserting A Segment (2)
--08-J-14. Inserting A Segment (3)
-K. Vertical Segment Stabbing Query