使用時包含標頭檔案ptree.h 還要編譯ptree.c檔案。
3.1.1. 應用
pat tree是目前資訊檢索領域應用十分成功的索引方法。主要在字串子串匹配上有著非常優異的表現,採用半無限長字串作為字串的查詢結構。當有了乙個文件的所有半無限長字串的集合,該文件的任何子串都可以定位為某一半無限長字串的字首。
半無限長字串:就是一串字元的順序子串(從一給定點到串的結尾)。
比如乙個字串cuhk,它的半無限長字串:cuhk、uhk、hk和k。
3.1.2. 基本定義
pat tree是由所有可能的無限長字串所構成的一棵樹。在pat tree中通過逐個鑑別半無限長字串的二進位制位來判斷樹中的分支,如果二進位制位是0則產生左分支,是1則產生右分支,因此pat tree是一棵二叉樹,樹的結點分為外部結點和內部結點。
外部結點:也就是樹的葉子結點,用來記錄半無限長字串的首字元在完整半無限長字串中的開始位置(字元索引)和半無限長字串出現的頻次。
內部結點:除了葉子結點的所有結點,這個結點是自動新增的,用來記錄索引的路徑,它有三個基本的資料項:左指標、右指標、比較位。
左指標:指向該結點的左子樹。
右指標:指向該結點的右子樹。
3.1.3. 原理說明
將所有半無限長字串,用二進位制位來表示。它們之間的比較也是以bit位為單位來進行比較。
規定所有半無限長字串的長度要一致,結尾沒有的空字元用0來填充。
3.1.4. 舉例說明
圖 1 pat tree示例圖
3.1.5. 檢索過程
檢索過程就是根據查詢字串在pat tree中從根結點尋找路徑的過程。當比較完查詢字串所有位置後,搜尋路徑達到pat tree的某一結點。
若該結點為葉子結點,則判斷查詢字串是否為葉子結點所指的半無限長字串的字首,如果判斷為真,則查詢字串出現的頻次即為葉子結點中記錄的頻次;否則,該查詢字串不存在。
若該結點為內部結點,則判斷查詢字串是否為該結點所轄子樹中任一葉子結點所指的半無限長字串的字首。如果判斷為真,該子樹中所有葉子結點記錄的頻次之和即為查詢字串的出現頻次。否則,查詢字串不存在。
這樣,通過pat tree可以檢索原文中任意長度的字串及其出現頻次。
資料結構不同。
ptree.c檔案中儲存的關鍵首席資訊官度可以不同。
對於ptree.c檔案中的pat tree內部結點有可能是我們手動新增的結點。
利用ptree.c檔案中的**cuhk、uhk、hk和k的儲存效果為2圖。
圖2 ptree.c示例圖
3.3.1. 資料結構
圖 3 ptree.h資料結構圖
3.3.2. 設計原理
查詢最長匹配的結點:
a. 從頭結點開始依次向下比較,取兩個key_len中較小值為關鍵字的比較長度;
b. 如果,比較到某結點不匹配,那麼它的父結點為最長匹配結點(父結點為null表示沒有匹配到結點),直到把待匹配結點的key_len匹配完。
新增結點:
a. 從頭結點開始,檢視是否有完全匹配的結點,如果有,不新增新結點。
b. 如果沒有,獲取最長匹配的結點。
如果該結點是第乙個新增的結點,把該結點定義為頭結點。
如果最長匹配的結點為葉子結點,把待匹配結點新增為該葉子結點的孩子結點。
如果最長匹配的結點的孩子結點為葉子結點,把待匹配的結點插入到最長匹配結點和它的孩子結點之間。
否則,需要新增通配結點。
刪除結點:
待刪除結點的lock屬性應等於0,info為null且左、右子樹不能都存在,才可進行刪除操作。
結點的lock屬性:
每個結點都包含乙個lock成員,稱為結點的訪問計數。
新建立的資訊結點沒有進行任何操作時,它的lock值等於1。
自動新增的通配結點沒有進行任何操作時,它的lock值等於0。
新增新結點時,如果存在完全匹配的結點,不新增結點,但原結點的lock值會+1。
每次訪問(遍歷、查詢、新增)該結點時呼叫ptree_lock_node()函式使lock值+1,訪問結束後呼叫ptree_unlock_node()函式lock值-1,使之恢復原值。
3.3.3. 舉例說明
有三個結點,假設key_len都為3(bit),關鍵字的前三個bit位分別是:010、100和101,其中結點1和結點2均為通配結點。
結點1:key_len == 0(bit);
結點2:key_len == 1(bit)。
圖 4
圖 6
說明:向pat tree中增加結點101......時,當匹配到第二bit位時,沒有結點可以繼續匹配,在增加結點的同時,會自動產生乙個key_len = 2(bit),key值為10(含有2個bit位)的通配虛結點,邏輯圖如上圖所示,通配結點的p_left指標,指向不匹配的bit位為0的結點100......,p_right指標指向不匹配的bit位為1的結點101......。1.首先呼叫ptree_init初始化tree結構
2.然後呼叫ptree_node_get新增節點
3.通過呼叫ptree_node_lookup查詢匹配key的節點
3呼叫ptree_node_delete刪除指定節點
4.最後呼叫ptree_finish釋放節點
備註:lock索引值在每次有返回節點時都會加一,在處理完該節點後記得ptree_unlock_node該節點!
Redis資料結構分析
redis有 記憶體資料庫的讚譽,其支援一下幾種資料結構 1.string 2.hashes 3.list 4.set 本文從源 角度來分析各種資料結構在 redis 內部是如何儲存和讀取的。在介紹各種資料結構之前,首先來介紹下 redisobject 這個 struct string hash l...
資料結構 演算法分析
1 冒泡法 冒泡法大家都較熟悉。其原理為從a 0 開始,依次將其和後面的元素比較,若a 0 a i 則交換它們,一直比較到a n 同理對a 1 a 2 a n 1 處理,即完成排序。voidbubble int a,intn 定義兩個引數 陣列首位址與陣列大小 冒泡法原理簡單,但其缺點是交換次數多,...
TS資料結構分析
ts包頭定義 typedef struct ts packet header ts packet header ts包頭解析 hresult cts stream parse adjust ts packet header ts packet header ts header 全稱program s...