字尾陣列SA

2021-08-23 14:23:56 字數 832 閱讀 5324

給定乙個字串s,按字典序排序s的所有子串

鬼知道什麼思想,好像沒有什麼思想。哦,想起來了,是倍增。

考慮最簡單的字尾間o(

n)o (n

)比較和快排o(

nlog

n)o (n

logn

),總複雜度o(

n2lo

gn) o(n

2log

n)

。考慮優化字串間的比較,用倍增的思想,假設k/

2 k/2

長度的已經比完了,比較長度為

k k

的字串(長度不足補

0' role="presentation">0

0)只要比前k/

2 k/2

段再比較後k/

2 k/2

段,也就是把字串當做乙個二元組做雙關鍵字排序,其中k≪=

1 k≪=1

。這樣複雜度是o(

nlog

2n) o(n

log2

n)

的。考慮到我們是對字串排序,字串長度為

n n

,則每個值的種類最多

n' role="presentation">n

n種,所以可以用基數排序。於是複雜度來到o(

nlog

n)o (n

logn

)。

詳見**,細節太多

void qsort()

}}

清爽版

void qsort()

}}

SA 字尾陣列

首先一定要確定sa 是個什麼東西 sa i 表示的是排名為 i 的字尾是哪乙個 至於字尾 i的排名是多少,那個是ra nk i 當然啦 最最最難懂的就是基數排序 要是不用基數排序,每次對於乙個二元組直接so rt一下 這樣的複雜度是o nlog 2 對於二元組的基數排序應該是這樣做的 首先把所有元素...

字尾陣列SA

原理 其本質就是把字串的所有字尾進行排序。用普通排序需要o nlogn 但是字串比較和數字比較不同,所以實際需要o n nlogn 為了讓這個過程快一點,所以有了倍增演算法,o nlogn 和dc3演算法,o n 倍增演算法比較簡單,也比較好寫,具體可以參考這個大佬的部落格。dc3演算法複雜一點,但...

SA 字尾陣列

首先一定要確定 sa 是個什麼東西 sa i 表示的是排名為 i 的字尾是哪乙個 至於字尾 i 的排名是多少,那個是 rank i 當然啦最最最難懂的就是基數排序 要是不用基數排序,每次對於乙個二元組直接 sort 一下 這樣的複雜度是 o nlog 2 對於二元組的基數排序應該是這樣做的 首先把所...