字典序問題分析及原始碼
字典序問題
題目:
在資料加密和資料壓縮中常需要對特殊的字串進行編碼.給定的字母表A由26個小寫英文字母組成,即A={a,b...z}.該字母表產生的長序字串是指定字串中字母從左到右出現的次序與字母在字母表中出現的次序相同,且每個字元最多出現1次.例如,a,b,ab,bc,xyz,等字串是升序字串.現在對字母表A產生的所有長度不超過6的升序字串按照字典排列編碼如下:
對於任意長度不超過6的升序字串,迅速計算出它在上述字典中的編碼.
分析:
設任意給定長度n<=6的字串x1x2...xn,(原則上使用者可以輸入任意長度的,使用者不妨算下當n>6時字典序的個數有多少。)
1、我們知道字串長度為1的字典序列有:
a -------z 長度為26
2、字串長度為2的字典序列有:
Ab----------az 長度為25
Bc----------bz 長度為24
Cd-----------cz 長度為23
。。。 ....
Yz -------- 長度為1
3、字串長度為3的字典序列有:
Abc-------------ayz 長度為:24+23+。。。。+1
Bcd-------------byz 長度為:23+22+.......+1
........... ...............
Xyz ----------------1
由以上我們可以容易得到,因為是升序,而且考慮的是k-1位,所以可以用遞迴表示,設f(i,k)表示以i開頭,長度為k的個數,則有
f(i,k) = 。。。。。。。。。。。(1)
當我們判斷符串x1x2...xn時首先得判斷長度<n各長度的個數,設長度為K的字串的個數為g(k),則知道當k<n時,g(k) = 。。。。。。。。。。(2)
以上考慮的是當K<N 時的情況,現在考慮n位的情況。x1x2...xn
首先求出到x1之前有多少個長度為N且符合要求的序列,再考慮到x2 之前長度為n-1符合要求的序列..........一直分析到xn
根據前面得分析容易得到:
。。。。。(3)
所以對於給定的長度為N的字串其字典序為:
原始碼:
根據以上的分析,每個求和都可以寫一個迴圈,對f(i,k)來說得寫出個遞迴,
注原始碼從網上收集,很多的。