預熱姿勢: 什么是二叉查找樹 (二叉排序樹)
有一個根節點,每一個節點的左邊的子節點都比根節點小。右邊的自然是都比根節點大。
1.紅黑樹
規則:
1.節點只能是紅色或者黑色。
2.根節點是黑色。
3.每個葉子節點都是黑色的空節點。(nil 沒有值)
4.每個紅色節點的下面兩個子節點都是黑色。(不能有兩個連續的紅色節點)
5.從任一個節點,到其每個葉子的路徑包含相同數目的黑色節點。
插入刪除節點時的方法:
1. 變色:嘗試紅色變成黑色,黑色變成紅色。已滿足規則即可。
2. 左旋轉:逆時針旋轉紅黑樹的兩個節點,父節點被右孩子取代。從而變成左孩子。
3. 右旋轉:順時針旋轉紅黑樹的兩個節點,父節點被左孩子取代。從而變成右孩子。
2. B-樹 (也叫B樹 Balance Tree,不叫B減數)
減少查找次數,把樹變成矮胖的樣子。(根節點中的元素值,是所有子節點的分界值)
B樹的插入和刪除比較復雜,一個元素刪除(插入到節點),需要滿足下面的所有特征。
特征:
1.每個節點包含最多M個孩子。M成為B樹的階。 (假設現在是一個M階的B樹)
2.根節點至少有兩個字節點。
3.每一個中間的節點都包含K-1個元素 和 K個孩子。(m/2 <= K <= m)
4.每一個葉子節點都包含K-1個元素。(m/2 <= K <= m)
5.每個葉子節點,都在同一層。
6.每個節點中的元素,從小到大排列。節點中K-1個元素正好是K個孩子包含的元素的值域分劃。
3. B+樹
B-樹的變體,查詢性能更高。
1.單一節點存儲更多元素,查詢IO次數更少。
2.每次查詢都得查找到葉子節點,性能穩定。
3.所有葉子節點形成有序鏈表,便于范圍性的查詢。
特征:
1.中間節點有K個子樹,就包含K個元素。且每個元素不保存數據,只用來索引,所有數據都保存在葉子節點。
2.所有葉子節點中包含了全部元素的信息,和指向含這些元素記錄的指針。
且所有葉子節點按關鍵字大小,自小到大順序鏈接。
葉子節點相鄰之間有指針鏈接。(一個有序鏈表)
3.所有中間節點元素都同時存在于子節點。在子節點中是最大(最小)元素
4. Bitmap (位圖算法)
指內存中連續的二進制位 bit
,用于對大量的整型數據 做去重和查詢。
吧一個唯一的整型ID,存放到二進制的字段里面。
每一位代表一個ID,ID累加。 (即index表示ID) 達到充分利用內存空間的目的。
這樣一個字段表示一個Bitmap,不同的字段,只需做并運算,就可以查出需要的ID。
缺點
因為不知道總共有多少數據,只知道一個Bitmap(標簽)所包含的數據。
所以不能做非運算, 如查詢不是20歲的所有用戶。
可以增加一個全量的Bitmap,這樣就可以做非運算了。
5. A*尋路算法
引入的概念:
OpenList:存儲可到達的位置。
CloseList:存儲已到達的位置。
公式:F=G+H (G表示從起點到當前位置的距離,H表示當前位置到目標位置的距離)
F表示綜合評估,盡量選擇值小的。
算法
從起始位置開始,每一步都計算出所有的可用位置 和 這些位置的F值。
取最小的值,作為下一個位置。然后依次,一步一步算到終點。即得出最優路徑。