關於拼音的datrie樹的修改

2021-07-11 14:45:56 字數 2000 閱讀 5609

datrie樹的邏輯模型

原有的建樹規則

該樹的建立,是以字典中,相應的拼音為材料進行建立,對樹的遍歷,其實本質上是搜尋拼音是否存在,以層為基礎,最長的字串的長度,是該樹的深度。 按層掃瞄所有的拼音。

在字典檔案中,表現為,按照最長字串的長度,進行for

迴圈,每次迴圈,每個拼音的前

i個,表示到了i層。

前i個字元,到了第

i層的路徑。 獲得前

i個字元相同的拼音,這含義是,他們歸屬該

i層的同乙個路徑,將後乙個字元記錄下來,這些前

i個字元相同的拼音,第 

i+1 

個字元,是該路徑,向下子節點的邊。

這樣,在層次遍歷的過程中,獲得相同層次,同乙個路徑的向後的邊的值和數目。

按路徑向後的邊的數目,從大到小排序後, 前一半的路徑, 直接從儲存陣列順序可用的位置獲取數值,給該路徑的本層節點的base[i]

賦值,然後按照 

base + 

邊向量 的值,順序占用儲存空間的位置。

前一半的路徑i

,不斷的占用儲存空間, 該過程,將會導致空位置,路徑向後的邊,的向量值,有可能是不連續的,那麼在儲存陣列中占用的位置,也將是不連續。 這一點,將導致空間浪費。

後一半的路徑, 從儲存陣列的開始,逐次尋找滿足 該路徑的向後的邊的資料的 連續空間, 該過程會填充前一半路徑占用儲存陣列位置時候,沒有用到的空間。

原有的專案的效能瓶頸

最主要影響效能的地方,在於,當層次遍歷的過程中, 到達該層的路徑,與該路徑後續的邊, 都建立了stl

的map

容器。並且,又重新建立了乙個同樣容量的

vector

, 對該

map進行排序。 每個路徑都是乙個

map對映,造成了大量的記憶體占用,並且由於在層次遍歷過程中,動態開闢這些

stl容器,導致耗費了大量的

cpu時間,致使執行時間過長。

解決方法,在不破壞該數學模型,以及整體的思路的情況下,修改在層次遍歷的過程中, 相應的對 路徑 =

》 向後的邊 

的map

對映的結構。 針對字典檔案的特性,建立乙個矩陣,矩陣的行的個數,是

pinyin

的個數, 矩陣的列的個數,是最大字串的長度, 列代表樹的深度, 行代表該層所有的節點。

字典檔案中,對pinyin

的儲存 aa

bdab

beba

syba

z i 行 

*  j列

優化策略利用了拼音檔案中,拼音字元儲存順序的特性。

拼音檔案中,拼音的順序,是按照列, ascii 

碼 由低到高 排列, 並且,相同列樹的兩行,總是滿足, 

line[j] <= next_line[j] 

的ascii碼。

那麼,在第 j 

列, 如果連續的兩行,他們的前 

j 個字元相等, 那麼他們將具有相同的字首,而他們的 第 

j+1 

個字元,將是該路徑的向後的邊的向量。如果該 第 

j+1 

個字元,也相同,那麼就說明他們具有相同的向後的邊,依然是同一條路徑, 不能分開儲存。

優化的原則,主要在於,修改原有的結構中,在第 j 

層,該層相同的路徑,與後面的邊,之間的 

map對映結構

按照陣列來儲存 拼音字元, 那前 j 

個字元相同的連續的行,並且必須滿足 第 

j+1 

個字元不同,那麼他們符合原有的專案中,相應的 

key => value 

對映關係。

原有的專案,利用了set

容器,用來規避相同的第 

j+1 

個字元相同, 會導致該路徑向後的邊的統計失效的情況。

隨後的策略與原有專案保持一致。

取出該層,對每個不同的路徑,按照這些不同的路徑的 向後的邊 的個數, 由大到小排序, 前一半依次占用 儲存陣列的位置, 後一半從陣列開始,查詢能符合儲存個數的連續空間。

關於漢字生成拼音的的函式

關於漢字生成拼音的的函式 delphi windows sdk api 怎麼把乙個呼叫乙個函式就能把乙個漢字生成拼音 比如輸入 青黴素 生成 qms 知道的請告訴我一下,謝了 來自超級猛料的函式 function gethzpy const ahzstr string string const ch...

關於Theme的修改

一 每一種theme都有自己的樣式,包括dialog什麼的,我得需求是不管什麼主題,彈出的對話方塊都是白色對話方塊,1,theme檔案位置z myandroid frameworks base core res res values,那麼好了,找到theme裡面設定對話方塊的樣式的位置,這是我把th...

線段樹的修改

對於一棵 最大線段樹,每個節點包含乙個額外的max屬性,用於儲存該節點所代表區間的最大值。設計乙個modify的方法,接受三個引數root index和value。該方法將 root 為跟的線段樹中 start,end index,index 的節點修改為了新的 value 並確保在修改後,線段樹的...