問題:很多應用都需要搜尋一組資料,比如編譯器查詢變數名以得到其位址,拼寫檢查器查詢字典,dns查詢網域名稱來獲得ip位址。這與如何儲存這些資料緊密相關。比如儲存一組整數,如果用集合來儲存,如何實現整數集合?
我們一般實現有序整數集合,這樣就可以使用二分搜尋搜尋來快速進行搜尋。為簡單起見,下面的各種方案只集中於演算法的關鍵部分,並沒有考慮錯誤處理、虛構函式釋放資源、拷貝構造等問題。
(1)用標準模板庫set來實現:通常標準模板庫set是使用平衡二叉樹來實現的。
(2)用陣列實現:適用於事先知道集合大小的情況。使用了乙個哨兵元素,放置乙個充分大的數(比集合中任何的元素都大)。這樣一旦搜尋到這個數,表明到達列表末尾,從而可以簡化插入**,提高執行速度。陣列的優點就是可以隨機訪問。
(3)用鍊錶實現:使用遞迴遍歷來進行有序插入。也使用了乙個哨兵結點,其值大於所有實際的值。一旦到達哨兵結點,就表示到達鍊錶末尾。
(4)用二叉樹實現:這裡用二分搜尋樹來實現,它是有序的二叉樹。將集合元素按序寫入陣列時使用了中序遍歷。為簡便,這裡沒有使用平衡二叉樹。平衡二叉樹的主要優點就是能確保在最壞情況下也有較好的效能。二叉樹的插入時間效率最高,為o(logn)。
(5)用位圖實現:點陣圖的優點就是使用移位運算,效率非常高。缺點是當n非常大時,點陣圖會變得很大,占用大量的記憶體空間,這是一種空間換時間的策略。
(6)使用雜湊表來實現:箱是一種雜湊表結構,它結合了鍊錶和位向量的優點。所有的箱用乙個陣列表示,每個箱中的所有整數用乙個有序鍊錶儲存。整數t被雜湊到箱bin[1+maxval/bins]中,這裡bins為箱的個數,maxval為充分大的數(存放在哨兵位置處)。
關鍵演算法設計思想:線性結構(陣列、鍊錶、位圖)、樹形結構(二叉樹、二分搜尋樹、平衡二叉樹)、雜湊表結構、集合結構、遞迴、哨兵技術。
集合運算(整數區間) C實現
最近寫專案 裡用到很多整數區間運算,呼叫頻率很高,想著網上有沒有好的封裝借鑑一下。奈何一頓搜尋猛如虎,合用封裝基本無。不如自己寫乙個了。話不多說,直接上 備註完善,測試可用。include include include define left p p 0 define right p p 1 in...
Redis的整數集合
整數集合是集合鍵的底層實現之一,是redis用於儲存整數值的集合抽象資料結構,可以儲存的型別為int16 t int32 t int64 t,並保證集合中不會出現重複元素 typedef struct intset intset 將乙個新元素加到整數集合,如果新元素的型別比整數集合現有所有元素的型別...
Redis設計與實現 整數集合intset
整數集合是集合鍵的底層實現之一。特點 1 有序 2 無重複 3 支援公升級,不支援降級 typedef struct intsetintset contents陣列是整數集合的底層實現 整數集合的每個元素都是contents陣列的乙個陣列項 item 各個項在陣列中按值的大小從小到大有序的排列,並且...