字尾陣列倍增法理解

2022-06-13 16:36:14 字數 768 閱讀 8778

int

wa[maxn],wb[maxn],wv[maxn],ws[maxn];

int cmp(int *r , int a, int b, int

l)void da (int *r , int *sa , int n, int

m)}

字尾陣列最終得到的是sa和rank兩個陣列,sa[i]是排第i名的是誰,rank[i]是以第i個字元為開頭的字尾排第幾,由於任意字尾都有確定的大小,所以sa是嚴格由小到大排列的,也就是說任意i都有sa[i]然後就說一下用到的陣列,x陣列就是未完成的rank陣列,y陣列則是乙個比較所用的偽"sa"陣列,ws陣列則是rank的字首和陣列。初始化的話y[i]=n-i,因為初試的時候預設的話肯定是以長度為輔排序,那麼y[0]也就是說最小的輔開頭就是最後乙個了,然後遍歷的時候其實是從y[n-1]也就是0開始的,所以原**中寫的不是很合理。

wv陣列是沒有必要的。

先說一下關鍵字的問題,初始第一關鍵字是s[i],第二關鍵字則是其下標i,然後進入到for迴圈中的第一關鍵字是s[i,i+2^k-1],第二關鍵字是s[i+2^k,i+2^(k+1)-1].

sa[--ws[wv[i]]] = y[i];這是排序的關鍵語句,對於以第一排序關鍵字相同的情況下,那麼就是第二關鍵字越大的越在後面了,為了保證這一點,就要從y[n-1]到y[0]遍歷。

這是用的桶排序方法,也就是說第一關鍵字相同的一定是在乙個連續的且與其餘不相交的區域內,可以結合這預處理那一段進行理解, 由於在空間上並不是連續分布的,所以這段看著會有些難懂

字尾陣列倍增法

字尾陣列 字尾陣列是處理字串的有力工具。字尾陣列是字尾樹的乙個非常精巧的替代品,它比字尾樹容易程式設計實現,能夠實現字尾樹的很多功能而時間複雜度也並不遜色,而且它比字尾樹所占用的記憶體空間小很多。可以說,在資訊學競賽中字尾陣列比字尾樹要更為實用。1.1 基本定義 子串 字串s的子串r i.j i j...

字尾陣列(倍增法)

字尾陣列 suffix array 將某個字串的所有字尾按字典序排序後得到的陣列。演算法 樸素實現 直接將所有字尾進行排序,將n個長度為o n 的字串進行排序,時間複雜度o n 2 logn 倍增演算法 通過充分利用各個字尾之間的聯絡,將構造字尾陣列的最壞時間複雜度成功降至o n logn 倍增法實...

字尾陣列 倍增法詳解

主要是基於基數排序,如果基數排序沒弄懂 就會很難理解 首先從k 0開始,從字尾陣列裡面選取步長為2 k的字尾陣列的前子串 然後進行基數排序 如果排序後所有的名次陣列的值都不相同,那麼排序結束 否則,k 也就是步長翻倍 繼續排序。陣列sa sorted array 構造完成前表示關鍵字陣列,下標表示名...