1. 1d Range Search
Goal: intersections of geometric objects.  
 
Solution: BST 
1d range search
operations required:
- insert
 - search
 - delete
 - range search: all keys between k1 and k2
 - range count: how many keys are between k1 and k2
 
→ find points on an interval  
 
implementation by BST
range count 
using the rank() function for the BST (or use the size of a tree) 
 
注意什么时候要加1...   
public int size(Key hi, Key lo){   
    if(contains(hi)) return rank(hi)-rank(lo)+1;   
    else return rank(hi) - rank(lo);   
}
range search 
类似inorder traversal的方式:    
- find in left subtree (if could fall into range)
 - check current node
 - find in right subtree
 
 
running time: R+lgN (R=nb of nodes in range)   
2. Line Segment Intersection
Orthognal line segment intersection search:
find all intersections given N horizontal/vertical lines
![]()
Non-degeneracy assumption: all x-coord and y-coord are distinct.
naive algo: check all pairs...
Sweep-line algorithm
 
 
- sweep a vertical line from left to right.    
- when hit the left end of horizontal-segment (h-seg) → insert into a BST
 - when hit the right end of a h-seg → delete from BST
 - when hit a vertical-seg: ⇒ 1d range search !
 
 
关于怎么sweep的: 
没有仔细讲, 不过我觉得就是把所有的x坐标排好序, 有个skyline问题也是涉及如何sweep的.   
proposition 
running time is NlgN+R (R=nb of intersections).  
proof. 
- Sort by x-coord (or use PQ) → NlgN
 - insert/delete y-coord to BST → NlgN
 - range search → NlgN + R
 
3. Kd-trees
An extension of BST: 2d-keys.
- insert: insert 2d points
 - search
 - range search: find all keys lying in a 2d rectangle (h-v rectangle)
 - range count
 
gird implementation
divide space into a M-by-M grid (uniform squares). 
space: N + M^2 
time: 1 + N/M^2  
→ choose square to balance space and time.  
problem: points are not uniformly distributed.  
 
2d tree
Use a tree to represent the subdivision of the space.
2d tree: recursively divide the space into 2 halfplanes 
 
construct the 2d tree by adding points: alternating between horizontal and vertical partitioning for each level of tree.  
 
Data structure: BST alternating x and y-coords as key.  
 
Range search for 2d tree
find all points lying in a rectangle.  
依然类似tree traversal算法:   
- check point in node
 - find in left subtree (if could be in range — the rectangle intersects the splitting line)
 - find in right subtree
 
 
analysis 
Typical case: R + lgN 
worst case: R+ sqrt(N) (even if tree is balanced) 
(proof is hard)   
Nearest Neighbour seach
find closest point to a query point.
- check dist from query point to node
 - check in left tree (if could contain a closer point — 和两点连线与splitting line的角度有关系)
 - check in right tree
 
analysis 
typical case: lgN 
worst case: N   
Flocking boids 
3 simple rules to get a simulation of flocking.  
 
Kd tree
partition the k-dim space into 2 halfspaces.  
cycle through k dimensions. 
 
(居然时一个本科生发现的!)   
Nbody simulation: 
treat clusters as an aggregated node   
4. Interval search tree
1d interval search: data are intervals
- insert interval
 - search interval
 - delete interval
 - intersection query: find all intervals that intersects (lo,hi)
 
 
Nondegeneracy assumption: all left endpoint of intervals are distinct.    
API:
put(Key lo, Key hi, Value val)   
get(Key lo, Key hi)   
delete(Key lo, Key hi)   
Iterable<Key> intersects(Key lo, Key hi)
Interval search tree:
- BST using left endpoint as key
 - in each node: store the max right endpoint of the subtree
 
 
insert 
类似BST, 加上维护一下maxendpoint即可.   
search 
search any one interval that intersects (lo,hi)   
- if node intersects, return
 - if left.maxendpoint < lo: go right
 - else: go left
 
*proof. * 
主要证明一点: if no intersection to left ⇒ then no intersection to the right 
 
5. Rectangle intersection
Goal:  find all intersection among N rectangles.  
(non degeneracy assumption: all x and y are distinct)    
bottom line: linearithmic algo.
sweep-line algorithm: 
sweep vertical line from left to right.    
- when hit left part of a rect ⇒ put into an interval search tree
 - when hit right part of a rect ⇒ remove interval
 - every time befor adding ⇒ check intersection
 
reduces the 2d rect intersection pb to 1d interval search pb.
complexity:  
NlgN+RlgN   
summery:  
 
Part 12 of series «Algorithms Princeton MOOC I»:
- [Algorithms I] Week 1-1 Union-Find
 - [Algorithms I] Week 1-2 Analysis of Algorithms
 - [Algorithms I] Week1-Lab: Percolation
 - [Algorithms I] Week 2-1 Stacks and Queues
 - [Algorithms I] Week 2-2 Elementary Sorts
 - [Algorithms I] Week 3-1 Mergesort
 - [Algorithms I] Week 3-2 Quicksort
 - [Algorithms I] Week 4-1 Priority Queue
 - [Algorithms I] Week 4-2a Elementry Symbol Tables
 - [Algorithms I] Week 4-2b Binary Search Trees
 - [Algorithms I] Week 5-1 Balanced Search Trees
 - [Algorithms I] Week 5-2 Geometric Applications of BSTs
 - [Algorithms I] Week 6 Hash Tables
 
 
Disqus 留言