LCP的引入筆記

2021-09-20 21:38:37 字數 1846 閱讀 5402

——《高階資料結構》

前面介紹了幾種演算法構造字尾陣列,雖然得到的字尾陣列已經能處理一些簡單的問題,但是為了讓其能夠具有與字尾樹相媲美的字串處理能力,需要引入輔助工具——lcp(longest common prefix,最長公共字首)。

對於字串st1和st2,它們的最長公共字首lcp_str(st1,st2)定義為最大的整數len,滿足st1的len次方=st2的len次方(記號意義同前文中)。當然,len不會超過兩者中較短字串的長度。對於字尾陣列,我們需要知道的是任意兩個字尾的最長公共字首 。因此定義lcp_idx(i,j)=lcp_str(suffix(sa(i)),suffix(sa(j))),即排名第i的字尾和排名為j的字尾的lcp。

不難發現,lcp_idx與操作元順序無關,並且對於兩個相同的字串,它們的lcp即它們的長度,因此為了求解方便,我們只需要求所有i0且rank(i)>0,有height[rank(i)]>=height[rank(i-1)]-1。據此按照i遞增的順序求解height[rank(i)]。計算height[rank(i)]時,不要從第乙個字元開始比較,而是從第height[rank(i-1)]個字元開始比較。

用步驟3的方法可以在o(n)的時間內得到height陣列,至此可以完美解決本問題。

根據以上描述,不難得到如下的**(僅構造height陣列,rmq過程省略):

//引數分別為:字串st(下標從0開始),字尾陣列指標,名次陣列指標,待計算的height陣列指標及字串長度

void getheght(int* st,int* sa,int* rank,in* height,int n)

}下面給出以上相關的證明

1.對於i=len;同時,若有lcp_idx(i,k)>len;假設為len2,那麼suffix(sa(i))的len2次方=suffix(sa(k))的len2次方。由i=len2,矛盾,所以lcp_idx(i,k)<=len。得證。

步驟二:應用步驟一的結論將lcp_idx(i,j)展開。若i+1=j,那麼顯然成立;否則,答案為min(lcp_idx(i,i+1)),lcp_idx(i,i+1),lcp_idx(i+1,j),第一項可以直接寫出,第二項繼續展開,最後的結果便是證明的式子。

2.對於i>0且rank(i)>0,有height[rank(i)]>=height[rank(i-1)]-1

證明:當height[rank(i-1)]<=1時顯然成立,當height[rank(i-1)]>1時,因為height[0]=0,所以rank(i-1)>0。不妨令j=i-1,k=sa[rank(j)-1],那麼有height[rank(i-1)]=lcp_str(suffix(k),suffix(j))>1。將這兩個字尾各自去掉其第乙個字元得到新的兩個字尾為suffix(k+1)和suffix(j+1=i),顯然lcp_str(suffix(k+1),suffix(i))=lcp_str(suffix(k),suffix(j))-1=height[rank[i-1]]-1。同時,我們注意到,suffix(k)=rank(k+1),故lcp_idx(rank(i)-1,rank(i))>=lcp_idx(rank(k+1),rank(i)).該不等式左邊即為height[rank(i)],而右邊為height[rank(i-1)]=-1,故得證。

3。計算height陣列過程的時間複雜度為 o(n)

證明:根據2中的結論,我們可以按照i從小到大的順序計算height陣列。計算height[rank(i)]時,對於i>.0且rank(i)>0的情況,我們從height[rank(i-1)]-1開始,逐一比較,該過程總時間複雜度為o(n),好比蝸牛爬桿,每天至多爬到頂,每天下降一步,最後上爬的步數至多為2n;而對於i=0或者rank(i)=0的情況,即使從頭開始順次比較,最壞也只要各自比較n次。綜上所述,總共比較的次數不會超過4n次,故演算法的時間複雜度為o(n)。

引入外部css CSS的引入方式筆記

css一共有五種引用方式。1 直接在body h1等標籤裡面寫標籤或者屬性,這種叫做行內式,不過這種基本已經廢棄了 body的背景顏色為紅色 hi標籤居中,並且顏色為紅色 2 在body h1等標籤裡面寫上style,這種叫做style屬性,把樣式寫在標籤上,也叫所style內聯樣式,這種方式會導致...

index索引入門筆記

不同的儲存引擎支援不同的索引模式對於任何dbms,索引都是進行優化的最主要的因素。對於少量的資料,沒有合適的索引影響不是很大,但是,當隨著資料量的增加,效能 會急劇下降。如果對多列進行索引 組合索引 列的順序非常重要,mysql僅能對索引最左邊的字首進行有效的查詢。例如 假設存在組合索引it1c1c...

執行緒的引入

朱老師物聯網大講堂 學習筆記 用執行緒實現之前滑鼠鍵盤的輸入的讀取,這個示例 是老師課上講解用的,有問題,不過我們主要是用來引入執行緒,include include include include include include include char buf 200 void func voi...