靜態查找表:只作查找操做的查找表算法
動態查找表:在查找過程當中同時插入查找表中不存在的數據元素,或者從查找表中刪除已經存在的某個數據元素。數據庫
若是查找的數據集是有序線性表,而且是順序存儲的,查找可使用折半、插值、斐波那契等查找算法,由於有序,在插入和刪除操做上,就須要耗費大量的時間。數據結構
二叉排序樹函數
定義:性能
又稱爲二叉查找樹,它或者是一顆空樹或者是具備下列性質的二叉樹。.net
構建過程指針
刪除操做:blog
若是是葉節點直接刪除;排序
若是要刪除的只有左子樹或右子樹,那就將該結點刪除後,將它的左子樹或右子樹整個移動到刪除的結點的位置便可;索引
若是要刪除的是左右子樹都有的結點,找到須要刪除的結點p的中序遍歷的直接前驅(或直接後繼),用s來替換結點p,而後再刪除此結點s。
總結:對於二叉排序樹的查找,走的就是從根結點到要查找的結點的路徑,其比較次數等於給定值的結點在二叉排序樹的層數,所以二叉排序樹的查找性能取決於二叉排序樹的形狀。咱們但願,二叉排序樹是比較平衡的,即其深度與徹底二叉樹相同,則查找的時間複雜度爲logN,近似於折半查找。
平衡二叉樹(AVL):是一種二叉排序樹,其中每個結點的左子樹和右子樹的高度差之多等於1.
BF(Balance Factor)平衡因子:二叉樹上結點的左子樹深度減去右子樹深度的值成爲平衡因子。
最小不平衡子樹:距離插入結點最近的,且平衡因子的絕對值大於1的結點爲根的子樹。
平衡二叉樹的構建思想就是在構建二叉排序樹的過程當中,每當插入一個結點時,先檢查是否因插入而破壞了樹的平衡性,如果,則找出最小不平衡子樹。在保持二叉排序樹特性的前提下,調整最小不平衡子樹中各結點之間的連接關係,進行相應的旋轉,使之成爲新的平衡子樹。
BF爲正值,右旋
BF爲負值,左旋
BF一正一負,先將符號統一後,再旋轉一次
紅黑樹:http://blog.csdn.net/eric491179912/article/details/6179908
前面討論的數據結構,處理數據都是在內存中,所以考慮的都是內存中的運算時間複雜度。但若是要操做的數據集很是大,如數據庫中的上千萬條記錄,硬盤中的上萬個文件,在這種狀況下,對數據的處理須要不斷從硬盤等存儲設備中調入或調出內存頁面。一旦涉及到這樣的外部存儲設備,關於時間複雜度的計算就會發生變化,訪問該集合元素的時間已經不只僅是尋找該元素所需比較次數的函數,咱們必須考慮對硬盤等外部存儲設備的訪問時間以及將會對該設備作出多少次單獨訪問。
一個結點只能存儲一個元素,在元素很是多的時候,就使得要麼樹的度很是大要麼樹的高度很是大,甚至都必須足夠大才行。這樣就使得內存存取外存的次數很是多,這顯然成了時間效率的瓶頸,這迫使咱們要打破每個結點只能存儲一個元素的限制,爲此引入了多路查找樹。
多路查找樹:其每個結點的孩子能夠多於兩個,且每個結點處能夠存儲多個元素。因爲它是查找樹,全部元素之間存在某種特定的排序關係。它的四種特殊形式:2-3樹、2-3-4樹、B樹、B+樹。
2-3樹是這樣一顆多路查找樹:其中的每個結點都具備兩個仍是(稱它爲2結點)或三個孩子(稱它爲3結點)。一個2結點包含一個元素和兩個孩子(或沒有孩子),且與二叉排序樹相似,左子樹包含的元素小於該元素,右子樹包含的元素大於該元素。與二叉排序樹不一樣的是,這個2結點要麼沒有孩子,要麼就兩個不能只有一個。一個2結點包含一小一大兩個元素和三個孩子。而且2-3樹種全部的葉子都在同一層上。
B樹:是一種平衡的多路查找樹,2-3和2-3-4樹都是B樹的特例。結點最大的孩子數成爲B樹的階,所以2-3樹是3階B數。
若是在內外存交換數據頻繁,會形成時間效率上的瓶頸,那麼B樹結構如何作到減小次數?
咱們的外村,好比硬盤,是將全部的信息分割成相等大小的頁面,每次硬盤讀寫的都是一個或多個完整的頁面,對一個硬盤來講,一頁的長度多是211到214個字節。在一個典型的B樹應用中,要處理的硬盤數據量很大,所以沒法一次所有裝入內存,所以咱們會對B樹進行調整,是的B樹的階數與硬盤存儲的頁面大小相匹配。好比一顆B樹的階爲1001(即一個結點包含1000個關鍵字),高度爲2,它能夠存儲超過10億個關鍵字,咱們只要讓根節點持久的保存在內存中,那麼在這棵樹上,需找某一個關鍵字至多隻須要兩次硬盤讀取便可。經過這種方式在內存有限的狀況下,每一次磁盤的訪問咱們均可以得到最大數量的數據,因爲B樹沒結點可能具備比二叉樹多得多的元素,因此與二叉樹的操做不一樣,他們減小了必須訪問結點和數據塊的數量,從而提升了性能,B樹的數據結構就是爲內外存的數據交互準備的。
爲了解決全部元素遍歷等基本問題,咱們在B樹結構的基礎上,加上了新的元素組織方式,就是B+樹。
B+樹:在B樹種每個元素在該樹種只出現一次,有可能在葉子節點上,也有可能在分支節點上,而在B+樹中,出如今分支結點中的元素會被當作他們在該分支結點位置的中序後繼者中再次列出。另外每個葉子節點都會保存一個指向後一葉子節點的指針。
這樣數據結構的好處就是若是隨機查找,就從根節點出發,與B樹的查找方式同樣,只不過及時在分支節點找到了待查找的關鍵字也只是用來索引的,不能提供實際記錄的訪問,仍是需啊喲到達包含次關鍵字的終端節點。若是是從小到大查找關鍵字,咱們能夠從最左側的葉子節點出發,不通過分支結點,而是沿着指向下一葉子的指針就能夠遍歷全部的關鍵字。