日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【数据结构-查找】4.五千字干活长文带你搞懂——B树和B+树

發(fā)布時間:2025/3/20 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【数据结构-查找】4.五千字干活长文带你搞懂——B树和B+树 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

B樹

B樹的定義(為什么需要B樹)

B樹是一類樹,也稱為了 平衡的多路查找樹。包括B樹、B+樹、B*樹等,是一棵 自平衡的搜索樹,它類似普通的平衡二叉樹,不同的一點是B樹允許每個結(jié)點有更多的子結(jié)點。B樹是 專門為外部存儲器設(shè)計的,如磁盤,它對于讀取和寫入大塊數(shù)據(jù)有良好的性能,所以一般被用在 文件系統(tǒng)數(shù)據(jù)庫 中。

傳統(tǒng)用來搜索的平衡二叉樹有很多,如 AVL 樹,紅黑樹等。這些樹在一般情況下查詢性能非常好,但當(dāng)數(shù)據(jù)非常大的時候它們就無能為力了。

原因是 當(dāng)數(shù)據(jù)量非常大時,內(nèi)存不夠用,大部分數(shù)據(jù)只能存放在磁盤上,只有需要的數(shù)據(jù)才加載到內(nèi)存中。一般而言內(nèi)存訪問的時間約為 50 ns,而磁盤在 10 ms 左右。速度相差了近 5 個數(shù)量級,磁盤讀取時間遠遠超過了數(shù)據(jù)在內(nèi)存中比較的時間。這說明程序大部分時間會阻塞在磁盤 IO 上。

那么我們?nèi)绾翁岣叱绦蛐阅?#xff1f;減少磁盤 IO 次數(shù),像 AVL 樹,紅黑樹這類平衡二叉樹從設(shè)計上無法“迎合”磁盤。


B樹的特點

索引的效率依賴于磁盤 IO 的次數(shù),快速索引需要有效的減少磁盤 IO 次數(shù),如何快速索引呢?索引的原理 其實是不斷的縮小查找范圍,就如我們平時用字典查單詞一樣,先找首字母縮小范圍,再第二個字母等等。

平衡二叉樹是每次將范圍分割為兩個區(qū)間。為了更快,B樹每次將范圍分割為多個區(qū)間,區(qū)間越多,定位數(shù)據(jù)越快越精確。

那么如果結(jié)點為區(qū)間范圍,每個結(jié)點就較大了。所以新建結(jié)點時,直接申請頁大小的空間(磁盤是按頁分的,一般為 512 Byte(字節(jié))。磁盤 IO 一次讀取若干個頁,具體大小和操作系統(tǒng)有關(guān),一般為 4k,8k 或 16k),計算機內(nèi)存分配是按頁對齊的,這樣就實現(xiàn)了一個結(jié)點只需要一次 IO。


具體來說,拿一棵m階B樹為例,滿足如下性質(zhì)

  • 書中每個結(jié)點最多有m棵子樹(即最多含有m-1個關(guān)鍵字)
  • 解釋: m 階B樹,它結(jié)點的指針域最多有 m 個,每個指針域指向一棵子樹;兩個指針域之間必須由一個 key 值將兩個指針域隔開

  • 若根結(jié)點不是葉子結(jié)點,則至少有兩棵樹,根結(jié)點關(guān)鍵字數(shù)量[1,m?1][1,m-1][1,m?1],子樹數(shù)量[2,m][2,m][2,m]
  • 解釋: 根結(jié)點如果不是葉子結(jié)點(在B樹中,葉子結(jié)點是沒有信息的,也就是null),那么根結(jié)點至少有兩個指針域(換句話說,至少有兩棵子樹)。如果沒有兩棵子樹怎么辦(比如,只有兩個key),那么,將這兩個key合并為一個結(jié)點(如果無法合并,比如m=2,那就無法構(gòu)成B樹)。B樹的根結(jié)點至少有一個關(guān)鍵字,最多有m-1個關(guān)鍵字(也就是有m個指針域,m棵子樹)

  • 除根結(jié)點外的所有非葉結(jié)點至少有 m2(向上取整)\frac{m}{2}(向上取整)2m?() 棵子樹(即最少含有 m2(向上取整)?1\frac{m}{2}(向上取整)-12m?()?1 個關(guān)鍵字),除根結(jié)點外的所有非葉結(jié)點關(guān)鍵字數(shù)量[m2(向上取整)?1,m?1][\frac{m}{2}(向上取整)-1,m-1][2m?()?1,m?1],子樹數(shù)量 [m2(向上取整),m][\frac{m}{2}(向上取整),m][2m?(),m]
  • 解釋: 多有除了根結(jié)點的非葉子結(jié)點,子樹數(shù)量的下限是被控制的,不像根結(jié)點一樣,最少可以有2棵子樹,而是最少要有 m2(向上取整)\frac{m}{2}(向上取整)2m?() 棵子樹

  • 同一結(jié)點內(nèi)有序,父子結(jié)點之間滿足二叉排序樹的排列規(guī)則

  • 所有葉子結(jié)點出現(xiàn)在同一層次上,且不帶信息

  • 圖示為一棵B樹。如果要尋找 30 的話,比較根結(jié)點 {20, 50, 70},因為 20≤30≤5020≤30≤50203050,走①號線;得到的子結(jié)點 {25, 30, 40},找到了值為 30 的結(jié)點

    綜合來說: B樹在提高效率就像二叉排序樹一樣,不同的是,面對不同階的樹,其結(jié)點上的值可能不止一個

    那么,每棵B樹的結(jié)點多少個是如何決定的呢?

    比如說,對于任意一棵包含n(n≥1)個關(guān)鍵字、高度為h、階數(shù)為m的B樹:

    也就是說,這一棵B樹的結(jié)點中的值的個數(shù)在 [1,m?1][1,m-1][1,m?1]

    一棵B樹的高的范圍為
    h∈[logm(n+1),logm2(n+12)+1](m2向上取整)h∈[log_m(n+1),log_{\frac{m}{2}}(\frac{n+1}{2})+1] (\frac{m}{2}向上取整) h[logm?(n+1),log2m??(2n+1?)+1](2m?)
    例如:一棵3階B樹,有8個結(jié)點,那么它的 h∈[2,3.17]


    做一個思考,把100挪到90以下可以嗎?為什么?

    (答案顯然是不可以的,首先,不滿足第3條,即非根結(jié)點需要的子樹是[m2(取上限),m][\frac{m}{2}(取上限),m][2m?(),m],在本示例中為[2,3])[2,3])[2,3] ,把100挪到90以下,90只有一棵子樹了;其次不滿足第5條,即葉子結(jié)點在同一層)

    B樹的查找

    接下來讓我們來看看B樹的查找。

    總的來說B樹的查找分為兩個基本操作:

  • 在B樹中尋找結(jié)點
  • 在結(jié)點內(nèi)找關(guān)鍵字
  • 下面,假設(shè)每個結(jié)點有 n 個 key值,被分割為 n+1 個區(qū)間,注意,每個 key 值緊跟著 data 域,這說明B樹的 key 和 data 是聚合在一起的。這里給出一棵B樹




    一般而言,根結(jié)點都在內(nèi)存中,B樹以每個結(jié)點為一次磁盤 IO,比如上圖中,若搜索 key 為 25 結(jié)點的 data,首先在根結(jié)點進行二分查找(因為 keys 有序,二分最快),判斷 key 25 小于 key 50,所以定位到最左側(cè)的結(jié)點,此時進行一次磁盤 IO,將該結(jié)點從磁盤讀入內(nèi)存,接著繼續(xù)進行上述過程,直到找到該 key 為止。

    參考代碼

    Data* BTreeSearch(Root *node, Key key) {Data* data;if(root == NULL)return NULL;// 二分法查找目標keydata = BinarySearch(node);if(data->key == key){return data;}else{// 若沒有找到,對磁盤進行一次IO操作node = ReadDisk(data->next);BTreeSearch(node, key);} }

    B樹的插入

    與二叉查找樹相比,B樹的插入就復(fù)雜得多了。因為B樹的定義和限制就決定了這一點。

    下面用圖片的方式,給大家介紹B樹插入過程中需要注意的問題

    這是一棵3階B樹,給出一組關(guān)鍵字{20, 30, 50, 52, 60, 68, 70},根據(jù)B樹的性質(zhì),根結(jié)點的關(guān)鍵字數(shù)量調(diào)整范圍為[1,2],其他非葉結(jié)點關(guān)鍵字數(shù)量調(diào)整范圍為[1,2]

    step1: B樹為空,20插入,作為根結(jié)點,此時,根結(jié)點僅1個關(guān)鍵字;然后30插入,由于比20大,所以插入20的右邊,此時,根結(jié)點關(guān)鍵字個數(shù)為2個,滿足B樹要求

    step2: 50插入,作為根結(jié)點,此時,根結(jié)點有3關(guān)鍵字,不滿足B樹的定義要求,所以需要分裂;按B樹的分裂方法,應(yīng)將中間的數(shù)提出,作為左右關(guān)鍵字的父結(jié)點,左右關(guān)鍵字作為其子結(jié)點,如下圖。

    step3: 52插入,52比30大,來到右邊的子樹,52有比50大,所以插入到50右邊。此時這個結(jié)點的關(guān)鍵字數(shù)量為2,滿足B樹定義要求。

    step4: 60插入,52比30大,來到右邊的子樹,60有比52大,所以插入到52右邊。但此時,這個結(jié)點的關(guān)鍵字數(shù)量為3,不滿足B樹定義要求。按照B樹分裂原則,將中間值52提出作為左右關(guān)鍵字的父結(jié)點,左右關(guān)鍵字作為52的子結(jié)點,如下圖。

    step5: 68插入,68比52大,來到右邊的子樹,68有比60大,所以插入到60右邊。此時這個結(jié)點的關(guān)鍵字數(shù)量為2,滿足B樹定義要求。

    step6: 最后,70插入,70比52大,來到右邊的子樹,70有比68大,所以插入到68右邊。此時這個結(jié)點的關(guān)鍵字數(shù)量為3,不滿足B樹定義要求。按照B樹分裂原則,將中間值68提出作為左右關(guān)鍵字的父結(jié)點,左右關(guān)鍵字作為68的子結(jié)點,如下圖2。但此時,他們的父結(jié)點,也是根結(jié)點的關(guān)鍵字數(shù)量為3,不滿足B樹定義要求。按照B樹分裂原則,將中間值52提出作為左右關(guān)鍵字的父結(jié)點,左右關(guān)鍵字作為52的子結(jié)點,如下圖3 。



    最后濃縮提煉總結(jié)

  • 檢查插入結(jié)點后,結(jié)點關(guān)鍵字是否大于B樹定義的結(jié)點關(guān)鍵字上限
  • 如果超過上限,那就采用結(jié)點分裂,將中間的結(jié)點作為左右關(guān)鍵字的父結(jié)點
  • 之后再次檢查,提出后結(jié)點進入父結(jié)點后,該結(jié)點關(guān)鍵字是否大于B樹定義的結(jié)點關(guān)鍵字上限
  • 如果超過上限,那就采用結(jié)點分裂,將中間的結(jié)點作為左右關(guān)鍵字的父結(jié)點(1,2循環(huán),加一個檢查)
  • B樹的刪除

    相對來說,B樹的刪除較為復(fù)雜,不過原理都是類似的,就是滿足B樹的定義。也就是說,最基本的一點,要是刪除后的結(jié)點中的關(guān)鍵字個數(shù)≥ m2(向上取整)?1\frac{m}{2}(向上取整)-12m?()?1 ,因此不可避免的,在刪除的過程中,涉及結(jié)點的合并問題。

    根據(jù)刪除的關(guān)鍵字位置不同,可以分為關(guān)鍵字 在終端結(jié)點上不在終端結(jié)點上

    下面同樣結(jié)合圖片說明B樹的刪除是一個怎樣的過程(所舉的例子都是3階B樹,也就是說,B樹的根結(jié)點的關(guān)鍵字數(shù)量范圍為[1,2][1,2][1,2],非根非葉子結(jié)點的關(guān)鍵字數(shù)量范圍為 [1,2][1,2][1,2])。

    1. 如果刪除的關(guān)鍵字在終端結(jié)點上

    ① 結(jié)點內(nèi)關(guān)鍵字數(shù) 大于 m2(向上取整)?1\frac{m}{2}(向上取整)-12m?()?1 ,這是刪除這個關(guān)鍵字不會被破壞B樹的定義要求,所以直接刪除。

    如下圖,刪除9,直接刪除

    ② 結(jié)點內(nèi)關(guān)鍵字數(shù) 等于 m2(向上取整)?1\frac{m}{2}(向上取整)-12m?()?1 ,并且其左右兄弟結(jié)點存在關(guān)鍵字數(shù)大于 m2(向上取整)?1\frac{m}{2}(向上取整)-12m?()?1 的結(jié)點,則去兄弟結(jié)點中借關(guān)鍵字。

    如下圖,刪除2,由于結(jié)點中的關(guān)鍵字數(shù)量 等于 m2(向上取整)?1=1\frac{m}{2}(向上取整)-1 = 12m?()?1=1,恰好其兄弟結(jié)點{7,9}的關(guān)鍵字大于1,向兄弟結(jié)點借一個關(guān)鍵字,且在調(diào)整的時候需要按照大小順序進行排序。

    ③ 結(jié)點內(nèi)關(guān)鍵字數(shù) 等于 m2(向上取整)?1\frac{m}{2}(向上取整)-12m?()?1 ,并且其左右兄弟結(jié)點不存在關(guān)鍵字數(shù)大于 m2(向上取整)?1\frac{m}{2}(向上取整)-12m?()?1 的結(jié)點,則需要對結(jié)點進行合并。

    如下圖,刪除16,由于結(jié)點中的關(guān)鍵字數(shù)量 等于 m2(向上取整)?1=1\frac{m}{2}(向上取整)-1 = 12m?()?1=1,但是其兄弟結(jié)點的關(guān)鍵字均等于1,所以不存在像兄弟結(jié)點借一個關(guān)鍵字這樣的情況。所以需要進行結(jié)點合并。

    合并:把上一層的結(jié)點取關(guān)鍵字與下一層結(jié)點合并。這種合并方式不唯一。

    如方案①是把父結(jié)點的14與11合并;方案②是把父結(jié)點的20與22合并

    2. 如果刪除的關(guān)鍵字不在終端結(jié)點上

    需要先轉(zhuǎn)換成在終端結(jié)點上,在按照在終端結(jié)點上的情況來分別考慮對應(yīng)的方法

    這里介紹一個概念,就是相鄰關(guān)鍵字。

    相鄰關(guān)鍵字就是對于不在終端結(jié)點上的關(guān)鍵字,它的相鄰關(guān)鍵字使其其 左子樹中最大的關(guān)鍵字 或者 右子樹中最小的關(guān)鍵字

    第一種情況:存在關(guān)鍵字數(shù)量大于 m2(向上取整)?1\frac{m}{2}(向上取整)-12m?()?1(這里等于1) 結(jié)點的左子樹和右子樹,在對應(yīng)子樹上找到該關(guān)鍵字的相鄰關(guān)鍵字,然后將相鄰關(guān)鍵字替換待刪除關(guān)鍵字

    Step1:找出這個待刪除關(guān)鍵字的相鄰關(guān)鍵字,比如下圖中10的相鄰關(guān)鍵字急救室9和11,其實就是這個大小序列中該關(guān)鍵字的 直接前驅(qū)或者是直接后繼關(guān)鍵字

    Step2:將這個待刪除的關(guān)鍵字和這個相鄰關(guān)鍵字互換

    Step3:這是就回到了刪除終端結(jié)點的操作

    第二種情況:存在關(guān)鍵字數(shù)量均等于 m2(向上取整)?1\frac{m}{2}(向上取整)-12m?()?1 (這里等于1),則將這兩個子樹結(jié)點合并,然后刪除待刪除關(guān)鍵字

    Step1:首先觀察待刪除結(jié)點14,發(fā)現(xiàn)它的左右子樹中關(guān)鍵字均等于1

    Step2:將14的左右子樹合并為{11,6}

    Step3:刪除14,然后將{11,6}結(jié)點作為20的左結(jié)點

    B+樹

    B+樹的概念

    B+樹是B樹的變種,它與B樹的不同之處在于:

    • 在B+樹中,key 的副本存儲在 內(nèi)部結(jié)點,真正的 key 和 data 存儲在葉子結(jié)點上 。
    • n 個 key 值的結(jié)點指針域為 n 而不是 n+1。

    因為內(nèi)結(jié)點并不存儲 data,所以一般B+樹的葉結(jié)點和內(nèi)結(jié)點大小不同,而B-樹的每個結(jié)點大小一般是相同的,為一頁。

    為了增加 區(qū)間訪問性,一般會對B+樹做一些優(yōu)化。

    如下圖帶順序訪問的B+樹。

    B+樹的特點

    一棵m階的B+樹需滿足下列條件

  • 每個分支結(jié)點最多有m棵子樹(子結(jié)點)(與B樹一樣)
  • 非葉根結(jié)點至少有兩棵子樹,其他分支結(jié)點至少有m2(向上取整)\frac{m}{2}(向上取整)2m?() 棵子樹(與B樹一樣)
  • 結(jié)點的子樹個數(shù)與關(guān)鍵字個數(shù)相等(與B樹不一樣,B樹的子樹比關(guān)鍵字多1)
  • 所有葉結(jié)點包含全部關(guān)鍵字以及指向相應(yīng)記錄的指針業(yè)界點鐘將關(guān)鍵字按大小順序排序,并且相鄰葉結(jié)點按大小順序線連接起來
  • 解釋:B+樹葉結(jié)點兩兩相連可大大增加區(qū)間訪問性,可使用在范圍查詢等,而B-樹每個結(jié)點 key 和 data 在一起,則無法區(qū)間查找。

    根據(jù)空間局部性原理:如果一個存儲器的某個位置被訪問,那么將它附近的位置也會被訪問

    B+樹可以很好的利用局部性原理,若我們訪問結(jié)點 key為 50,則 key 為 55、60、62 的結(jié)點將來也可能被訪問,我們可以利用磁盤預(yù)讀原理提前將這些數(shù)據(jù)讀入內(nèi)存,減少了磁盤 IO 的次數(shù)。 (根本目的)

    當(dāng)然B+樹也能夠很好的完成范圍查詢。比如查詢 key 值在 50-70 之間的結(jié)點。

  • 所有分支結(jié)點(可視為索引的索引)中僅包含它的各個子結(jié)點(即下一級的索引快)中關(guān)鍵字的最大值及指向其子結(jié)點的指針
  • 解釋:B+非葉結(jié)點只做索引,沒有含該關(guān)鍵字對應(yīng)的存儲信息

    同樣的m階B樹與m階B+樹有什么區(qū)別

    B樹B+樹
    n個關(guān)鍵字的結(jié)點有n+1棵子樹n個關(guān)鍵字的結(jié)點有n棵子樹
    每個結(jié)點(非根、內(nèi)部)的關(guān)鍵字個數(shù)范圍為[m2?1(向上取整),m?1][\frac{m}{2}-1(向上取整),m-1][2m??1(),m?1]
    根結(jié)點的關(guān)鍵字個數(shù)范圍為[1,m-1]
    每個結(jié)點(非根、內(nèi)部)的關(guān)鍵字個數(shù)范圍為[m2(向上取整),m][\frac{m}{2}(向上取整),m][2m?(),m]
    根結(jié)點的關(guān)鍵字個數(shù)范圍為[1,m]
    每個結(jié)點的關(guān)鍵字都是包含全部信息的,也就是說,每個結(jié)點既包含了該關(guān)鍵字的data域,又包含了關(guān)鍵字的指針域(key)葉結(jié)點包含信息,所有非葉結(jié)點均起索引作用,非葉結(jié)點中的每個索引只含對應(yīng)字數(shù)的最大關(guān)鍵字和指向該子樹的指針,并不含該關(guān)鍵字對應(yīng)的存儲信息。
    葉結(jié)點包含的關(guān)鍵字與其他結(jié)點包含的關(guān)鍵字是不重復(fù)的葉結(jié)點包含了全部的關(guān)鍵字,也就是說,在非葉結(jié)點中出現(xiàn)的關(guān)鍵字也會出現(xiàn)在葉結(jié)點中
    時間復(fù)雜度最好是O(1)時間復(fù)雜度固定為lognlog_nlogn?
    每個結(jié)點 key 和 data 在一起,則無法區(qū)間查找葉結(jié)點兩兩相連可大大增加區(qū)間訪問性,可使用在范圍查詢等
    更適合外部存儲,由于內(nèi)結(jié)點無 data 域,每個結(jié)點能索引的范圍更大更精確
    B樹為有序數(shù)組+平衡多叉樹而B+樹為有序數(shù)組鏈表+平衡多叉樹

    不同的數(shù)據(jù)庫使用不同的樹的原因在哪里

    1. 為什么 MongoDB 使用B-樹

    MongoDB 是一種 nosql,也存儲在磁盤上,被設(shè)計用在數(shù)據(jù)模型簡單,性能要求高的場合。性能要求高,看看B/B+樹的區(qū)別第一點:

    B+樹內(nèi)結(jié)點不存儲數(shù)據(jù),所有 data 存儲在葉結(jié)點導(dǎo)致查詢時間復(fù)雜度固定為 log n。而B-樹查詢時間復(fù)雜度不固定,與 key 在樹中的位置有關(guān),最好為O(1)

    我們說過,盡可能少的磁盤 IO 是提高性能的有效手段。MongoDB 是聚合型數(shù)據(jù)庫,而 B-樹恰好 key 和 data 域聚合在一起。

    2. 為什么 Mysql 使用B+樹

    Mysql 是一種關(guān)系型數(shù)據(jù)庫,區(qū)間訪問是常見的一種情況,而 B-樹并不支持區(qū)間訪問(可參見上圖),而B+樹由于數(shù)據(jù)全部存儲在葉子結(jié)點,并且通過指針串在一起,這樣就很容易的進行區(qū)間遍歷甚至全部遍歷

  • B+樹葉結(jié)點兩兩相連可大大增加區(qū)間訪問性,可使用在范圍查詢等,而B-樹每個結(jié)點 key 和 data 在一起,則無法區(qū)間查找
  • B+樹的查詢效率更加穩(wěn)定,數(shù)據(jù)全部存儲在葉子結(jié)點,查詢時間復(fù)雜度固定為 O(log n)
  • B+樹更適合外部存儲。由于內(nèi)結(jié)點無 data 域,每個結(jié)點能索引的范圍更大更精確
  • B+樹更適合關(guān)系型數(shù)據(jù)庫

    總結(jié)

    以上是生活随笔為你收集整理的【数据结构-查找】4.五千字干活长文带你搞懂——B树和B+树的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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

    主站蜘蛛池模板: 亚洲av综合色区无码一区 | 欧美成人aaaa | 九九九九九精品 | av私库在线观看 | 国产a线 | 国产二区在线播放 | 午夜精品久久久久久毛片 | 免费一级一片 | 亚洲欧美日韩国产一区二区三区 | 国产高清免费在线观看 | 一区二区三区精品视频在线观看 | 无码不卡av东京热毛片 | 国产区福利 | 男女男精品视频网站 | 成人靠逼视频 | 毛片无码一区二区三区a片视频 | 国产福利一区在线观看 | 国产精品亚洲专区无码牛牛 | 花房姑娘免费观看全集 | 黑人激情视频 | 999福利视频 | www国产精品内射老熟女 | 色av免费 | 五月婷婷丁香网 | 亚洲综合网av | 91福利在线免费观看 | 黑人av | 欧美日本另类 | 国产精品xxxx喷水欧美 | 日韩精品在线观看一区 | 四虎影院在线观看免费 | 国产做爰xxxⅹ性视频国 | xxxx国产片 | 17c在线 | 极品尤物魔鬼身材啪啪仙踪林 | 久久久免费网站 | 中文字幕亚洲一区二区三区五十路 | 中文字幕第5页 | 五月开心激情 | 午夜福利电影一区二区 | 亚洲福利视频一区二区 | 老女人做爰全过程免费的视频 | 免费日韩在线 | 国产视频在线免费观看 | 中文字幕成人一区 | 日韩欧美一区二区在线 | 特大巨交吊性xxxx | 欧美视频一区在线 | 欧美成人手机视频 | 撸啊撸在线视频 | 清清草免费视频 | 青青草久久爱 | 日韩亚洲欧美在线观看 | 性欧美大战久久久久久久 | 亚洲热在线观看 | 精品在线视频一区 | 国产日本精品 | 国产尤物视频在线 | 久久久久久久黄色片 | 成人av网站大全 | 中出 在线 | 午夜av毛片 | 久久久国产精品x99av | 黄色a在线 | 亚洲美女视频在线 | 高h喷水荡肉少妇爽多p视频 | 国产成人短视频在线观看 | 九九爱爱视频 | 国产精品aaa| 日韩中文字幕一区二区 | 91av免费看| 稀缺小u女呦精品呦 | 哪里可以看毛片 | 亚洲成人自拍偷拍 | 国产日韩一区二区在线观看 | 久久91视频| 国产做爰免费观看 | 美女网站在线免费观看 | 久久www视频 | 性免费网站 | 91sao| 国产理论精品 | jizzzz中国 | 国产精品自拍第一页 | 黄色成人免费视频 | 91国偷自产一区二区三区女王 | 精品黑人一区二区三区 | 黄色大片免费在线观看 | 丰满熟妇肥白一区二区在线 | 国产精品456 | 日本综合视频 | 亚洲人成电影在线 | 91小宝寻花一区二区三区 | 影音先锋亚洲一区 | xxxxx在线观看 | 欧美www.| 免费毛片一区二区三区久久久 | 久久国产a| 越南毛茸茸的少妇 |