1. 程式人生 > >[學習][Math]康托展開和逆康托展開

[學習][Math]康托展開和逆康托展開

序列 計算 math strong 應用 全排列 第一個 因此 一個數

一、康托展開

問題:{1,2,3,4,5}5個數的全排列中,{2,3,1,5,4}排字典序的第幾位?

解決:計算{2,3,1,5,4}的康托展開值:x=a[1]*4!+a[2]*3!+a[3]*2!+a[4]*1!+a[5]*0!=1*24+1*6+0*2+1*1+0*0=31, 所以{2,3,1,5,4}排字典序第32位

解釋:計算{2,3,1,5,4}排第幾位,就要計算比{2,3,1,5,4}字典序小的排列有幾個,而這個就是{2,3,1,5,4}的康托展開值,要如何計算呢,其實很簡單:

首先看序列中第一個數2,1~5中比2小的數有1個,因此這就可以生成1*4!個比{2,3,1,5,4}小的序列,即{1,x,x,x,x}

再看第二個數3,1~5(除去2)中比3小的數有1個,因此又可以有1*3!個比{2,3,1,5,4}小的序列,即{2,2,x,x,x}

再看第三個數1,1~5(除去2,3)中比1小的數有0個,因此又有0*2!個比{2,3,1,5,4}小的序列

再看第四個數5,1~5(除去2,3,1)中比5小的數有1個,因此又有1*1!個比{2,3,1,5,4}小的序列,即{2,3,1,4,x}

最後一個數4,1~5(除去2,3,1,5)中比4小的數有0個,因此又有0*0!個比{2,3,1,5,4}小的序列

綜上,比{2,3,1,5,4}小的序列共有x=1*4!+1*3!+0*2!+1*1!+0*0!=31個,所以{2,3,1,5,4}排字典序32位

二、逆康托展開

問題:{1,2,3,4,5}的全排列中,字典序排23位的排列是哪一個?

解決:由康托展開值x=a[1]*4!+a[2]*3!+a[3]*2!+a[4]*1!+a[5]*0!=22,逆推出a[1]=22/4!=0,a[2]=22/3!=3,a[3]=4/2!=2,a[4]=0/1!=0,a[5]=0/0!=0,可知,字典序排23位的排是{1,5,4,2,3}

解釋:

三、應用

[學習][Math]康托展開和逆康托展開