熱線電話:13121318867

登錄
首頁精彩閱讀KD樹的應用(2)K個最小近鄰的查找:大頂堆優先級隊列
KD樹的應用(2)K個最小近鄰的查找:大頂堆優先級隊列
2014-12-03
收藏

KD樹的應用(2)K個最小近鄰的查找:大頂堆優先級隊列

K個最小近鄰的查找:大頂堆優先級隊列

    上文中一直在講最近鄰問題,也就是說只找最近的那唯一一個鄰居,但如果現實中需要我們找到k個最近的鄰居。該如何做呢?對的,之前blog內曾相近闡述過尋找最小的k個數的問題,顯然,尋找k個最近鄰與尋找最小的k個數的問題如出一轍。

    回憶下尋找k個最小的數中關于構造大頂堆的解決方案:

    “尋找最小的k個樹,更好的辦法是維護k個元素的最大堆,即用容量為k的最大堆存儲最先遍歷到的k個數,并假設它們即是最小的k個數,建堆費時O(k)后,有k1<k2<...<kmax(kmax設為大頂堆中最大元素)。繼續遍歷數列,每次遍歷一個元素x,與堆頂元素比較,x<kmax,更新堆(用時logk),否則不更新堆。這樣下來,總費時O(k+(n-k)*logk)=O(n*logk)。此方法得益于在堆中,查找等各項操作時間復雜度均為logk。

    根據上述方法,咱們來寫大頂堆最小優先級隊列相關代碼實現:

  1. void* minpq_extract_min( struct min_pq* min_pq )  
  2. {  
  3.     void* data;  
  4.   
  5.     if( min_pq->n < 1 )  
  6.     {  
  7.         fprintf( stderr, "Warning: PQ empty, %s line %d\n", __FILE__, __LINE__ );  
  8.         return NULL;  
  9.     }  
  10.     data = min_pq->pq_array[0].data; //root of tree  
  11.     min_pq->n--;   //0  
  12.     min_pq->pq_array[0] = min_pq->pq_array[min_pq->n];  
  13.     restore_minpq_order( min_pq->pq_array, 0, min_pq->n );  
  14.                                               //0  
  15.     return data;  
  16. }  
    上述函數中,restore_minpq_order的實現如下:
  1. static void restore_minpq_order( struct pq_node* pq_array, int i, int n )  
  2. {                                                          //0     //0  
  3.     struct pq_node tmp;  
  4.     int l, r, min = i;  
  5.   
  6.     l = left( i ); //2*i+1,????????????  
  7.     r = right( i );//2*i+2,????????????  
  8.     if( l < n )  
  9.         if( pq_array[l].key < pq_array[i].key )  
  10.             min = l;  
  11.     if( r < n )  
  12.         if( pq_array[r].key < pq_array[min].key )  
  13.             min = r;  
  14.   
  15.     if( min != i )  
  16.     {  
  17.         tmp = pq_array[min];  
  18.         pq_array[min] = pq_array[i];  
  19.         pq_array[i] = tmp;  
  20.         restore_minpq_order( pq_array, min, n );  
  21.     }  
  22. }  

數據分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數據分析師資訊
更多

OK
客服在線
立即咨詢
日韩人妻系列无码专区视频,先锋高清无码,无码免费视欧非,国精产品一区一区三区无码
客服在線
立即咨詢