JonsenElizee

Software Developing Blog

"An idea is fragile . It can be killed by a scornful smile or a yawn .It can be mound down by irony and scared to death by a cold look."
"Most cultures throughout human history have not liked creative individuals .They ignore them or kill them.It is a very efficient way of stopping creativity."

------Advertising boss Charles Browe and Howard Gardner ,professor at Harvard

   :: 首页 :: 新随笔 ::  ::  :: 管理 ::
ISSUE: 输入上百万个行星的位置, 求距离第K近的两个行星。


Precondition:
    
1. star field simulation graph is planar.
    
2. the coordinate of star is (x, y) that is treated as a point。
    
3. N = 1000000

1. bucket-sort all points according to x-coordinate. get B buckets.
   
this is will completed in O(NlogN).
   
   
struct bucket {
    
int num;       // number of points in this bucket.
    point* points; // points in this bucket.
    double x;      // value of x-coordinate.
   }
   
   bck[B]; 
// B buckets got.

2
   
struct distance {
    point p1;
    point p2;
    
double d;     // distance between p1 and p2.
   }

   distance kdis[K]; 
// to record K small distance. and it's a eliminating-tree.
   kdis[0 to K-1= 0;

   
for(i = [0, B-2]) // O(B)
   {
    
// check bck[i] and bck[i+1]
    if(bck[i+1].x - bck[i].x >= kdis[K-1].d && kdis[K-1!= 0)
    {
        
// there is no need to check these two buckets.
        i++;
        
continue// save time.
    }

    point
* poi = bck[i].points;
    
for(j = [0, bck.num-1]) // O(N/B)
    {
        point p 
= poi[j];
        
/*
        find K points in bck[i+1] near to p
        with binary searching method 
        according to p.y.
        
*/
        kp[K]; 
// K points got in bck[i+1]

        
for(m = [0, K-1]) // O(K)
        {
            distance tmp 
= get_distance(kp[m], p);
            
if(tmp.d < kdis[K-1].d)
            {
                kdis[K
-1= tmp;
                
// adjust kdis[K-1], for it's a eliminating tree.
            }
        }
    }
   }

   
// finally, the kdis[K-1] is the kth distance in this star graph.
   
// the whole processing will be completed in O(NlogN) + O(B*N/B*K).
   
// and SC is O(N) + O(K) = O(N).

HOW TO FIND K POINTS
?
    
/*
    find K points in bck[i+1] near to p
    with binary searching method 
    according to p.y.
    
*/
it
's not complecated! and could be found in O(log(N/B)).


posted on 2010-10-27 15:18 JonsenElizee 阅读(1462) 评论(0)  编辑 收藏 引用 所属分类: Data Structures & Algorithms

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


By JonsenElizee