[譯]K-D-B-tree(草稿,第一次翻譯)


原文地址:https://en.wikipedia.org/wiki/K-D-B-tree

計算機科學中,KDB-tree(k-dimensional B-tree)是一個用於划分K維搜索空間的樹形結構,KDB-tree的目的是提供平衡KD樹的搜索效率,同時提供B樹面向塊的存儲來優化外部內存的訪問。

介紹

類似於KD樹,KBD tree組織K維空間的點,有助於范圍搜索和多維數據庫查詢等操作。KDB tree通過在某個維度元素的比較將空間划分為兩個子空間。使用2-D-B-tree舉例子,空間划分使用和KD樹相同的方式:使用某個維度的一個點,其他值要么小於或者大於當前值,分別分到左邊和右邊的划分平面上。

不同於KD樹的地方,每個半空間不是自己的節點。而是和B樹類似,KDB-tree中的節點以頁來存儲,樹存儲一個指針,指向根頁。

結構

KDB-tree包括兩種類型的頁:

  • 區域頁面: (region, child)對的集合包含邊界區域的描述,加上該區域指向子頁面的指針。
  • 點頁面:(point, location)對的集合。數據庫方面,location可能指向數據庫記錄的索引,對於K維空間中的點,可以被看成該空間中的點坐標。

當向KDB樹插入元素時,導致節點的規模超過它的最優規模,頁面溢出。因為KDB-tree的目的是優化外部內存訪問,例如硬盤訪問,當節點的規模超過外部內存頁大小,一個葉被認為是溢出。

通過插入和刪除操作,KDB樹保持一些屬性:

  • 該圖是一個多叉樹,區域頁面指向子頁面,並且不能為空。點頁面是葉子節點。
  • 像B樹,對於所有查詢,到達葉節點的路徑長度是相同的。
  • 如果根節點是區域頁面,區域的聯合是整個搜索空間。
  • 當一個區域頁面的(region, child)對的兒子也是一個區域頁面,所有兒子區域的聯合是該頁面。
  • 和上面例子相反,如果兒子是一個點頁面,兒子中所有點必須被該區域包含。

KDB-tree中的操作 

 查詢操作

KDB-tree中的查詢是所有軸上的區間范圍搜索。去見的集合被叫做查詢區域。在k空間中,查詢區域被視為整個k維空間中的一些子空間的邊界。查詢可以分為三種:

  • 一些區間跨越整個空間,查詢叫做部分匹配查詢.
  • 一些局域是點,其他是區域,所有查詢叫做部分匹配查詢。
  • 局域是所有點,邊界也只是點,叫做精確匹配查詢。

   算法:

  1. 如果樹的根是空,終止,否則讓頁是根。
  2. 如果頁是點頁,返回(region, child)對中在查詢區域中的所有點。
  3. 否則,頁面是區域頁面,對所有和查詢區域交叉的(region, child)對,設置頁面為兒子,遞歸執行步驟2。

插入操作

當頁溢出時,KDB-tree插入操作需要頁面的分裂操作,首先定義分裂操作。

分裂操作

首先,一個區域頁面沿某個平面被分裂成兩個新的區域頁面,左區域頁面和右區域頁面。這些頁面充滿舊區域的頁面,舊區域頁面被刪除了。然后,對於原區域的(region, child),記住child是一個頁和區域指定一個真實的邊界區域:

  1. 如果區域完全位於左邊分裂平面,添加(region, child)到左邊平面。
  2. 如果區域完全位於右邊分裂平面,添加(region, child)到右邊平面。
  3. 否則:
    1. 遞歸通過分裂平面分裂兒子,導致new_left_pagenew_right_page。
    2. 通過分裂平面分裂區域,導致left_region和right_region。
    3. 添加(left_region, new_left_page)到左邊頁面,添加(right_region, new_right_page)到右邊頁面。

插入算法

使用分裂算法,插入一個新的(point, location)對被實現如下:

  1. 如果根頁面是空,簡單的讓根頁面成為一個新的點頁面,包含(point, location).
  2. 如果一個點上的精確匹配查詢來來找到點應該加入的頁面,如果該點已經在該頁存在,終止。
  3. 添加(point, location)到該頁面,如果該頁面溢出了,讓頁面表示那個頁。
  4. 讓舊頁面等於新頁面。選擇一些元素和維度來定義分裂平面,產生兩個頁面,並且其中一個頁面不要因為新點的加入而溢出。分裂平面導致兩個新的頁面:new_left_pagenew_right_page和兩個新的區域left_region和right_region。
  5. 如果頁面不是根頁面,跳到步驟6。否則,頁面邊吃父頁面,用(left_region, new_left_page)和(right_region, new_right_page)取代(region, old_page).如果頁面溢出,重復步驟4,否則終止。
  6. 讓left_region成為左邊分裂平面的整個搜索空間,讓right_reigon成為右邊分裂平面的整個搜索空間,設置根頁面包含left_region和right_region.

選擇分裂平面和分裂元素是很重要的,因為我們想平衡兩個分裂平面的點數量。在一些情況下,錯誤的選擇會導致不滿意的分裂結果。也可能導致某個頁面不能被某個維度分割。

刪除操作

如果對存儲的使用沒有最小數量的要求,KDB-tree的刪除是一個非常簡單的。使用一個精確匹配查詢去找到(point, location)對,我們只是簡單的移除記錄。

重組算法

因為刪除會導致一些頁面僅包含非常少的數據,重組KDB-tree來滿足最小數目的存儲要求是必要的。重組算法被使用當一個頁面包含非常少的數據時,如下:

  1. 讓頁面成為p的父頁面,包含(region, P)
  2. 找到頁面中的區域以至於區域是鄰近的,區域的聯合形成矩陣區域。這些區域被認為是可連接的。讓R表示這些區域的集合。
  3. 組合集合R成為一個新的頁面S,如果S過多的,重復分裂直到結果頁面滿足要求。
  4. 用結果頁面來取代集合R。

相關工作

類似於KD-tree,更新KDB-tree可能會導致遞歸的分裂一些節點。這是非常沒有效率的,能導致幾乎空的葉節點。Lomet和Salzberg提出一個結構hB-Tree來提高KDB-tree的性能,該結構通過在插入一條根到頁的路徑來限制分裂。這被實現通過存儲區域為矩形。

最近,Bkd-tree被提出提供更快速的查詢,以及接近靜態KDB-tree的100%空間使用率。代替維護一棵樹和重新平衡,log2(N/M)的kdb-tree集合被維護定期重建。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM