Java 常用查詢演算法

2021-09-23 18:25:36 字數 2131 閱讀 5410

二叉樹:

左子樹上的所有節點值均小於根節點值,

右子樹上的所有節點值均不小於根節點值,

左右子樹也滿足上述兩個條件。

插入過程如下圖:比較4與7,4<7,再比較4與7的左子樹6,4<6,比較4與6的左子樹3,4>3,比較4與3的右子樹,為空,插入4。(字串作為key比較可以用compareto)

刪除分為三種情況:

p為葉子節點,直接刪除該節點,再修改其父節點的指標(注意是父節點和不是根節點),如圖a。

p為單支節點(即只有左子樹或右子樹)。讓p的子樹與p的父親節點相連,刪除p即可;(注意分是根節點和不是根節點);如圖b。

p的左子樹和右子樹均不空。找到p的後繼y,因為y一定沒有左子樹,所以可以刪除y,並讓y的父親節點成為y的右子樹的父親節點,並用y的值代替p的值;或者方法二是找到p的前驅x,x一定沒有右子樹,所以可以刪除x,並讓x的父親節點成為y的左子樹的父親節點。如圖c。

紅黑樹:

每個節點顏色不是黑色,就是紅色

根節點是黑色的

如果節點是紅色的,則它的子節點必須是黑色的(反之不一定,沒有連續的紅節點)

從根節點到葉子節點的每條路徑,必須包含相同數目的黑色節點

紅黑樹繼承二叉樹的性質

插入節點:

往乙個空的紅黑樹中,依次插入資料:12 1 9 2 0 11 7 19 4

刪除節點同插入分析方式。

通過任意一條從根到葉子簡單路徑上顏色的約束,紅黑樹保證最長路徑不超過最短路徑的二倍,因而近似平衡。

b樹:

b樹的性質(m階的b樹,m表示節點的最大子節點數就是最大分支數,與高度h沒有關係)

樹中每個結點最多含有m個孩子(m>=2);

除根結點和葉子結點外,其它每個結點至少有[ceil(m / 2)]個孩子(其中ceil(x)是乙個取上限的函式);

3、根結點至少有2個孩子(除非b樹只包含乙個結點:根結點);

所有葉子結點都出現在同一層,葉子結點不包含任何關鍵字資訊(可以看做是外部結點或查詢失敗的結點,指向這些結點的指標都為null);(注:葉子節點只是沒有孩子和指向孩子的指標,這些節點也存在,也有元素。類似紅黑樹中,每乙個null指標即當做葉子結點,只是沒畫出來而已,2、3規則決定是平衡樹)。

每個非終端結點中包含有n個關鍵字資訊: (n,p0,k1,p1,k2,p2,……,kn,pn)。

其中:

ki (i=1…n)為關鍵字,且關鍵字按順序公升序排序k(i-1)< ki。

pi為指向子樹根的結點,且指標p(i-1)指向子樹種所有結點的關鍵字均小於ki,但都大於k(i-1)。

關鍵字的個數n必須滿足: [ceil(m / 2)-1]<= n <= m-1。比如有j個孩子的非葉結點恰好有j-1個關鍵碼。

b+樹:

在b-樹基礎上,為葉子結點增加鍊錶指標,所有關鍵字都在葉子結點 **現,非葉子結點作為葉子結點的索引;b+樹總是到葉子結點才命中

hash:

倒排:

總結:

二叉樹不是平衡樹,讓插入的值分別為1,2,3,4,5時,他會在右子樹一條線上,這樣跟鍊錶是類似了,達不到高效查詢的效果了

b樹是一種多叉平衡查詢樹,紅黑樹是二叉平衡查詢樹結構,b樹由於是多叉結構,對於元素數量非常多的情況下,樹的深度不會像二叉結構那麼大,可以保證查詢效率。

b樹每個節點都儲存[ceil(m / 2)-1]<= n <= m-1個關鍵字,而b+樹所有關鍵字都在葉子節點,非葉子節點作為葉子節點的索引,關鍵字都按從小到大順序排列

b+樹還有乙個最大的好處,方便掃庫,b樹必須用中序遍歷的方法按序掃庫,而b+樹直接從葉子結點挨個掃一遍就完了,b+樹支援range-query非常方便,而b樹不支援。這是資料庫選用b+樹的最主要原因

參考文獻:

常用演算法:

二叉樹

二叉樹

二叉樹

紅黑樹

紅黑樹 +1

紅黑樹

b樹 b+樹

b樹、b+樹

二叉、b、b+樹

倒排索引

倒排索引

java常用的排序和查詢演算法

private int arra 氣泡排序 相鄰的元素 依次比較,把值大的元素放在 數列的頭部或者尾部 private void sort1 列印 for int i 0 i arra.length 1 i 選擇排序 數列中 的元素依次和其他元素比較,把值大的元素放在 數列的頭部或者尾部 priva...

Java 查詢演算法

這個問題有幾個點要先確認 如果知道下標的話就方便了,查詢的複雜度為1.如果是針對值的查詢,那麼順序遍歷是o n 二分查詢 使用二分查詢的話可以減少時間複雜度為 o logn 二分查詢又稱折半查詢,它是一種效率較高的查詢方法。二分查詢要求 1.必須採用順序儲存結構 2.必須按關鍵字大小有序排列。aut...

Java查詢演算法

1 線性查詢演算法 這個就是典型的線性查詢,從頭到尾 查詢資料 我們是根據什麼來查詢呢?我們是根據值來查詢,返回她的所有值 public int search long value 2 二分法查詢演算法 二分法查詢前提是你這個陣列是有序的 比如說一組陣列是 1,3,4,5,7,9,10 二分法查詢是...