資料結構 字尾陣列

2021-07-08 21:57:20 字數 1060 閱讀 5297

學習了一下字尾陣列。這個題目是字尾陣列裡面比較經典的一種。

字尾陣列有幾個比較經典的應用

字尾陣列主要是用於把乙個字串的字尾排序。

先說幾個常用的陣列

sa陣列:sa[i]表示排名為i的字尾在原串中的起始位置是多少

rank陣列:rank[i]表示起始位置為i的字尾排名第幾

h陣列:h[i]表示排名第i的字尾和排名第i-1的字尾的最長公共字首(lcp)是多少

主要的計算過程都是在計算rank陣列。得到rank陣列後乙個for迴圈可以得到sa陣列。然後兩個for迴圈可以得到h陣列。

以下認為起始下標是1。

每個字尾需要記錄它的前一半字串的排名(第一關鍵字),後一半字串的排名(第二關鍵字),以及這個串的起始下標。

首先實現乙個基數排序。字尾陣列不再將兩個串的字元進行比較,而是利用倍增的方式,每次比較都是二元組的比較。基數排序是從低位開始,先對低位排序,再對高位排序。每次排序都使用桶排序。基數排序實際上,是先把每個元素放到對應的桶裡。然後從前往後把所有桶的結果加起來得到cnt。這樣可以得到每個桶裡元素的結束位置+1的下標值。最後從後往前遍歷,遇到乙個元素,就放在對應cnt記錄的位置裡,放之前要把位置減1。

排序之後,得到乙個長度為k的字尾的排名。遍歷這個排好序的結果,計算rank陣列的值。一樣的字串排名相同,採用1 1 2 2 3這樣的編碼。

接下來要計算長度為k * 2的字尾的排名,於是把之間計算得到的結果拼接成二元組。然後基數排序。

當字尾沒有第二個元素時,補0。所以從1開始下標。

sa和rank可以互推。即

sa[rank[i]] = i。

從左往右計算h陣列。可以推出

h[i] >= h[i - 1] - 1

最長公共字首有如下關係

lcp(s[i], s[j]) = min

即,兩個字尾的lcp是它們之間的字串兩兩之間lcp的最小值。兩兩之間的lcp就是h陣列,所以就是h陣列的最小值。

也有可重疊的版本,比這個簡單。

資料結構 倍增演算法 字尾陣列

字尾陣列 先根據字串中字元的出現情況,給每一種字元乙個對應的排名 從1開始 作為第一次排序的結果 如此迴圈,直到第乙個位置加上倍增步數後超出字串長度為止,算作演算法結束,此時得到的排序結果即為sa陣列 總共排序次數為 logn 若排序使用快排o nlogn 則總時間複雜度為o nlog2n 若使用基...

資料結構 陣列

建立陣列 大小為50 棧空間存myarray引用 堆空間存乙個大小為50,預設值為0的陣列。棧空間myarray引用指向堆空間該陣列。int myarray new int 50 public class testarray public class testarray if s intarray....

資料結構 陣列

陣列 就是相同型別的資料按一定順序排列的集合,把有限個型別相同的資料元素用乙個名字表示,通過編號來區分。名字即為陣列名,編號即為下標。陣列是最簡單 使用最廣泛的一種資料結構,其實就是一塊連續的記憶體,哪怕物理上不連續,邏輯上也是連續的,連續存放著一組相同型別資料元素。陣列的定義 type 變數名 n...