靜態查詢與動態查詢結構
在計算機許多應用領域中,查詢操作都是十分重要的研究技術。查詢效率的好壞直接影響應用軟體的效能。比如說:
(1) 全文檢索技術中對文字建立索引之後,對索引的查詢效率將決定搜尋引擎的質量。
(2) mysql資料庫的索引就是B+樹結構,查詢效率極高。
(3) Windows OS的檔案系統結構也是採用B+樹進行儲存的。
在《查詢演算法》系列文章中,我將主要介紹動態查詢樹結構。其他靜態查詢結構在下面簡單的引出:
靜態查詢:資料集合穩定,不需要新增,刪除元素的查詢操作。
動態查詢:資料集合在查詢的過程中需要新增或刪除元素。
靜態查詢結構概論
當把看似雜亂無章的資料組織成具有一定結構和一定規則的集合體時,查詢的效率就會大不一樣了。
【順序查詢】 大家都知道,最簡單的查詢方法就是順序查詢 (一個接一個得查下去)。這種線性結構的查詢效率是最低的,時間複雜度在O(N)數量級,最壞的情況莫過於所有資料都找遍了,還是沒找到。
難道真的每一個數據都必須找一次嗎?
【折半查詢】 很顯然的一個例子就是利用折半查詢(二分查詢) 法對有序的線性資料進行查詢。每一次都找1/2的部分,查詢次數當然就大大減少了。時間複雜度在O(log2 N)數量級上。
折半查詢實際就是一顆二叉樹遍歷,其中最中間的資料就是二叉樹的根。但是問題又來了,如果這個根資料一年才查詢一次,而這棵樹的葉子資料1秒鐘需要查詢1W次(考慮資料的查詢概率)。這種折半查詢的效率又不行了?
【靜態最優查詢樹/次優查詢樹】 考慮到上面折半查詢在概率問題下的效率不行,我們就想能不能把折半查詢二叉樹中概率最大的資料放在根的位置上或者放在離根較近的位置上。基於此,靜態最優查詢樹/次優查詢樹的思想就是在折半查詢二叉樹的基礎上求解一個帶權(資料概率)路徑長度最小/近視最小的樹。總體上說,靜態最優/次優查詢樹的時間複雜度也在 O(log2 N)數量級上(特別是在資料具有查詢概率的情況下也能保證這個效率)。
此外,還有一些別的靜態查詢結構:索引順序表的分塊查詢,線性衝突再雜湊的hash表的查詢(Hash表將在一個專題裡面講到)等。
上面介紹查詢表都屬於靜態查詢結構,也就是說當需要查詢的資料集合動態變化的時候,這些結構都很不方便。
折半查詢: 當查詢過程中沒有發現元素A的時候,需要動態新增元素A,此時整個有序表將面臨重新排序的問題。
靜態最優查詢樹: 新增元素不光要重新排序,而且原有的整棵帶權路徑長度最小值的樹也將重建(最優解變化了)。這在代價上是沉重的,這也是為什麼 靜態最優查詢樹並不適合實際應用的巨大缺陷了。
正是由於實際應用中,很多時候需要在查詢的同時進行新增,刪除操作。因此便捷的動態查詢結構就十分的總要了。下面我們用專題的形式詳細講解二叉查詢樹 ,平衡二叉樹 ,紅黑樹 ,B-樹/B+樹 。