對第二關鍵字桶排序,保持相對順序不變,則個位數字有序,對第一關鍵字桶排序,由於第一關鍵字相同情況下個位總是遞增或持平,所以保持有序。
——《高階資料結構》
#include#includeusing namespace std;
//獲取字尾陣列中對應字尾的原本位置
#define getrealpos()
//二元組的排序比較
inline bool cmp(int a1,int a2,int b1,int b2)
=[0,v)。
類似dc3的定義,有bk=,其中k屬於[0,v)。那麼,取樣集合c現在為:c=uk屬於dbk.
步驟二:構建字尾取樣集合的字尾陣列
對於rk,現在我們沒v個字元一組形成新的「字元」:rk=[tktk+1…tk+v-1] [tk+tk+v+1…tk+2v-1]…直到t的末尾。
同樣,定義r為所有rk首尾相接的結果。利用基數排序和遞迴,我們同樣可以得到被取樣字尾的字尾陣列,類似dc3。
步驟三 計算未被取樣的字尾陣列名次
令d=[0,v)-d,則同樣被取樣集合為c=uk屬於dbk。對某個k屬於d,我們單獨對字尾集合suffix(bk)進行排序。這一步與dc3中有一些小的區別:我們需要找到乙個l,使得(k+l)mod v屬於d。這樣做是為了找到l元組來表示從位置i開始的字尾(ti,ti+1,…ti+l-1,rank(suffix(i+l))),可見,如果rank(suffix(i+l))已知,等價於(i+l) mod v屬於d,同時注意i mod v=k,因此l需要滿足(k+l) mod v屬於d。
現在需要證明的是上述l一定存在。根據定義,對k屬於[0,v),存在i,j屬於d,使得(i-j)同余於k(mod v),令l為j,則有(k+l)同余於i(mod v),得證。這裡對於每個k,使對應的l可以首先預處理出來。
由於存在有d個未被取樣的字尾集合,故上述演算法需要執行d次。
字尾陣列 dc3 模板
sa 按順序排列。ranks指出了每乙個位置的排名。maxn 表示字尾的個數 define maxn 200010 define f x x 3 x 3 1?0 tb define g x x int ra maxn rb maxn rv maxn rs maxn int c0 int r,int ...
Django學習筆記 3 模板
dtl為django 內建的模板語言,可以實現和django的無縫銜接。載入靜態檔案 使用static標籤來載入靜態檔案。確保在settings.py中設定了static url。staticfiles dirs os.path.join base dir,static 在模板中使用load標籤載入...
演算法筆記2 8 問題 D C語言11 7
編寫兩個函式input和print,分別用來輸入5個學生的資料記錄和列印這5個學生的記錄。對於每乙個學生,其記錄包含了學號 名字 3門課程的成績共5項。用主函式分別呼叫input和print函式進行輸入和輸出。要求使用結構體陣列實現,結構體中包括了每個學生的5項記錄。共有5行,每行包含了乙個學生的學...