日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

B树、B+树、B*树谈到R 树

發(fā)布時間:2023/12/3 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 B树、B+树、B*树谈到R 树 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

轉自:?https://blog.csdn.net/v_JULY_v/article/details/6530142

?

從B 樹、B+ 樹、B* 樹談到R 樹

?

作者:July、weedge、Frankie。編程藝術室出品。

說明:本文從B樹開始談起,然后論述B+樹、B*樹,最后談到R 樹。其中B樹、B+樹及B*樹部分由weedge完成,R 樹部分由Frankie完成,全文最終由July統(tǒng)稿修訂完成。

出處:http://blog.csdn.net/v_JULY_v?。

?

第一節(jié)、B樹、B+樹、B*樹
1.前言:

動態(tài)查找樹主要有:二叉查找樹(Binary Search Tree),平衡二叉查找樹(Balanced Binary Search Tree),紅黑樹(Red-Black Tree ),B-tree/B+-tree/ B*-tree (B~Tree)。前三者是典型的二叉查找樹結構,其查找的時間復雜度O(log2N)與樹的深度相關,那么降低樹的深度自然會提高查找效率。

但是咱們有面對這樣一個實際問題:就是大規(guī)模數(shù)據(jù)存儲中,實現(xiàn)索引查詢這樣一個實際背景下,樹節(jié)點存儲的元素數(shù)量是有限的(如果元素數(shù)量非常多的話,查找就退化成節(jié)點內部的線性查找了),這樣導致二叉查找樹結構由于樹的深度過大而造成磁盤I/O讀寫過于頻繁,進而導致查詢效率低下(為什么會出現(xiàn)這種情況,待會在外部存儲器-磁盤中有所解釋),那么如何減少樹的深度(當然是不能減少查詢的數(shù)據(jù)量),一個基本的想法就是:采用多叉樹結構(由于樹節(jié)點元素數(shù)量是有限的,自然該節(jié)點的子樹數(shù)量也就是有限的)。

也就是說,因為磁盤的操作費時費資源,如果過于頻繁的多次查找勢必效率低下。那么如何提高效率,即如何避免磁盤過于頻繁的多次查找呢?根據(jù)磁盤查找存取的次數(shù)往往由樹的高度所決定,所以,只要我們通過某種較好的樹結構減少樹的結構盡量減少樹的高度,那么是不是便能有效減少磁盤查找存取的次數(shù)呢?那這種有效的樹結構是一種怎樣的樹呢?

這樣我們就提出了一個新的查找樹結構——多路查找樹。根據(jù)平衡二叉樹的啟發(fā),自然就想到平衡多路查找樹結構,也就是這篇文章所要闡述的第一個主題B~tree,即B樹結構(后面,我們將看到,B樹的各種操作能使B樹保持較低的高度,從而達到有效避免磁盤過于頻繁的查找存取操作,從而有效提高查找效率)。

B-tree(B-tree樹即B樹,B即Balanced,平衡的意思)這棵神奇的樹是在Rudolf Bayer,?Edward M. McCreight(1970)寫的一篇論文《Organization and Maintenance of Large Ordered Indices》中首次提出的(wikipedia中:http://en.wikipedia.org/wiki/B-tree,闡述了B-tree名字來源以及相關的開源地址)。

在開始介紹B~tree之前,先了解下相關的硬件知識,才能很好的了解為什么需要B~tree這種外存數(shù)據(jù)結構。?

?

2.外存儲器—磁盤

計算機存儲設備一般分為兩種:內存儲器(main memory)和外存儲器(external memory)。 內存存取速度快,但容量小,價格昂貴,而且不能長期保存數(shù)據(jù)(在不通電情況下數(shù)據(jù)會消失)。

外存儲器—磁盤是一種直接存取的存儲設備(DASD)。它是以存取時間變化不大為特征的。可以直接存取任何字符組,且容量大、速度較其它外存設備更快。

2.1磁盤的構造

磁盤是一個扁平的圓盤(與電唱機的唱片類似)。盤面上有許多稱為磁道的圓圈,數(shù)據(jù)就記錄在這些磁道上。磁盤可以是單片的,也可以是由若干盤片組成的盤組,每一盤片上有兩個面。如下圖11.3中所示的6片盤組為例,除去最頂端和最底端的外側面不存儲數(shù)據(jù)之外,一共有10個面可以用來保存信息。

???????????????????????????

?

當磁盤驅動器執(zhí)行讀/寫功能時。盤片裝在一個主軸上,并繞主軸高速旋轉,當磁道在讀/寫頭(又叫磁頭) 下通過時,就可以進行數(shù)據(jù)的讀 / 寫了。

一般磁盤分為固定頭盤(磁頭固定)和活動頭盤。固定頭盤的每一個磁道上都有獨立的磁頭,它是固定不動的,專門負責這一磁道上數(shù)據(jù)的讀/寫。

活動頭盤 (如上圖)的磁頭是可移動的。每一個盤面上只有一個磁頭(磁頭是雙向的,因此正反盤面都能讀寫)。它可以從該面的一個磁道移動到另一個磁道。所有磁頭都裝在同一個動臂上,因此不同盤面上的所有磁頭都是同時移動的(行動整齊劃一)。當盤片繞主軸旋轉的時候,磁頭與旋轉的盤片形成一個圓柱體。各個盤面上半徑相同的磁道組成了一個圓柱面,我們稱為柱面 。因此,柱面的個數(shù)也就是盤面上的磁道數(shù)。?

2.2磁盤的讀/寫原理和效率

磁盤上數(shù)據(jù)必須用一個三維地址唯一標示:柱面號、盤面號、塊號(磁道上的盤塊)。

讀/寫磁盤上某一指定數(shù)據(jù)需要下面3個步驟:

(1)??首先移動臂根據(jù)柱面號使磁頭移動到所需要的柱面上,這一過程被稱為定位或查找 。

(2)??如上圖11.3中所示的6盤組示意圖中,所有磁頭都定位到了10個盤面的10條磁道上(磁頭都是雙向的)。這時根據(jù)盤面號來確定指定盤面上的磁道。

(3) 盤面確定以后,盤片開始旋轉,將指定塊號的磁道段移動至磁頭下。

經過上面三個步驟,指定數(shù)據(jù)的存儲位置就被找到。這時就可以開始讀/寫操作了。

訪問某一具體信息,由3部分時間組成:

● 查找時間(seek time) Ts: 完成上述步驟(1)所需要的時間。這部分時間代價最高,最大可達到0.1s左右。

● 等待時間(latency time) Tl: 完成上述步驟(3)所需要的時間。由于盤片繞主軸旋轉速度很快,一般為7200轉/分(電腦硬盤的性能指標之一, 家用的普通硬盤的轉速一般有5400rpm(筆記本)、7200rpm幾種)。因此一般旋轉一圈大約0.0083s。

● 傳輸時間(transmission time) Tt: 數(shù)據(jù)通過系統(tǒng)總線傳送到內存的時間,一般傳輸一個字節(jié)(byte)大概0.02us=2*10^(-8)s

磁盤讀取數(shù)據(jù)是以盤塊(block)為基本單位的。位于同一盤塊中的所有數(shù)據(jù)都能被一次性全部讀取出來。而磁盤IO代價主要花費在查找時間Ts上。因此我們應該盡量將相關信息存放在同一盤塊,同一磁道中。或者至少放在同一柱面或相鄰柱面上,以求在讀/寫信息時盡量減少磁頭來回移動的次數(shù),避免過多的查找時間Ts。

所以,在大規(guī)模數(shù)據(jù)存儲方面,大量數(shù)據(jù)存儲在外存磁盤中,而在外存磁盤中讀取/寫入塊(block)中某數(shù)據(jù)時,首先需要定位到磁盤中的某塊,如何有效地查找磁盤中的數(shù)據(jù),需要一種合理高效的外存數(shù)據(jù)結構,就是下面所要重點闡述的B-tree結構,以及相關的變種結構:B+-tree結構和B*-tree結構。

3.B- 樹?

?????3.1什么是B-樹

具體講解之前,有一點,再次強調下:B-樹,即為B樹。因為B樹的原英文名稱為B-tree,而國內很多人喜歡把B-tree譯作B-樹,其實,這是個非常不好的直譯,很容易讓人產生誤解。如人們可能會以為B-樹是一種樹,而B樹又是一種一種樹。而事實上是,B-tree就是指的B樹。特此說明。

我們知道,B 樹是為了磁盤或其它存儲設備而設計的一種多叉(下面你會看到,相對于二叉,B樹每個內結點有多個分支,即多叉)平衡查找樹。與本blog之前介紹的紅黑樹很相似,但在降低磁盤I/0操作方面要更好一些。許多數(shù)據(jù)庫系統(tǒng)都一般使用B樹或者B樹的各種變形結構,如下文即將要介紹的B+樹,B*樹來存儲信息。

?B樹與紅黑樹最大的不同在于,B樹的結點可以有許多子女,從幾個到幾千個。那為什么又說B樹與紅黑樹很相似呢?因為與紅黑樹一樣,一棵含n個結點的B樹的高度也為O(lgn),但可能比一棵紅黑樹的高度小許多,應為它的分支因子比較大。所以,B樹可以在O(logn)時間內,實現(xiàn)各種如插入(insert),刪除(delete)等動態(tài)集合操作。

如下圖所示,即是一棵B樹,一棵關鍵字為英語中輔音字母的B樹,現(xiàn)在要從樹種查找字母R(包含n[x]個關鍵字的內結點x,x有n[x]+1]個子女(也就是說,一個內結點x若含有n[x]個關鍵字,那么x將含有n[x]+1個子女)。所有的葉結點都處于相同的深度,帶陰影的結點為查找字母R時要檢查的結點):

?

相信,從上圖你能輕易的看到,一個內結點x若含有n[x]個關鍵字,那么x將含有n[x]+1個子女。如含有2個關鍵字D H的內結點有3個子女,而含有3個關鍵字Q T X的內結點有4個子女。

????B樹的定義,從下文中,你將看到,或者是用階,或者是用度,如下段文字所述:
????Unfortunately, the literature on B-trees is not uniform in its use of terms relating to B-Trees. (Folk & Zoellick 1992, p. 362)?Bayer & McCreight (1972), Comer (1979), and others define the order of B-tree as the minimum number of keys in a non-root node. Folk & Zoellick (1992) points out that terminology is ambiguous because the maximum number of keys is not clear. An order 3 B-tree might hold a maximum of 6 keys or a maximum of 7 keys. (Knuth 1998,TAOCP p. 483) avoids the problem by defining the order to be maximum number of children (which is one more than the maximum number of keys).

????from: http://en.wikipedia.org/wiki/Btree#Technical_description。

????用階定義的B樹

????B 樹又叫平衡多路查找樹。一棵m階的B 樹 (注:切勿簡單的認為一棵m階的B樹是m叉樹,雖然存在四叉樹,八叉樹,KD樹,及vp/R樹/R*樹/R+樹/X樹/M樹/線段樹/希爾伯特R樹/優(yōu)先R樹等空間劃分樹,但與B樹完全不等同)的特性如下:

樹中每個結點最多含有m個孩子(m>=2);
除根結點和葉子結點外,其它每個結點至少有[ceil(m / 2)]個孩子(其中ceil(x)是一個取上限的函數(shù));
若根結點不是葉子結點,則至少有2個孩子(特殊情況:沒有孩子的根結點,即根結點為葉子結點,整棵樹只有一個根節(jié)點);
所有葉子結點都出現(xiàn)在同一層,葉子結點不包含任何關鍵字信息(可以看做是外部接點或查詢失敗的接點,實際上這些結點不存在,指向這些結點的指針都為null);(讀者反饋@冷岳:這里有錯,葉子節(jié)點只是沒有孩子和指向孩子的指針,這些節(jié)點也存在,也有元素。@研究者July:其實,關鍵是把什么當做葉子結點,因為如紅黑樹中,每一個NULL指針即當做葉子結點,只是沒畫出來而已)。
每個非終端結點中包含有n個關鍵字信息: (n,P0,K1,P1,K2,P2,......,Kn,Pn)。其中:
???????a)???Ki (i=1...n)為關鍵字,且關鍵字按順序升序排序K(i-1)< Ki。?
???????b)???Pi為指向子樹根的接點,且指針P(i-1)指向子樹種所有結點的關鍵字均小于Ki,但都大于K(i-1)。?
???????c)???關鍵字的個數(shù)n必須滿足: [ceil(m / 2)-1]<= n <= m-1。如下圖所示:


????用度定義的B樹

??????針對上面的5點,再闡述下:B樹中每一個結點能包含的關鍵字(如之前上面的D H和Q T X)數(shù)有一個上界和下界。這個下界可以用一個稱作B樹的最小度數(shù)(算法導論中文版上譯作度數(shù),最小度數(shù)即內節(jié)點中節(jié)點最小孩子數(shù)目)m(m>=2)表示。

每個非根的內結點至多有m個子女,每個非根的結點必須至少含有m-1個關鍵字,如果樹是非空的,則根結點至少包含一個關鍵字;
每個結點可包含至多2m-1個關鍵字。所以一個內結點至多可有2m個子女。如果一個結點恰好有2m-1個關鍵字,我們就說這個結點是滿的(而稍后介紹的B*樹作為B樹的一種常用變形,B*樹中要求每個內結點至少為2/3滿,而不是像這里的B樹所要求的至少半滿);
當關鍵字數(shù)m=2(t=2的意思是,mmin=2,m可以>=2)時的B樹是最簡單的(有很多人會因此誤認為B樹就是二叉查找樹,但二叉查找樹就是二叉查找樹,B樹就是B樹,B樹是一棵含有m(m>=2)個關鍵字的平衡多路查找樹),此時,每個內結點可能因此而含有2個、3個或4個子女,亦即一棵2-3-4樹,然而在實際中,通常采用大得多的t值。
????B樹中的每個結點根據(jù)實際情況可以包含大量的關鍵字信息和分支(當然是不能超過磁盤塊的大小,根據(jù)磁盤驅動(disk drives)的不同,一般塊的大小在1k~4k左右);這樣樹的深度降低了,這就意味著查找一個元素只要很少結點從外存磁盤中讀入內存,很快訪問到要查找的數(shù)據(jù)。如果你看完上面關于B樹定義的介紹,思維感覺不夠清晰,請繼續(xù)參閱下文第6小節(jié)、B樹的插入、刪除操作 部分。

????3.2B樹的類型和節(jié)點定義

????B樹的類型和節(jié)點定義如下圖所示:

?

?

????3.3文件查找的具體過程(涉及磁盤IO操作)

為了簡單,這里用少量數(shù)據(jù)構造一棵3叉樹的形式,實際應用中的B樹結點中關鍵字很多的。上面的圖中比如根結點,其中17表示一個磁盤文件的文件名;小紅方塊表示這個17文件內容在硬盤中的存儲位置;p1表示指向17左子樹的指針。

其結構可以簡單定義為:

typedef struct {

????/*文件數(shù)*/

????int??file_num;

????/*文件名(key)*/

????char * file_name[max_file_num];

????/*指向子節(jié)點的指針*/

?????BTNode * BTptr[max_file_num+1];

?????/*文件在硬盤中的存儲位置*/

?????FILE_HARD_ADDR offset[max_file_num];

}BTNode;

假如每個盤塊可以正好存放一個B樹的結點(正好存放2個文件名)。那么一個BTNODE結點就代表一個盤塊,而子樹指針就是存放另外一個盤塊的地址。

下面,咱們來模擬下查找文件29的過程:

根據(jù)根結點指針找到文件目錄的根磁盤塊1,將其中的信息導入內存。【磁盤IO操作 1次】????
此時內存中有兩個文件名17、35和三個存儲其他磁盤頁面地址的數(shù)據(jù)。根據(jù)算法我們發(fā)現(xiàn):17<29<35,因此我們找到指針p2。
根據(jù)p2指針,我們定位到磁盤塊3,并將其中的信息導入內存。【磁盤IO操作 2次】????
此時內存中有兩個文件名26,30和三個存儲其他磁盤頁面地址的數(shù)據(jù)。根據(jù)算法我們發(fā)現(xiàn):26<29<30,因此我們找到指針p2。
根據(jù)p2指針,我們定位到磁盤塊8,并將其中的信息導入內存。【磁盤IO操作 3次】????
此時內存中有兩個文件名28,29。根據(jù)算法我們查找到文件名29,并定位了該文件內存的磁盤地址。
分析上面的過程,發(fā)現(xiàn)需要3次磁盤IO操作和3次內存查找操作。關于內存中的文件名查找,由于是一個有序表結構,可以利用折半查找提高效率。至于IO操作是影響整個B樹查找效率的決定因素。

當然,如果我們使用平衡二叉樹的磁盤存儲結構來進行查找,磁盤4次,最多5次,而且文件越多,B樹比平衡二叉樹所用的磁盤IO操作次數(shù)將越少,效率也越高。

3.4B樹的高度
????根據(jù)上面的例子我們可以看出,對于輔存做IO讀的次數(shù)取決于B樹的高度。而B樹的高度由什么決定的呢?

????若B樹某一非葉子節(jié)點包含N個關鍵字,則此非葉子節(jié)點含有N+1個孩子結點,而所有的葉子結點都在第I層,我們可以得出:
因為根至少有兩個孩子,因此第2層至少有兩個結點。
除根和葉子外,其它結點至少有┌m/2┐個孩子,
因此在第3層至少有2*┌m/2┐個結點,
在第4層至少有2*(┌m/2┐^2)個結點,
在第 I 層至少有2*(┌m/2┐^(l-2) )個結點,于是有:?N+1 ≥ 2*┌m/2┐I-2;
考慮第L層的結點個數(shù)為N+1,那么2*(┌m/2┐^(l-2))≤N+1,也就是L層的最少結點數(shù)剛好達到N+1個,即: I≤ log┌m/2┐((N+1)/2 )+2;
  所以
當B樹包含N個關鍵字時,B樹的最大高度為l-1(因為計算B樹高度時,葉結點所在層不計算在內),即:l - 1 =?log┌m/2┐((N+1)/2 )+1。
  這個B樹的高度公式從側面顯示了B樹的查找效率是相當高的。
曾在一次面試中被問到,一棵含有N個總關鍵字數(shù)的m階的B樹的最大高度是多少?答曰:log_ceil(m/2)(N+1)/2?+ 1 (上面中關于m階B樹的第1點特性已經提到:樹中每個結點含有最多含有m個孩子,即m滿足:ceil(m/2)<=m<=m。而樹中每個結點含孩子數(shù)越少,樹的高度則越大,故如此)。在2012微軟4月份的筆試中也問到了此問題。
此外,還有讀者反饋,說上面的B樹的高度計算公式與算法導論一書上的不同,而后我特意翻看了算法導論第18章關于B樹的高度一節(jié)的內容,如下圖所示:

在上圖中書上所舉的例子中,也許,根據(jù)我們大多數(shù)人的理解,它的高度應該是4,而書上卻說的是“一棵高度為3的B樹”。我想,此時,你也就明白了,算法導論一書上的高度的定義是從“0”開始計數(shù)的,而我們中國人的習慣是樹的高度是從“1”開始計數(shù)的。特此說明。July、二零一二年九月二十七日。
4.B+-tree

B+-tree:是應文件系統(tǒng)所需而產生的一種B-tree的變形樹。

一棵m階的B+樹和m階的B樹的異同點在于:

??????1.有n棵子樹的結點中含有n-1?個關鍵字;?(此處頗有爭議,B+樹到底是與B 樹n棵子樹有n-1個關鍵字 保持一致,還是不一致:B樹n棵子樹的結點中含有n個關鍵字,待后續(xù)查證。暫先提供兩個參考鏈接:①wikipedia?http://en.wikipedia.org/wiki/B%2B_tree#Overview;②http://hedengcheng.com/?p=525。而下面B+樹的圖尚未最終確定是否有問題,請讀者注意)

??????2.所有的葉子結點中包含了全部關鍵字的信息,及指向含有這些關鍵字記錄的指針,且葉子結點本身依關鍵字的大小自小而大的順序鏈接。 (而B 樹的葉子節(jié)點并沒有包括全部需要查找的信息)

??????3.所有的非終端結點可以看成是索引部分,結點中僅含有其子樹根結點中最大(或最小)關鍵字。 (而B 樹的非終節(jié)點也包含需要查找的有效信息)

?

?

a)?????為什么說B+-tree比B 樹更適合實際應用中操作系統(tǒng)的文件索引和數(shù)據(jù)庫索引?

1) B+-tree的磁盤讀寫代價更低

B+-tree的內部結點并沒有指向關鍵字具體信息的指針。因此其內部結點相對B 樹更小。如果把所有同一內部結點的關鍵字存放在同一盤塊中,那么盤塊所能容納的關鍵字數(shù)量也越多。一次性讀入內存中的需要查找的關鍵字也就越多。相對來說IO讀寫次數(shù)也就降低了。

????舉個例子,假設磁盤中的一個盤塊容納16bytes,而一個關鍵字2bytes,一個關鍵字具體信息指針2bytes。一棵9階B-tree(一個結點最多8個關鍵字)的內部結點需要2個盤快。而B+ 樹內部結點只需要1個盤快。當需要把內部結點讀入內存中的時候,B 樹就比B+ 樹多一次盤塊查找時間(在磁盤中就是盤片旋轉的時間)。

2) B+-tree的查詢效率更加穩(wěn)定

由于非終結點并不是最終指向文件內容的結點,而只是葉子結點中關鍵字的索引。所以任何關鍵字的查找必須走一條從根結點到葉子結點的路。所有關鍵字查詢的路徑長度相同,導致每一個數(shù)據(jù)的查詢效率相當。

讀者點評
本文評論下第149樓,fanyy1991針對上文所說的兩點,道:個人覺得這兩個原因都不是主要原因。數(shù)據(jù)庫索引采用B+樹的主要原因是 B樹在提高了磁盤IO性能的同時并沒有解決元素遍歷的效率低下的問題。正是為了解決這個問題,B+樹應運而生。B+樹只要遍歷葉子節(jié)點就可以實現(xiàn)整棵樹的遍歷。而且在數(shù)據(jù)庫中基于范圍的查詢是非常頻繁的,而B樹不支持這樣的操作(或者說效率太低)。

b)????B+-tree的應用: VSAM(虛擬存儲存取法)文件(來源論文 the ubiquitous Btree 作者:D COMER - 1979 )

?

?

5.B*-tree

B*-tree是B+-tree的變體,在B+樹的基礎上(所有的葉子結點中包含了全部關鍵字的信息,及指向含有這些關鍵字記錄的指針),B*樹中非根和非葉子結點再增加指向兄弟的指針;B*樹定義了非葉子結點關鍵字個數(shù)至少為(2/3)*M,即塊的最低使用率為2/3(代替B+樹的1/2)。給出了一個簡單實例,如下圖所示:

?

B+樹的分裂:當一個結點滿時,分配一個新的結點,并將原結點中1/2的數(shù)據(jù)復制到新結點,最后在父結點中增加新結點的指針;B+樹的分裂只影響原結點和父結點,而不會影響兄弟結點,所以它不需要指向兄弟的指針。

B*樹的分裂:當一個結點滿時,如果它的下一個兄弟結點未滿,那么將一部分數(shù)據(jù)移到兄弟結點中,再在原結點插入關鍵字,最后修改父結點中兄弟結點的關鍵字(因為兄弟結點的關鍵字范圍改變了);如果兄弟也滿了,則在原結點與兄弟結點之間增加新結點,并各復制1/3的數(shù)據(jù)到新結點,最后在父結點增加新結點的指針。

所以,B*樹分配新結點的概率比B+樹要低,空間使用率更高;

?

6、B樹的插入、刪除操作

上面第3小節(jié)簡單介紹了利用B樹這種結構如何訪問外存磁盤中的數(shù)據(jù)的情況,下面咱們通過另外一個實例來對這棵B樹的插入(insert),刪除(delete)基本操作進行詳細的介紹。
但在此之前,咱們還得簡單回顧下一棵m階的B 樹的特性,如下:
樹中每個結點含有最多含有m個孩子,即m滿足:ceil(m/2)<=m<=m。
除根結點和葉子結點外,其它每個結點至少有[ceil(m / 2)]個孩子(其中ceil(x)是一個取上限的函數(shù));
若根結點不是葉子結點,則至少有2個孩子(特殊情況:沒有孩子的根結點,即根結點為葉子結點,整棵樹只有一個根節(jié)點);
所有葉子結點都出現(xiàn)在同一層,葉子結點不包含任何關鍵字信息(可以看做是外部接點或查詢失敗的接點,實際上這些結點不存在,指向這些結點的指針都為null);
每個非終端結點中包含有n個關鍵字信息: (n,P0,K1,P1,K2,P2,......,Kn,Pn)。其中:
???????a)???Ki (i=1...n)為關鍵字,且關鍵字按順序升序排序K(i-1)< Ki。?
???????b)???Pi為指向子樹根的接點,且指針P(i-1)指向子樹種所有結點的關鍵字均小于Ki,但都大于K(i-1)。?
???????c)???除根結點之外的結點的關鍵字的個數(shù)n必須滿足: [ceil(m / 2)-1]<= n <= m-1(葉子結點也必須滿足此條關于關鍵字數(shù)的性質,根結點除外)。
ok,下面咱們以一棵5階(即樹中任一結點至多含有4個關鍵字,5棵子樹)B樹實例進行講解(如下圖所示):

備注:關鍵字數(shù)(2-4個)針對--非根結點(包括葉子結點在內),孩子數(shù)(3-5個)--針對根結點和葉子結點之外的內結點。當然,根結點是必須至少有2個孩子的,不然就成直線型搜索樹了。下圖中,讀者可以看到關鍵字數(shù)2-4個,內結點孩子數(shù)3-5個:

關鍵字為大寫字母,順序為字母升序。

結點定義如下:

typedef?struct{

???int?Count;?????????//?當前節(jié)點中關鍵元素數(shù)目

???ItemType?Key[4];???//?存儲關鍵字元素的數(shù)組

???long?Branch[5];????//?偽指針數(shù)組,(記錄數(shù)目)方便判斷合并和分裂的情況

}?NodeType;

?

6.1、插入(insert)操作

插入一個元素時,首先在B樹中是否存在,如果不存在,即在葉子結點處結束,然后在葉子結點中插入該新的元素,注意:如果葉子結點空間足夠,這里需要向右移動該葉子結點中大于新插入關鍵字的元素,如果空間滿了以致沒有足夠的空間去添加新的元素,則將該結點進行“分裂”,將一半數(shù)量的關鍵字元素分裂到新的其相鄰右結點中,中間關鍵字元素上移到父結點中(當然,如果父結點空間滿了,也同樣需要“分裂”操作),而且當結點中關鍵元素向右移動了,相關的指針也需要向右移。如果在根結點插入新元素,空間滿了,則進行分裂操作,這樣原來的根結點中的中間關鍵字元素向上移動到新的根結點中,因此導致樹的高度增加一層。如下圖所示:

1、OK,下面咱們通過一個實例來逐步講解下。插入以下字符字母到一棵空的B?樹中(非根結點關鍵字數(shù)小了(小于2個)就合并,大了(超過4個)就分裂):C?N?G?A?H?E?K?Q?M?F?W?L?T?Z?D?P?R?X?Y?S,首先,結點空間足夠,4個字母插入相同的結點中,如下圖:

?

2、當咱們試著插入H時,結點發(fā)現(xiàn)空間不夠,以致將其分裂成2個結點,移動中間元素G上移到新的根結點中,在實現(xiàn)過程中,咱們把A和C留在當前結點中,而H和N放置新的其右鄰居結點中。如下圖:

?

3、當咱們插入E,K,Q時,不需要任何分裂操作

?

?

?

?

?

?

?

?

?

?

?

?

4、插入M需要一次分裂,注意M恰好是中間關鍵字元素,以致向上移到父節(jié)點中

?

5、插入F,W,L,T不需要任何分裂操作

?

6、插入Z時,最右的葉子結點空間滿了,需要進行分裂操作,中間元素T上移到父節(jié)點中,注意通過上移中間元素,樹最終還是保持平衡,分裂結果的結點存在2個關鍵字元素。

?

7、插入D時,導致最左邊的葉子結點被分裂,D恰好也是中間元素,上移到父節(jié)點中,然后字母P,R,X,Y陸續(xù)插入不需要任何分裂操作(別忘了,樹中至多5個孩子)。

?

8、最后,當插入S時,含有N,P,Q,R的結點需要分裂,把中間元素Q上移到父節(jié)點中,但是情況來了,父節(jié)點中空間已經滿了,所以也要進行分裂,將父節(jié)點中的中間元素M上移到新形成的根結點中,注意以前在父節(jié)點中的第三個指針在修改后包括D和G節(jié)點中。這樣具體插入操作的完成,下面介紹刪除操作,刪除操作相對于插入操作要考慮的情況多點。

?

6.2、刪除(delete)操作

首先查找B樹中需刪除的元素,如果該元素在B樹中存在,則將該元素在其結點中進行刪除,如果刪除該元素后,首先判斷該元素是否有左右孩子結點,如果有,則上移孩子結點中的某相近元素(“左孩子最右邊的節(jié)點”或“右孩子最左邊的節(jié)點”)到父節(jié)點中,然后是移動之后的情況;如果沒有,直接刪除后,移動之后的情況。

刪除元素,移動相應元素之后,如果某結點中元素數(shù)目(即關鍵字數(shù))小于ceil(m/2)-1,則需要看其某相鄰兄弟結點是否豐滿(結點中元素個數(shù)大于ceil(m/2)-1)(還記得第一節(jié)中關于B樹的第5個特性中的c點么?:?c)除根結點之外的結點(包括葉子結點)的關鍵字的個數(shù)n必須滿足: (ceil(m / 2)-1)<= n <= m-1。m表示最多含有m個孩子,n表示關鍵字數(shù)。在本小節(jié)中舉的一顆B樹的示例中,關鍵字數(shù)n滿足:2<=n<=4),如果豐滿,則向父節(jié)點借一個元素來滿足條件;如果其相鄰兄弟都剛脫貧,即借了之后其結點數(shù)目小于ceil(m/2)-1,則該結點與其相鄰的某一兄弟結點進行“合并”成一個結點,以此來滿足條件。那咱們通過下面實例來詳細了解吧。

以上述插入操作構造的一棵5階B樹(樹中最多含有m(m=5)個孩子,因此關鍵字數(shù)最小為ceil(m / 2)-1=2。還是這句話,關鍵字數(shù)小了(小于2個)就合并,大了(超過4個)就分裂)為例,依次刪除H,T,R,E。

1、首先刪除元素H,當然首先查找H,H在一個葉子結點中,且該葉子結點元素數(shù)目3大于最小元素數(shù)目ceil(m/2)-1=2,則操作很簡單,咱們只需要移動K至原來H的位置,移動L至K的位置(也就是結點中刪除元素后面的元素向前移動)

?

2、下一步,刪除T,因為T沒有在葉子結點中,而是在中間結點中找到,咱們發(fā)現(xiàn)他的繼承者W(字母升序的下個元素),將W上移到T的位置,然后將原包含W的孩子結點中的W進行刪除,這里恰好刪除W后,該孩子結點中元素個數(shù)大于2,無需進行合并操作。

?

3、下一步刪除R,R在葉子結點中,但是該結點中元素數(shù)目為2,刪除導致只有1個元素,已經小于最小元素數(shù)目ceil(5/2)-1=2,而由前面我們已經知道:如果其某個相鄰兄弟結點中比較豐滿(元素個數(shù)大于ceil(5/2)-1=2),則可以向父結點借一個元素,然后將最豐滿的相鄰兄弟結點中上移最后或最前一個元素到父節(jié)點中(有沒有看到紅黑樹中左旋操作的影子?),在這個實例中,右相鄰兄弟結點中比較豐滿(3個元素大于2),所以先向父節(jié)點借一個元素W下移到該葉子結點中,代替原來S的位置,S前移;然后X在相鄰右兄弟結點中上移到父結點中,最后在相鄰右兄弟結點中刪除X,后面元素前移。

?

4、最后一步刪除E,?刪除后會導致很多問題,因為E所在的結點數(shù)目剛好達標,剛好滿足最小元素個數(shù)(ceil(5/2)-1=2),而相鄰的兄弟結點也是同樣的情況,刪除一個元素都不能滿足條件,所以需要該節(jié)點與某相鄰兄弟結點進行合并操作;首先移動父結點中的元素(該元素在兩個需要合并的兩個結點元素之間)下移到其子結點中,然后將這兩個結點進行合并成一個結點。所以在該實例中,咱們首先將父節(jié)點中的元素D下移到已經刪除E而只有F的結點中,然后將含有D和F的結點和含有A,C的相鄰兄弟結點進行合并成一個結點。

?

5、也許你認為這樣刪除操作已經結束了,其實不然,在看看上圖,對于這種特殊情況,你立即會發(fā)現(xiàn)父節(jié)點只包含一個元素G,沒達標(因為非根節(jié)點包括葉子結點的關鍵字數(shù)n必須滿足于2=<n<=4,而此處的n=1),這是不能夠接受的。如果這個問題結點的相鄰兄弟比較豐滿,則可以向父結點借一個元素。假設這時右兄弟結點(含有Q,X)有一個以上的元素(Q右邊還有元素),然后咱們將M下移到元素很少的子結點中,將Q上移到M的位置,這時,Q的左子樹將變成M的右子樹,也就是含有N,P結點被依附在M的右指針上。所以在這個實例中,咱們沒有辦法去借一個元素,只能與兄弟結點進行合并成一個結點,而根結點中的唯一元素M下移到子結點,這樣,樹的高度減少一層。

?

為了進一步詳細討論刪除的情況,再舉另外一個實例:

這里是一棵不同的5序B樹,那咱們試著刪除C

?

于是將刪除元素C的右子結點中的D元素上移到C的位置,但是出現(xiàn)上移元素后,只有一個元素的結點的情況。

又因為含有E的結點,其相鄰兄弟結點才剛脫貧(最少元素個數(shù)為2),不可能向父節(jié)點借元素,所以只能進行合并操作,于是這里將含有A,B的左兄弟結點和含有E的結點進行合并成一個結點。

?

這樣又出現(xiàn)只含有一個元素F結點的情況,這時,其相鄰的兄弟結點是豐滿的(元素個數(shù)為3>最小元素個數(shù)2),這樣就可以想父結點借元素了,把父結點中的J下移到該結點中,相應的如果結點中J后有元素則前移,然后相鄰兄弟結點中的第一個元素(或者最后一個元素)上移到父節(jié)點中,后面的元素(或者前面的元素)前移(或者后移);注意含有K,L的結點以前依附在M的左邊,現(xiàn)在變?yōu)橐栏皆贘的右邊。這樣每個結點都滿足B樹結構性質。

?

從以上操作可看出:除根結點之外的結點(包括葉子結點)的關鍵字的個數(shù)n滿足:(ceil(m / 2)-1)<= n <= m-1,即2<=n<=4。這也佐證了咱們之前的觀點。刪除操作完。

?

7.總結

通過以上介紹,大致將B樹,B+樹,B*樹總結如下:

B樹:有序數(shù)組+平衡多叉樹;

B+樹:有序數(shù)組鏈表+平衡多叉樹;

B*樹:一棵豐滿的B+樹。
????在大規(guī)模數(shù)據(jù)存儲的文件系統(tǒng)中,B~tree系列數(shù)據(jù)結構,起著很重要的作用,對于存儲不同的數(shù)據(jù),節(jié)點相關的信息也是有所不同,這里根據(jù)自己的理解,畫的一個查找以職工號為關鍵字,職工號為38的記錄的簡單示意圖。(這里假設每個物理塊容納3個索引,磁盤的I/O操作的基本單位是塊(block),磁盤訪問很費時,采用B+樹有效的減少了訪問磁盤的次數(shù)。)

對于像MySQL,DB2,Oracle等數(shù)據(jù)庫中的索引結構得有較深入的了解才行,建議去找一些B 樹相關的開源代碼研究。

走進搜索引擎的作者梁斌老師針對B樹、B+樹給出了他的意見(為了真實性,特引用其原話,未作任何改動):?“B+樹還有一個最大的好處,方便掃庫,B樹必須用中序遍歷的方法按序掃庫,而B+樹直接從葉子結點挨個掃一遍就完了,B+樹支持range-query非常方便,而B樹不支持。這是數(shù)據(jù)庫選用B+樹的最主要原因。

????比如要查 5-10之間的,B+樹一把到5這個標記,再一把到10,然后串起來就行了,B樹就非常麻煩。B樹的好處,就是成功查詢特別有利,因為樹的高度總體要比B+樹矮。不成功的情況下,B樹也比B+樹稍稍占一點點便宜。

????B樹比如你的例子中查,17的話,一把就得到結果了,
有很多基于頻率的搜索是選用B樹,越頻繁query的結點越往根上走,前提是需要對query做統(tǒng)計,而且要對key做一些變化。

????另外B樹也好B+樹也好,根或者上面幾層因為被反復query,所以這幾塊基本都在內存中,不會出現(xiàn)讀磁盤IO,一般已啟動的時候,就會主動換入內存。”非常感謝。

????Bucket Li:"mysql 底層存儲是用B+樹實現(xiàn)的,知道為什么么。內存中B+樹是沒有優(yōu)勢的,但是一到磁盤,B+樹的威力就出來了"。

?


第二節(jié)、R樹:處理空間存儲問題
相信經過上面第一節(jié)的介紹,你已經對B樹或者B+樹有所了解。這種樹可以非常好的處理一維空間存儲的問題。B樹是一棵平衡樹,它是把一維直線分為若干段線段,當我們查找滿足某個要求的點的時候,只要去查找它所屬的線段即可。依我看來,這種思想其實就是先找一個大的空間,再逐步縮小所要查找的空間,最終在一個自己設定的最小不可分空間內找出滿足要求的解。一個典型的B樹查找如下:

?

要查找某一滿足條件的點,先去找到滿足條件的線段,然后遍歷所在線段上的點,即可找到答案。

B樹是一種相對來說比較復雜的數(shù)據(jù)結構,尤其是在它的刪除與插入操作過程中,因為它涉及到了葉子結點的分解與合并。由于本文第一節(jié)已經詳細介紹了B樹和B+樹,下面直接開始介紹我們的第二個主角:R樹。

?

簡介
1984年,加州大學伯克利分校的Guttman發(fā)表了一篇題為“R-trees: a dynamic index structure for spatial searching”的論文,向世人介紹了R樹這種處理高維空間存儲問題的數(shù)據(jù)結構。本文便是基于這篇論文寫作完成的,因此如果大家對R樹非常有興趣,我想最好還是參考一下原著:)。為表示對這位牛人的尊重,給個引用先:

Guttman, A.; “R-trees: a dynamic index structure for spatial searching,” ACM, 1984, 14

R樹在數(shù)據(jù)庫等領域做出的功績是非常顯著的。它很好的解決了在高維空間搜索等問題。舉個R樹在現(xiàn)實領域中能夠解決的例子:查找20英里以內所有的餐廳。如果沒有R樹你會怎么解決?一般情況下我們會把餐廳的坐標(x,y)分為兩個字段存放在數(shù)據(jù)庫中,一個字段記錄經度,另一個字段記錄緯度。這樣的話我們就需要遍歷所有的餐廳獲取其位置信息,然后計算是否滿足要求。如果一個地區(qū)有100家餐廳的話,我們就要進行100次位置計算操作了,如果應用到谷歌地圖這種超大數(shù)據(jù)庫中,這種方法便必定不可行了。

R樹就很好的解決了這種高維空間搜索問題。它把B樹的思想很好的擴展到了多維空間,采用了B樹分割空間的思想,并在添加、刪除操作時采用合并、分解結點的方法,保證樹的平衡性。因此,R樹就是一棵用來存儲高維數(shù)據(jù)的平衡樹。

OK,接下來,本文將詳細介紹R樹的數(shù)據(jù)結構以及R樹的操作。至于R樹的擴展與R樹的性能問題,可以查閱相關論文。

?

R樹的數(shù)據(jù)結構
如上所述,R樹是B樹在高維空間的擴展,是一棵平衡樹。每個R樹的葉子結點包含了多個指向不同數(shù)據(jù)的指針,這些數(shù)據(jù)可以是存放在硬盤中的,也可以是存在內存中。根據(jù)R樹的這種數(shù)據(jù)結構,當我們需要進行一個高維空間查詢時,我們只需要遍歷少數(shù)幾個葉子結點所包含的指針,查看這些指針指向的數(shù)據(jù)是否滿足要求即可。這種方式使我們不必遍歷所有數(shù)據(jù)即可獲得答案,效率顯著提高。下圖1是R樹的一個簡單實例:

我們在上面說過,R樹運用了空間分割的理念,這種理念是如何實現(xiàn)的呢?R樹采用了一種稱為MBR(Minimal Bounding Rectangle)的方法,在此我把它譯作“最小邊界矩形”。從葉子結點開始用矩形(rectangle)將空間框起來,結點越往上,框住的空間就越大,以此對空間進行分割。有點不懂?沒關系,繼續(xù)往下看。在這里我還想提一下,R樹中的R應該代表的是Rectangle(此處參考wikipedia上關于R樹的介紹),而不是大多數(shù)國內教材中所說的Region(很多書把R樹稱為區(qū)域樹,這是有誤的)。我們就拿二維空間來舉例。下圖是Guttman論文中的一幅圖:

?

我來詳細解釋一下這張圖。先來看圖(b)

首先我們假設所有數(shù)據(jù)都是二維空間下的點,圖中僅僅標志了R8區(qū)域中的數(shù)據(jù),也就是那個shape of data object。別把那一塊不規(guī)則圖形看成一個數(shù)據(jù),我們把它看作是多個數(shù)據(jù)圍成的一個區(qū)域。為了實現(xiàn)R樹結構,我們用一個最小邊界矩形恰好框住這個不規(guī)則區(qū)域,這樣,我們就構造出了一個區(qū)域:R8。R8的特點很明顯,就是正正好好框住所有在此區(qū)域中的數(shù)據(jù)。其他實線包圍住的區(qū)域,如R9,R10,R12等都是同樣的道理。這樣一來,我們一共得到了12個最最基本的最小矩形。這些矩形都將被存儲在子結點中。
下一步操作就是進行高一層次的處理。我們發(fā)現(xiàn)R8,R9,R10三個矩形距離最為靠近,因此就可以用一個更大的矩形R3恰好框住這3個矩形。
同樣道理,R15,R16被R6恰好框住,R11,R12被R4恰好框住,等等。所有最基本的最小邊界矩形被框入更大的矩形中之后,再次迭代,用更大的框去框住這些矩形。
我想大家都應該理解這個數(shù)據(jù)結構的特征了。用地圖的例子來解釋,就是所有的數(shù)據(jù)都是餐廳所對應的地點,先把相鄰的餐廳劃分到同一塊區(qū)域,劃分好所有餐廳之后,再把鄰近的區(qū)域劃分到更大的區(qū)域,劃分完畢后再次進行更高層次的劃分,直到劃分到只剩下兩個最大的區(qū)域為止。要查找的時候就方便了。

下面就可以把這些大大小小的矩形存入我們的R樹中去了。根結點存放的是兩個最大的矩形,這兩個最大的矩形框住了所有的剩余的矩形,當然也就框住了所有的數(shù)據(jù)。下一層的結點存放了次大的矩形,這些矩形縮小了范圍。每個葉子結點都是存放的最小的矩形,這些矩形中可能包含有n個數(shù)據(jù)。

在這里,讀者先不要去糾結于如何劃分數(shù)據(jù)到最小區(qū)域矩形,也不要糾結怎樣用更大的矩形框住小矩形,這些都是下一節(jié)我們要討論的。

講完了基本的數(shù)據(jù)結構,我們來講個實例,如何查詢特定的數(shù)據(jù)。又以餐廳為例,假設我要查詢廣州市天河區(qū)天河城附近一公里的所有餐廳地址怎么辦?

打開地圖(也就是整個R樹),先選擇國內還是國外(也就是根結點)。
然后選擇華南地區(qū)(對應第一層結點),選擇廣州市(對應第二層結點),
再選擇天河區(qū)(對應第三層結點),
最后選擇天河城所在的那個區(qū)域(對應葉子結點,存放有最小矩形),遍歷所有在此區(qū)域內的結點,看是否滿足我們的要求即可。
怎么樣,其實R樹的查找規(guī)則跟查地圖很像吧?對應下圖:


一棵R樹滿足如下的性質:

1.?????除非它是根結點之外,所有葉子結點包含有m至M個記錄索引(條目)。作為根結點的葉子結點所具有的記錄個數(shù)可以少于m。通常,m=M/2。

2.?????對于所有在葉子中存儲的記錄(條目),I是最小的可以在空間中完全覆蓋這些記錄所代表的點的矩形(注意:此處所說的“矩形”是可以擴展到高維空間的)。

3.?????每一個非葉子結點擁有m至M個孩子結點,除非它是根結點。

4.?????對于在非葉子結點上的每一個條目,i是最小的可以在空間上完全覆蓋這些條目所代表的店的矩形(同性質2)。

5.?????所有葉子結點都位于同一層,因此R樹為平衡樹。

葉子結點的結構
先來探究一下葉子結點的結構。葉子結點所保存的數(shù)據(jù)形式為:(I, tuple-identifier)。

??????其中,tuple-identifier表示的是一個存放于數(shù)據(jù)庫中的tuple,也就是一條記錄,它是n維的。I是一個n維空間的矩形,并可以恰好框住這個葉子結點中所有記錄代表的n維空間中的點。I=(I0,I1,…,In-1)。其結構如下圖所示:

下圖描述的就是在二維空間中的葉子結點所要存儲的信息。

?

在這張圖中,I所代表的就是圖中的矩形,其范圍是a<=I0<=b,c<=I1<=d。有兩個tuple-identifier,在圖中即表示為那兩個點。這種形式完全可以推廣到高維空間。大家簡單想想三維空間中的樣子就可以了。這樣,葉子結點的結構就介紹完了。

?

非葉子結點
??????非葉子結點的結構其實與葉子結點非常類似。想象一下B樹就知道了,B樹的葉子結點存放的是真實存在的數(shù)據(jù),而非葉子結點存放的是這些數(shù)據(jù)的“邊界”,或者說也算是一種索引(有疑問的讀者可以回顧一下上述第一節(jié)中講解B樹的部分)。

??????同樣道理,R樹的非葉子結點存放的數(shù)據(jù)結構為:(I, child-pointer)。

??????其中,child-pointer是指向孩子結點的指針,I是覆蓋所有孩子結點對應矩形的矩形。這邊有點拗口,但我想不是很難懂?給張圖:

?

D,E,F,G為孩子結點所對應的矩形。A為能夠覆蓋這些矩形的更大的矩形。這個A就是這個非葉子結點所對應的矩形。這時候你應該悟到了吧?無論是葉子結點還是非葉子結點,它們都對應著一個矩形。樹形結構上層的結點所對應的矩形能夠完全覆蓋它的孩子結點所對應的矩形。根結點也唯一對應一個矩形,而這個矩形是可以覆蓋所有我們擁有的數(shù)據(jù)信息在空間中代表的點的。

我個人感覺這張圖畫的不那么精確,應該是矩形A要恰好覆蓋D,E,F,G,而不應該再留出這么多沒用的空間了。但為尊重原圖的繪制者,特不作修改。

?

R樹的操作
這一部分也許是編程者最關注的問題了。這么高效的數(shù)據(jù)結構該如何去實現(xiàn)呢?這便是這一節(jié)需要闡述的問題。

?

搜索
R樹的搜索操作很簡單,跟B樹上的搜索十分相似。它返回的結果是所有符合查找信息的記錄條目。而輸入是什么?就我個人的理解,輸入不僅僅是一個范圍了,它更可以看成是一個空間中的矩形。也就是說,我們輸入的是一個搜索矩形。

先給出偽代碼:

Function:Search

描述:假設T為一棵R樹的根結點,查找所有搜索矩形S覆蓋的記錄條目。

S1:[查找子樹] 如果T是非葉子結點,如果T所對應的矩形與S有重合,那么檢查所有T中存儲的條目,對于所有這些條目,使用Search操作作用在每一個條目所指向的子樹的根結點上(即T結點的孩子結點)。

S2:[查找葉子結點] 如果T是葉子結點,如果T所對應的矩形與S有重合,那么直接檢查S所指向的所有記錄條目。返回符合條件的記錄。

我們通過下圖來理解這個Search操作。

?

?

陰影部分所對應的矩形為搜索矩形。它與根結點對應的最大的矩形(未畫出)有重疊。這樣將Search操作作用在其兩個子樹上。兩個子樹對應的矩形分別為R1與R2。搜索R1,發(fā)現(xiàn)與R1中的R4矩形有重疊,繼續(xù)搜索R4。最終在R4所包含的R11與R12兩個矩形中查找是否有符合條件的記錄。搜索R2的過程同樣如此。很顯然,該算法進行的是一個迭代操作。

?

插入

??????R樹的插入操作也同B樹的插入操作類似。當新的數(shù)據(jù)記錄需要被添加入葉子結點時,若葉子結點溢出,那么我們需要對葉子結點進行分裂操作。顯然,葉子結點的插入操作會比搜索操作要復雜。插入操作需要一些輔助方法才能夠完成。

來看一下偽代碼:

Function:Insert

描述:將新的記錄條目E插入給定的R樹中。

I1:[為新記錄找到合適插入的葉子結點] 開始ChooseLeaf方法選擇葉子結點L以放置記錄E。

I2:[添加新記錄至葉子結點] 如果L有足夠的空間來放置新的記錄條目,則向L中添加E。如果沒有足夠的空間,則進行SplitNode方法以獲得兩個結點L與LL,這兩個結點包含了所有原來葉子結點L中的條目與新條目E。

I3:[將變換向上傳遞] 開始對結點L進行AdjustTree操作,如果進行了分裂操作,那么同時需要對LL進行AdjustTree操作。

I4:[對樹進行增高操作] 如果結點分裂,且該分裂向上傳播導致了根結點的分裂,那么需要創(chuàng)建一個新的根結點,并且讓它的兩個孩子結點分別為原來那個根結點分裂后的兩個結點。

?

Function:ChooseLeaf

描述:選擇葉子結點以放置新條目E。

CL1:[Initialize] 設置N為根結點。

CL2:[葉子結點的檢查] 如果N為葉子結點,則直接返回N。

CL3:[選擇子樹] 如果N不是葉子結點,則遍歷N中的結點,找出添加E.I時擴張最小的結點,并把該結點定義為F。如果有多個這樣的結點,那么選擇面積最小的結點。

CL4:[下降至葉子結點] 將N設為F,從CL2開始重復操作。

?

Function:AdjustTree

描述:葉子結點的改變向上傳遞至根結點以改變各個矩陣。在傳遞變換的過程中可能會產生結點的分裂。

AT1:[初始化] 將N設為L。

AT2:[檢驗是否完成] 如果N為根結點,則停止操作。

AT3:[調整父結點條目的最小邊界矩形] 設P為N的父節(jié)點,EN為指向在父節(jié)點P中指向N的條目。調整EN.I以保證所有在N中的矩形都被恰好包圍。

AT4:[向上傳遞結點分裂] 如果N有一個剛剛被分裂產生的結點NN,則創(chuàng)建一個指向NN的條目ENN。如果P有空間來存放ENN,則將ENN添加到P中。如果沒有,則對P進行SplitNode操作以得到P和PP。

AT5:[升高至下一級] 如果N等于L且發(fā)生了分裂,則把NN置為PP。從AT2開始重復操作。

?

同樣,我們用圖來更加直觀的理解這個插入操作。

?

?

????我們來通過圖分析一下插入操作。現(xiàn)在我們需要插入R21這個矩形。開始時我們進行ChooseLeaf操作。在根結點中有兩個條目,分別為R1,R2。其實R1已經完全覆蓋了R21,而若向R2中添加R21,則會使R2.I增大很多。顯然我們選擇R1插入。然后進行下一級的操作。相比于R4,向R3中添加R21會更合適,因為R3覆蓋R21所需增大的面積相對較小。這樣就在R8,R9,R10所在的葉子結點中插入R21。由于葉子結點沒有足夠空間,則要進行分裂操作。

????插入操作如下圖所示:

?

這個插入操作其實類似于第一節(jié)中B樹的插入操作,這里不再具體介紹,不過想必看過上面的偽代碼大家應該也清楚了。

?


刪除
R樹的刪除操作與B樹的刪除操作會有所不同,不過同B樹一樣,會涉及到壓縮等操作。相信讀者看完以下的偽代碼之后會有所體會。R樹的刪除同樣是比較復雜的,需要用到一些輔助函數(shù)來完成整個操作。

偽代碼如下:

Function:Delete

描述:將一條記錄E從指定的R樹中刪除。

D1:[找到含有記錄的葉子結點] 使用FindLeaf方法找到包含有記錄E的葉子結點L。如果搜索失敗,則直接終止。

D2:[刪除記錄] 將E從L中刪除。

D3:[傳遞記錄] 對L使用CondenseTree操作

D4:[縮減樹] 當經過以上調整后,如果根結點只包含有一個孩子結點,則將這個唯一的孩子結點設為根結點。

?

Function:FindLeaf

描述:根結點為T,期望找到包含有記錄E的葉子結點。

FL1:[搜索子樹] 如果T不是葉子結點,則檢查每一條T中的條目F,找出與E所對應的矩形相重合的F(不必完全覆蓋)。對于所有滿足條件的F,對其指向的孩子結點進行FindLeaf操作,直到尋找到E或者所有條目均以被檢查過。

FL2:[搜索葉子結點以找到記錄] 如果T是葉子結點,那么檢查每一個條目是否有E存在,如果有則返回T。

?

Function:CondenseTree

描述:L為包含有被刪除條目的葉子結點。如果L的條目數(shù)過少(小于要求的最小值m),則必須將該葉子結點L從樹中刪除。經過這一刪除操作,L中的剩余條目必須重新插入樹中。此操作將一直重復直至到達根結點。同樣,調整在此修改樹的過程所經過的路徑上的所有結點對應的矩形大小。

CT1:[初始化] 令N為L。初始化一個用于存儲被刪除結點包含的條目的鏈表Q。

CT2:[找到父條目] 如果N為根結點,那么直接跳轉至CT6。否則令P為N 的父結點,令EN為P結點中存儲的指向N的條目。

CT3:[刪除下溢結點] 如果N含有條目數(shù)少于m,則從P中刪除EN,并把結點N中的條目添加入鏈表Q中。

CT4:[調整覆蓋矩形] 如果N沒有被刪除,則調整EN.I使得其對應矩形能夠恰好覆蓋N中的所有條目所對應的矩形。

CT5:[向上一層結點進行操作] 令N等于P,從CT2開始重復操作。

CT6:[重新插入孤立的條目] 所有在Q中的結點中的條目需要被重新插入。原來屬于葉子結點的條目可以使用Insert操作進行重新插入,而那些屬于非葉子結點的條目必須插入刪除之前所在層的結點,以確保它們所指向的子樹還處于相同的層。

?

??????R樹刪除記錄過程中的CondenseTree操作是不同于B樹的。我們知道,B樹刪除過程中,如果出現(xiàn)結點的記錄數(shù)少于半滿(即下溢)的情況,則直接把這些記錄與其他葉子的記錄“融合”,也就是說兩個相鄰結點合并。然而R樹卻是直接重新插入。

?

同樣,我們用圖直觀的說明這個操作。

?

假設結點最大條目數(shù)為4,最小條目數(shù)為2。在這張圖中,我們的目標是刪除記錄c。首先使用FindLeaf操作找到c所處在的葉子結點的位置——R11。當c從R11刪除時,R11就只有一條記錄了,少于最小條目數(shù)2,出現(xiàn)下溢,此時要調用CondenseTree操作。這樣,c被刪除,R11剩余的條目——指向記錄d的指針——被插入鏈表Q。然后向更高一層的結點進行此操作。這樣R12會被插入鏈表中。原理是一樣的,在這里就不再贅述。

有一點需要解釋的是,我們發(fā)現(xiàn)這個刪除操作向上傳遞之后,根結點的條目R1也被插入了Q中,這樣根結點只剩下了R2。別著急,重新插入操作會有效的解決這個問題。我們插入R3,R12,d至它原來所處的層。這樣,我們發(fā)現(xiàn)根結點只有一個條目了,此時根據(jù)Inert中的操作,我們把這個根結點刪除,它的孩子結點,即R5,R6,R7,R3所在的結點被置為根結點。至此,刪除操作結束。

?

結語
??????R樹是一種能夠有效進行高維空間搜索的數(shù)據(jù)結構,它已經被廣泛應用在各種數(shù)據(jù)庫及其相關的應用中。但R樹的處理也具有局限性,它的最佳應用范圍是處理2至6維的數(shù)據(jù),更高維的存儲會變得非常復雜,這樣就不適用了。近年來,R樹也出現(xiàn)了很多變體,R*樹就是其中的一種。這些變體提升了R樹的性能,感興趣的讀者可以參考相關文獻。文章有任何錯誤,還望各位讀者不吝賜教。本文完。

?

參考文獻以及推薦閱讀:

1.???Organization and Maintenance of Large Ordered Indices

2.???the ubiquitous B tree

3.???http://en.wikipedia.org/wiki/Btree (給出了國外一些開源地址)

4. ??http://en.wikipedia.org/wiki/Btree#Technical_description

5.???http://cis.stvincent.edu/html/tutorials/swd/btree/btree.html(include C++ source code)

6.???http://slady.net/java/bt/view.php(如果了解了B-tree結構,該地址可以在線對該結構進行查找(search),插入(insert),刪除(delete)操作。)
7. Guttman, A.; “R-trees: a dynamic index structure for spatial searching,” ACM, 1984, 14

8. http://www.cnblogs.com/CareySon/archive/2012/04/06/2435349.html;

9.?http://baike.baidu.com/view/298408.htm。

10.?http://www.cnblogs.com/leoo2sk/archive/2011/07/10/mysql-index.html?(介紹了mysql中myisam和innodb這兩種引擎的內部索引機制,以及對不同字段的索引時,檢索效率上的對比,主要也是基于其內部機制的理解)

11.?http://www.oschina.net/news/31988/mysql-indexing-best-practices?(MySQL 索引最佳實踐);

12.?http://idlebox.net/2007/stx-btree/(此頁面包含B樹生成構造的一些演示demo)。
?

?

總結

以上是生活随笔為你收集整理的B树、B+树、B*树谈到R 树的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。

精品国产一区二区三区在线 | 国产91aaa| 日日夜夜精品 | 日韩欧美一区二区三区黑寡妇 | 99久久久国产精品免费99 | 青青草国产精品 | 婷婷五情天综123 | 国产精品日韩在线 | www.av免费观看 | 久久av中文字幕片 | 91理论电影 | 四虎影视精品永久在线观看 | 国产精品一区二区三区四区在线观看 | 一区二区视频免费在线观看 | 亚洲日本欧美 | 国产成人精品一区二区三区在线观看 | 日批网站在线观看 | 9热精品| 久久精品久久精品 | 久久久这里有精品 | 欧美午夜久久久 | 菠萝菠萝蜜在线播放 | 天天干天天插 | 亚洲天堂网视频在线观看 | 国产精品久久久久久高潮 | 福利二区视频 | 精品一区91 | 亚洲综合日韩在线 | 又紧又大又爽精品一区二区 | 超碰97在线资源站 | 9ⅰ精品久久久久久久久中文字幕 | 久草网首页 | 最近高清中文字幕 | 久久国产亚洲视频 | 黄色的网站在线 | 午夜黄网 | 美女久久精品 | 国产理伦在线 | 天堂视频中文在线 | 久久成人毛片 | 81国产精品久久久久久久久久 | 91chinesexxx| 免费在线91 | 韩国av不卡 | 特级a毛片| av在线超碰 | 狠狠色狠狠色综合日日92 | 久久草网站| 日韩免费视频线观看 | 久久久999免费视频 日韩网站在线 | 国产精品美女www爽爽爽视频 | 中文字幕在线观看免费高清完整版 | 日本久久电影网 | 特级黄录像视频 | 久久久免费视频播放 | 日日碰狠狠躁久久躁综合网 | 精品欧美小视频在线观看 | 日韩中文字幕91 | 欧美成人理伦片 | 99爱在线观看 | 欧美性生活免费看 | 久久香蕉电影 | 狠狠色丁香久久婷婷综合五月 | 国产精品久久久久久久久久免费 | 国产亚洲精品中文字幕 | 操少妇视频 | 天天干天天摸天天操 | 国产一区二区在线播放 | 91九色精品国产 | 国产精品av电影 | 日本中文乱码卡一卡二新区 | 黄色三级免费观看 | 国产精品第一页在线观看 | 久久综合亚洲鲁鲁五月久久 | 久久精品人 | 国产精品乱看 | 日韩精品电影在线播放 | 九色91av| av免费电影在线观看 | 日韩视频在线播放 | 天天操天天射天天舔 | 中文字幕在线观看资源 | 日韩三级不卡 | 久久免费视频这里只有精品 | 91丨九色丨国产在线观看 | 天天曰天天曰 | 在线亚洲日本 | 99精品国产高清在线观看 | 摸bbb搡bbb搡bbbb| 99在线高清视频在线播放 | 日本午夜在线观看 | 黄色av电影在线观看 | 在线观看亚洲视频 | 欧美亚洲三级 | 欧美激情xxxx性bbbb | 天堂在线一区二区三区 | 国产成人资源 | www免费看片com | 91超在线 | 亚洲黄色av网址 | 国产视频18| 日本精品午夜 | 成人影片在线免费观看 | 亚洲精品国偷自产在线91正片 | 国产亚洲久一区二区 | 婷婷激情网站 | 精品爱爱 | 久久夜色网 | 91精品一区二区三区蜜臀 | 国产999精品 | 韩国精品福利一区二区三区 | 成人免费av电影 | 国产成人高清 | 在线黄色免费av | 天堂在线一区二区三区 | 成人综合免费 | 日本色小说视频 | 日韩精品五月天 | 精品久久久久久亚洲综合网站 | 中文字幕在线看视频 | 国产精品99久久免费黑人 | 国产亚洲激情视频在线 | 久久99热这里只有精品 | 午夜精品一区二区三区在线观看 | 特级西西www44高清大胆图片 | 欧美精品二区 | 日韩精品高清视频 | 人人干人人超 | 免费在线一区二区 | 免费看一及片 | 精品视频亚洲 | 亚洲精品久久久久www | 美女久久99| 婷婷色婷婷 | 久久久久久久久久网站 | 久久精品网址 | 天天操天天干天天插 | 欧美日韩伦理一区 | 日韩欧美一区二区在线播放 | 久久影视精品 | 三级午夜片 | 国产精品免费av | 色婷婷丁香 | 国产精品99久久久久久宅男 | 久久久久高清 | 欧美性做爰猛烈叫床潮 | 在线免费视频a | 一区二区三区四区免费视频 | 久久伦理影院 | 国产精品刺激对白麻豆99 | 欧美日韩在线网站 | 日韩亚洲精品电影 | 国产黄色特级片 | 免费看一级黄色大全 | 日本久久久精品视频 | 97视频在线观看网址 | 一区二区三区在线视频111 | 波多野结衣一区 | 亚洲黄色成人网 | 亚洲欧洲精品在线 | 中文一区在线 | 国产视频1 | 亚洲午夜精品一区二区三区电影院 | 久久视频免费 | 久久免费视频一区 | 91精品夜夜 | 国产色一区| 日韩中文字幕视频在线观看 | 91视频链接 | 色停停五月天 | 国产99视频在线观看 | 免费高清在线观看成人 | 久久久精品网站 | 欧美成人性战久久 | a v在线视频 | 日本精品视频免费观看 | 激情中文字幕 | 美女视频免费精品 | 一二三区视频在线 | 国产乱码精品一区二区三区介绍 | 国产资源网站 | 久久精品男人的天堂 | 中文日韩在线视频 | 国产精品一区二区美女视频免费看 | 欧美日bb| 人人澡超碰碰97碰碰碰软件 | 国产精品久久久免费 | 国产精品久久久av久久久 | 国产精品男女视频 | 探花视频在线观看免费 | 天天操操操操操 | 国产精品久久久久国产精品日日 | 日韩资源视频 | 色香天天 | 激情视频二区 | 天天干,天天操,天天射 | 亚洲成人资源 | 日日操天天操夜夜操 | 国产香蕉视频在线观看 | 开心激情五月网 | 人九九精品| 在线观看国产一区二区 | 97国产情侣爱久久免费观看 | 啪啪激情网 | 国产精品视频999 | 91成人在线网站 | 99精品国产高清在线观看 | 欧美一级特黄高清视频 | 日本丶国产丶欧美色综合 | 久久综合在线 | 色黄久久久久久 | 伊人一级| 91高清免费看 | 亚洲1区在线 | 天天操天天插 | 久久综合色综合88 | 国产精品视频你懂的 | 一区二区不卡高清 | 在线免费高清一区二区三区 | 国产亚洲视频在线观看 | 新版资源中文在线观看 | 国产精品嫩草69影院 | 一区二区三区久久精品 | 国产亚洲精品美女 | 婷婷丁香花 | 午夜久久影视 | 日韩不卡高清 | 黄色国产成人 | 成人一区二区三区中文字幕 | 国产成人黄色网址 | 最新国产精品视频 | 成人资源在线观看 | 欧美一区二区免费在线观看 | 色wwww| 色婷婷狠 | 超碰在线公开免费 | 韩日精品视频 | 亚洲精品影视 | 999热视频| 中文字幕精品www乱入免费视频 | 干av在线 | 人人爽人人爽人人 | 亚洲aⅴ免费在线观看 | 丝袜少妇在线 | 亚洲乱亚洲乱亚洲 | 久久精品79国产精品 | 中文字幕中文字幕在线中文字幕三区 | 中文超碰字幕 | 91综合在线| 一区二区视 | 久久精品视频在线观看 | 黄色毛片网站在线观看 | 日韩免费视频在线观看 | 激情五月婷婷激情 | 91中文字幕永久在线 | 亚洲成人999| 美女久久久久久久久久 | 精品国产诱惑 | 黄色大全免费观看 | 国产精品久久久久久爽爽爽 | 久久久精选 | av片免费播放 | 日韩在线观看精品 | 国产韩国精品一区二区三区 | 51久久成人国产精品麻豆 | 96超碰在线 | 午夜av免费观看 | 久久精品久久精品久久39 | 欧美视频不卡 | 黄色精品网站 | 国内揄拍国内精品 | 综合网在线视频 | 成年人在线播放视频 | 国产精品毛片一区 | www最近高清中文国语在线观看 | 日韩电影在线一区二区 | 国产在线欧美在线 | 久久精品国产久精国产 | 欧美成人视| 久草免费色站 | 网站免费黄 | 黄色a三级 | 成年人免费在线看 | 亚洲成人精品 | 欧美日韩国产精品一区二区三区 | 国产又粗又猛又色 | 99久久99久久精品国产片果冰 | 亚洲一区欧美精品 | 久久免费精品国产 | 天天久久综合 | 国产精品麻豆视频 | 最新午夜电影 | 久久夜视频 | 五月婷婷综合在线 | 欧美另类亚洲 | 日韩精品中文字幕在线 | av丁香花 | 日韩av成人在线观看 | 97色在线视频 | 国产亚洲精品成人av久久影院 | 国产亚洲一区 | 亚洲午夜精品久久久 | 国产999精品久久久久久 | 国产v在线| 婷婷五情天综123 | 日韩精品免费在线播放 | 天堂av网站| 亚洲高清色综合 | 亚洲午夜久久久久久久久久久 | 天堂av免费 | 国产一区视频免费在线观看 | 日韩在线观看免费 | 四虎8848免费高清在线观看 | 久久热首页 | 一区二区三区免费在线播放 | 九九热在线精品 | 国产一级电影在线 | 可以免费看av | 久操视频在线观看 | 国产成人精品综合 | 久久无码精品一区二区三区 | 亚洲四虎 | 91精彩视频 | 久草精品在线观看 | 久久99精品久久久久婷婷 | 四虎影视欧美 | 国产黄色精品视频 | 免费合欢视频成人app | 在线国产福利 | 亚洲另类视频 | 在线免费精品视频 | a黄色大片 | 激情五月开心 | 亚洲视频456 | 国产精品美女 | 国产九色91 | 欧美日韩免费网站 | 国语黄色片 | 天天操天天插 | 又大又硬又黄又爽视频在线观看 | 9ⅰ精品久久久久久久久中文字幕 | 国产精品久久免费看 | 亚洲精品xxxx | 国产麻豆视频免费观看 | 高清av不卡 | 国产福利91精品 | 日韩精品免费在线观看视频 | 九九视频网 | 91热精品| 日韩在线视频精品 | www.五月天婷婷.com | 免费观看一级视频 | 久久精品一区二区三区四区 | 在线av资源 | 国产精品麻豆91 | 啪啪免费观看网站 | 色噜噜日韩精品一区二区三区视频 | 欧美精品v国产精品v日韩精品 | 在线播放视频一区 | 欧美一级看片 | 国产精品视频999 | 国内视频一区二区 | 亚洲高清视频在线播放 | 成人国产网址 | 九九在线国产视频 | 99草视频 | 六月婷色 | 丁香婷婷综合激情 | 日本三级吹潮在线 | 日韩av快播电影网 | 久久久久亚洲精品国产 | 中文字幕国产一区 | 在线免费性生活片 | 99精品免费在线观看 | 不卡的av| 欧美一级性生活 | 欧美日韩国产色综合一二三四 | 亚洲成人999 | 欧美色综合天天久久综合精品 | 免费看三片 | 日韩 国产 | 丰满少妇在线观看 | 国产涩图| 国内久久久久久 | 一区二区三区视频在线 | 国产精品正在播放 | 国产成人精品免费在线观看 | 99久久精品日本一区二区免费 | 在线播放视频一区 | 国产传媒一区在线 | 免费观看一级特黄欧美大片 | 国产精品24小时在线观看 | 久久99精品久久久久久秒播蜜臀 | 国产精品片 | 精品999在线| 91高清完整版在线观看 | 这里只有精品视频在线 | 国产精品综合久久 | 欧美日韩网址 | 在线观看视频国产 | 午夜三级大片 | 久久99深爱久久99精品 | 久久精品日本啪啪涩涩 | 麻豆极品| 玖玖999 | 丝袜av一区 | 婷婷5月激情5月 | 中文字幕乱偷在线 | 亚洲成av人片 | 久久久久国产精品免费网站 | 91精品国产入口 | 国产日韩精品在线观看 | 久久久精品成人 | 日日夜夜免费精品 | 成人app在线播放 | 欧美特一级片 | 亚洲欧美日韩精品一区二区 | 在线看成人片 | 国产一区免费观看 | 亚洲无吗av| 亚洲天天综合网 | 九九视频一区 | 日韩二三区 | av久久久| 日韩av一区在线观看 | 精品国产色| 免费在线观看成人av | 免费在线播放黄色 | 91麻豆网| 国产亚洲一区 | 97香蕉久久超级碰碰高清版 | 国产成人精品亚洲精品 | 久久99精品久久久久婷婷 | 久久人人干 | 96av在线视频 | 日韩高清一区在线 | 免费在线激情电影 | 亚洲精品日韩一区二区电影 | 日本丰满少妇免费一区 | 日韩欧美一区二区三区视频 | 激情视频免费观看 | 日本九九视频 | 99热精品久久 | 免费av网址大全 | 欧美在线一 | 欧美不卡视频在线 | 欧美激情第28页 | 精品一区二区三区香蕉蜜桃 | 九九热中文字幕 | 视频在线99re | 午夜精品一区二区国产 | 成人在线一区二区 | 成人在线播放免费观看 | 国产精品久久久久久麻豆一区 | 99久久精品日本一区二区免费 | 成年人黄色大片在线 | 欧美淫视频 | 99久久精品免费一区 | 欧美激情精品久久久久 | 久久电影网站中文字幕 | 日韩中文在线观看 | 99精品免费久久久久久久久 | 亚洲精品欧美精品 | 探花视频在线观看免费 | 激情丁香综合五月 | 91九色精品| 一区二区视频播放 | 99久久精品费精品 | 久久久国产精品亚洲一区 | 欧美福利网址 | 伊人天堂av | 国产69精品久久99的直播节目 | 日韩黄在线观看 | 久久精品1区 | 国产精品久久久久婷婷 | 日韩久久精品一区二区 | 国产中文在线播放 | 美女在线免费观看视频 | 麻豆免费观看视频 | 特级毛片在线观看 | 欧美日韩中文国产 | 人人干在线 | 成人国产精品 | 日韩成人黄色av | 很黄很污的视频网站 | 在线免费观看视频你懂的 | 成全在线视频免费观看 | 91在线色 | 久久精品成人热国产成 | 丁香婷婷在线 | 日韩激情综合 | 麻花豆传媒mv在线观看网站 | 久久97久久 | 中文字幕在线看视频 | 久久久激情网 | 国产一卡久久电影永久 | 日本天天操 | 亚洲蜜桃在线 | 日韩在线视频网站 | 欧美精品在线观看一区 | 91在线视频观看免费 | 免费观看视频黄 | 久久视频这里有久久精品视频11 | 久久精品视频免费 | 亚洲国产久 | 欧美日韩在线免费观看视频 | 国产午夜免费视频 | 免费h漫在线观看 | 国产精品久久久久免费 | 国产精品久久婷婷六月丁香 | 伊人五月天.com | 最近日本中文字幕 | 99在线精品视频在线观看 | 91精品国产综合久久久久久久 | 久久综合成人 | 激情久久五月 | 日韩美女黄色片 | 国产成人在线一区 | 久久久久久久久福利 | 久久亚洲私人国产精品va | 美女黄网久久 | 亚洲视频精品在线 | 波多野结衣精品 | 国产一级高清 | 免费看的黄网站 | 91看片淫黄大片在线播放 | 色噜噜在线观看视频 | a视频在线观看免费 | 亚洲成人免费观看 | 99精品热视频只有精品10 | 99高清视频有精品视频 | 日本久久久久久久久久久 | 人人干网站 | 亚洲日日日 | 91视频91蝌蚪| 日韩av免费观看网站 | 国产黄色大全 | 丁香视频五月 | 亚洲日本中文字幕在线观看 | 亚洲天堂毛片 | 日韩视频一 | 中文在线中文资源 | 久久综合精品国产一区二区三区 | 欧美在线视频一区二区三区 | 欧美日本在线视频 | 在线观看一区 | 在线观看视频在线观看 | 91在线免费观看网站 | 日本黄色免费电影网站 | 欧美一二三区在线播放 | 亚洲综合视频在线 | 成人国产精品久久久 | 亚洲全部视频 | 久久资源总站 | 在线免费国产 | 欧美精品一区二区免费 | 人人插人人艹 | 日韩成人在线一区二区 | 久久亚洲视频 | 成人精品久久 | 国产免费嫩草影院 | 五月天综合色 | 成人在线免费看视频 | 亚洲激情综合 | 久久网址| 99色在线视频 | 九九九热 | 国产精品久久久久久欧美 | 国产精品九色 | 亚洲国产成人在线播放 | 亚洲日韩欧美视频 | 久草视频在线观 | 91国内在线 | 国产理伦在线 | 亚洲一二三久久 | 国产在线观看xxx | 97在线视频免费看 | 国产手机视频在线观看 | 999在线观看视频 | 国产精品久久久久久久久免费 | 国产人成在线视频 | 一级免费观看 | 国产电影黄色av | 日本在线观看中文字幕无线观看 | 久久久99国产精品免费 | 久久综合狠狠综合久久激情 | 精品国产1区二区 | 精品一区二区久久久久久久网站 | 久久久免费观看视频 | 在线免费黄色 | 国产亚洲激情视频在线 | 国产a级免费 | 六月丁香激情综合 | 麻豆果冻剧传媒在线播放 | 中文字幕一区二区三区在线视频 | 日韩特级黄色片 | 黄色在线免费观看网址 | 91久久久久久久一区二区 | 国产精品久久艹 | av在线永久免费观看 | 99久久99久久精品国产片果冰 | 久久久久在线观看 | 日日爽天天操 | 亚洲黄色在线免费观看 | 国产青草视频在线观看 | 一区二区丝袜 | 成人日韩av| 男女免费视频观看 | 午夜精品久久久久久99热明星 | 欧美激情奇米色 | 久久久久久激情 | 97视频播放 | 久久免费观看视频 | 97电影手机 | 九九九热 | 婷婷丁香九月 | 国产视频99 | 在线观看免费av网 | 亚洲一区二区三区四区精品 | 亚洲精品五月 | 色香蕉网| 欧美最猛性xxxxx免费 | 亚洲自拍av在线 | 亚洲免费精彩视频 | 日韩av不卡在线 | 国产手机精品视频 | 久久激情网站 | 蜜桃av久久久亚洲精品 | 91成人精品一区在线播放69 | 国产成年免费视频 | 粉嫩av一区二区三区四区五区 | 成人av动漫在线 | 久久午夜精品影院一区 | 99视频在线精品 | 丁香综合网 | 久久久久二区 | av短片在线观看 | 四虎影视成人精品国库在线观看 | 久久精彩 | 久久精品久久99精品久久 | 中文字幕资源网在线观看 | 国产精品久久久视频 | 国产精品欧美一区二区三区不卡 | 国产精品久一 | 手机av在线网站 | 国产日韩欧美中文 | 女人18毛片a级毛片一区二区 | 91一区在线观看 | 91成人观看| 日韩精品电影在线播放 | 成人免费网站在线观看 | 色婷婷狠狠干 | 亚洲精品国产精品99久久 | 久久久亚洲麻豆日韩精品一区三区 | 国产精品一区二区三区在线播放 | 一区二区免费不卡在线 | 香蕉网在线观看 | 亚洲精品激情 | 国产精品久久久久久久久婷婷 | 久久视频99 | 久久久久国产免费免费 | 精品在线观看一区二区三区 | 日韩三级视频在线看 | 日韩中文字幕免费视频 | 国产精品999久久久 久产久精国产品 | 91毛片在线观看 | 国产 在线 高清 精品 | 香蕉久草| 成人a毛片 | 九九国产精品视频 | 国产99自拍| 欧美va天堂va视频va在线 | 九九免费在线观看 | 久久精品99 | 天天综合在线观看 | 激情av在线播放 | 亚洲视屏 | 日韩精品中文字幕在线不卡尤物 | 狠狠的干狠狠的操 | 色姑娘综合网 | a√天堂中文在线 | 一级黄色大片在线观看 | 天堂入口网站 | 国产一级二级在线播放 | 一二三区在线 | 操操操日日 | 中文字幕二区在线观看 | 精品在线免费观看 | 人人草在线观看 | 一级欧美一级日韩 | 免费看的av片 | 久久精品电影 | 成人91在线 | 久久久久久久久爱 | 免费看色网站 | 国产亚洲精品久久久网站好莱 | a视频免费 | 久久99久久99精品免观看粉嫩 | 亚洲 欧美 变态 国产 另类 | 国产精品理论视频 | 久在线| 午夜视频导航 | 欧美91精品国产自产 | 久久久婷 | 午夜美女福利 | 国产成人三级在线观看 | 欧美最爽乱淫视频播放 | 亚洲视频综合在线 | 天天综合网在线 | 国产精品视频永久免费播放 | www.少妇| 天天综合网久久 | 天天操天天操一操 | 久久午夜电影 | 丁香花五月 | 久久久久久国产精品999 | 亚洲精品黄网站 | 五月婷婷综合在线 | 亚洲精品自在在线观看 | 国产人成一区二区三区影院 | 中文字幕av全部资源www中文字幕在线观看 | 91亚·色| 日韩成人中文字幕 | 日韩精品免费在线视频 | 黄色资源网站 | 久久久久久久亚洲精品 | 国产 色 | 免费在线观看国产精品 | 精品日本视频 | 亚洲精品国产精品乱码不99热 | 91av色 | 91视频午夜 | 综合婷婷丁香 | 一区二区三区不卡在线 | 一区二区电影在线观看 | 99久久久国产精品 | 综合久久综合久久 | 99国产精品久久久久久久久久 | 99九九视频 | 日韩久久电影 | 中文字幕在线精品 | 欧美日本三级 | 欧美最新另类人妖 | 五月开心六月婷婷 | 97超碰在线资源 | 精品国产一区二区三区久久影院 | 99成人免费视频 | 亚洲欧美视频一区二区三区 | 成人免费网站视频 | 99av在线视频| 国产日韩视频在线 | 亚洲美女精品 | 麻豆91视频| 婷婷亚洲综合 | 久久婷五月 | 最近2019好看的中文字幕免费 | 亚洲国产伊人 | av丝袜在线 | 国产99久久精品一区二区永久免费 | 国产亚洲无 | 国产亚洲情侣一区二区无 | 日韩午夜精品福利 | 成人黄色片在线播放 | 91爱爱视频 | 国产裸体永久免费视频网站 | 精品女同一区二区三区在线观看 | 婷婷中文在线 | 日韩中文字幕一区 | 国产精品一区二区白浆 | 天天操福利视频 | 精品成人在线 | 中文字幕在线播出 | 在线看国产视频 | 狠狠久久婷婷 | 97精品国产97久久久久久 | 欧美亚洲免费在线一区 | 五月丁婷婷 | 亚洲狠狠婷婷 | 精品久久一级片 | 精品亚洲一区二区三区 | 啪啪凸凸 | 人人爽人人澡 | 麻豆一精品传二传媒短视频 | 欧美日韩中文国产 | 国产精品视频免费观看 | 夜夜高潮夜夜爽国产伦精品 | 国产高清视频色在线www | 在线视频91| 日韩精品一区二区在线观看 | 中文字幕在线看视频 | 51久久成人国产精品麻豆 | 97超碰人人澡人人爱学生 | 日韩精品一区二区三区免费视频观看 | 亚洲视频免费在线观看 | 中文字幕久久精品一区 | 国产精品黄网站在线观看 | 成人影音在线 | 久久免费在线观看视频 | 日本99精品 | 我要色综合天天 | 99精品在线免费视频 | 玖玖精品视频 | 天天综合色网 | 高清av中文在线字幕观看1 | 成人在线观看你懂的 | 最近中文字幕国语免费av | 久久av一区二区三区亚洲 | 免费视频一二三区 | 国产原创在线观看 | 免费看成年人 | 国产99久久99热这里精品5 | 国产中文字幕久久 | 久久精品精品电影网 | 在线a视频免费观看 | 日日爱网站 | 蜜桃av人人夜夜澡人人爽 | 亚洲精品视频在线观看免费视频 | 在线观看日本韩国电影 | 久久精品久久久久电影 | 久久夜av | 91免费高清视频 | 国产一区二区高清不卡 | 午夜影院在线观看18 | 91精品国产欧美一区二区 | 国产专区在线播放 | 超碰国产在线观看 | 97超级碰碰碰视频在线观看 | 伊人网站| 激情图片区 | 欧美a性| 成人黄色短片 | 99爱视频在线观看 | 婷婷在线网站 | 日批网站在线观看 | 国产黄色免费电影 | a v在线观看 | 欧美男女爱爱视频 | 国产精品免费观看网站 | 亚洲精品五月 | 国产欧美日韩精品一区二区免费 | 亚洲欧洲精品一区二区精品久久久 | 国产精品久久久久久一二三四五 | 毛片3 | 中文字幕超清在线免费 | 插综合网| 国产999精品久久久久久绿帽 | 欧美日韩另类在线 | 亚洲91中文字幕无线码三区 | 最近最新中文字幕视频 | 亚洲欧美日韩精品久久久 | 91最新地址永久入口 | 国产日韩欧美在线播放 | 国产精品视频你懂的 | 91九色国产在线 | 99久久er热在这里只有精品15 | 99精品国产成人一区二区 | 色婷在线| 国产91丝袜在线播放动漫 | 人人爽人人乐 | 天天在线视频色 | 91看片淫黄大片在线播放 | 婷婷视频在线播放 | 国产精品视频免费看 | 在线看一区| 亚洲视频久久久久 | 麻豆极品 | 色爱区综合激月婷婷 | 成人黄色短片 | 日韩三级视频在线看 | 亚洲最新av | 日韩在线不卡视频 | 亚洲 综合 激情 | 欧美日韩一区二区三区在线免费观看 | 超碰午夜| 操操综合网 | 成人一区二区在线观看 | 在线精品视频免费播放 | 国产精品专区h在线观看 | 日韩av一区二区在线影视 | 91av资源网| 国产精品久久一区二区三区不卡 | 99爱这里只有精品 | 午夜久操| 成人三级网站在线观看 | 久99久在线 | 精品99久久 | 久久免费精品 | 五月婷婷天堂 | 92中文资源在线 | 9999在线视频| 天天操操 | 亚洲午夜精品一区二区三区电影院 | 午夜精选视频 | 国产一线二线三线性视频 | 精品国产乱子伦一区二区 | 91av在线播放视频 | 在线观av| 色无五月 | 黄色电影网站在线观看 | 欧美韩日视频 | 免费黄a大片 | 日本精品久久久久久 | 最近免费中文字幕大全高清10 | 久久精品欧美一 | 91麻豆看国产在线紧急地址 | 97碰碰碰| 成人av片免费观看app下载 | 久久麻豆精品 | 国产精品一区二区三区在线免费观看 | 免费看的黄色网 | 一区二区网 | 91网在线看 | 337p西西人体大胆瓣开下部 | 九九免费在线观看视频 | 激情在线五月天 | 免费视频黄 | 免费网站观看www在线观看 | 国产小视频在线免费观看视频 | 午夜12点| 国产91在线看 | 日韩视频一区二区三区 | 激情开心色 | 国产成人亚洲在线观看 | 麻豆av电影 | 久久久综合电影 | 91精品国产麻豆国产自产影视 | 444av| 永久av免费在线观看 | 亚洲成人av一区 | 狠狠色狠狠色综合日日92 | 日韩手机视频 | 中文字幕一区二区三区四区 | 最近中文字幕大全 | 成人试看120秒 | 国产精品久久久久久久久久久免费看 | 亚洲精品乱码久久久久 | 中文区中文字幕免费看 | 国产在线观看午夜 | 黄色天堂在线观看 | 91精品久久久久久久久久久久久 | 最近日本韩国中文字幕 | 天天操天天艹 | 99久久er热在这里只有精品66 | 亚洲国产精品一区二区尤物区 | 国产二区免费视频 | 国产精品久久久久久久久久ktv | 狠狠色狠狠色综合日日小说 | 亚洲视频一级 | 国产精品爽爽爽 | 国产一级片直播 | 亚洲黄色在线看 | 91在线视频网址 | 天天操天天色综合 | 久久人人97超碰精品888 | 亚洲最新av网址 | 亚洲成a人片综合在线 | 国产婷婷色 | 超碰公开在线 | 日韩v在线 | 国产五月| 国产69精品久久久久99尤 | 日韩久久精品一区二区三区下载 | 2024av在线播放 | 狠狠网亚洲精品 | 亚洲黄色片 | 国产成人精品综合久久久久99 | 亚a在线| 免费观看一区二区三区视频 | 国产精品成人自产拍在线观看 | 美女网站视频色 | 免费色视频在线 | 国产精品精品视频 | 成人91在线观看 | 免费成人av电影 | 天天干夜夜夜 | 欧美日韩视频 | 国产精品亚洲a | 园产精品久久久久久久7电影 | 在线观看免费一级片 | 少妇搡bbbb搡bbb搡69 | 日韩丝袜视频 | 在线观看av大片 | 97影视| 91综合久久一区二区 | 在线观看视频国产 | 天天操天天射天天爱 | 97精品国自产拍在线观看 | 久草视频在线免费播放 | 射射色| 久久免费视频在线观看6 | 人人爽人人片 | 欧美日韩国产在线一区 | 久久精品视频在线免费观看 | 国产精品黄色av | 新av在线| 久久久久久久久久久国产精品 | 99日精品| 日韩二区在线播放 |