轉乙個字尾陣列的簡單總結

2022-08-09 20:45:14 字數 1221 閱讀 5274

然後就是怎麼快速求所有字尾的順序了,其中的關鍵是如何減少兩個字尾比較的複雜度

方法是倍增法,定義乙個字串的k-字首為該字串的前k個字元組成的串,關於在k-字尾上的定義suffix(k,i)、sa[k,i]和rank[k,i]類似於前,則有

這樣就能在常數時間內比較suffix(2^k, i)之間的大小,從而對suffix(2^k,i)時行排序,最後當2^k>n時,suffix(2^k, i)之間的大小即為所有字尾之間的大小

於是求出了所有字尾的排序,有什麼用呢?主要是用於求它們之間的最長公共字首(longest common prefix,lcp)

令lcp(i,j)為第i小的字尾和第j小的字尾(也就是suffix(sa[i])和suffix(sa[j]))的最長公共字首的長度,則有如下兩個性質:

對任意i<=k<=j,有lcp(i,j) = min(lcp(i,k),lcp(k,j))

lcp(i,j)=min(i

第乙個性質是顯然的,它的意義在於可以用來證明第二個性質。第二個性質的意義在於提供了乙個將lcp問題轉換為rmq問題的方法:

令height[i]=lcp(i-1,i),即height[i]代表第i小的字尾與第i-1小的字尾的lcp,則求lcp(i,j)就等於求height[i+1]~height[j]之間的rmq,套用rmq演算法就可以了,複雜度是預處理o(nlogn),查詢o(1)

然後height的求法要用到另乙個陣列:令h[i]=height[rank[i]],即h[i]表示suffix(i)的height值(同時height[i]就表示suffix(sa[i])的height值),則有height[i]=h[sa[i]]

然後h[i]有個性質:

用這個性質我們在計算h[i]的時候進行字尾比較時只需從第h[i-1]位起比較,從而總的比較的複雜度是o(n),也就是說h陣列在o(n)的時間內解決了。求出了h陣列,根據關係式height[i]=h[sa[i]]可以在o(n)時間內求出height陣列,於是可以在o(n)時間內求出height陣列,

從而整個lcp問題就解決了^_^

然後字尾陣列的應用就是利用它的lcp在需要字串比較時降低複雜度。同時由於字尾陣列的有序性可以很方便地使用二分

於是總結一下要點:

本題是求兩字串的最長公告子串(注意是子串不是子串行),構造出sa,ra和height後,答案就是最大的height,但這個最大的height可能是同乙個串中的,

所以這個最大的height同時要滿足sa[i-1]和sa[i]不在同乙個串中。

乙個案例的簡單總結

翻看去年處理的乙個案例,發現處理時間挺長的,而且這個案例也有點意思,就再看多兩眼,做個簡單總結。1.首先是應用伺服器效能不穩定,排查之後,伺服器是vm,要求加資源,並且所有資源都reserved.2.接著就是應用伺服器連線資料庫時很不穩定,資料庫經常報 recovery mode 好像是資料庫莫名被...

乙個剖析AJAX原理的簡單範例 轉

宣告 本 是引用自奚江華的著作,但我沒有在網路找到相關位址,所以沒有新增相關引用。這個例子是我手動敲打進來的,一是為了自己練習一下,二來也方便大家學習和指教。為了讓各為能夠了解什麼是ajax,以下是乙個ajax的手工範例 即不引用任何的library或ajax framework 此範例頗為精要易懂...

利用陣列實現乙個簡單的棧

package com.stack 用陣列實現乙個簡單的棧 方法 壓入元素 push 彈出棧頂元素 pop 棧的大小 size 棧是否為空 isempty public class arraytostack 向棧中新增元素 param item public void push item item ...