在乙個全排列中,比如在1,2,3,4,5所有的全排列中,如何確定34152在1,2,3,4,5所欲排列中排第幾?
康托展開的公式為以1,2,3,4,5為例,那麼康托展開的公式為
x=a[5](5-1)!+a[4](4-1)!+a[3](3-1)!+a[2](2-1)!+a[1]*(1-1)
其中1<=a[i]<=5,a[i]表示(從首位開始算)指的是位於位置i後面的數小於a[i]值的個數。比如34152的康托展開式子為:
首位3在所有未出現的數字中排第3(1,2)
所以a[5]=2(小於3的有2個)
第二位4在所有未出現的數字中排第三(1,2)
所以a[4]=2(小於4的有2個)
同理a[3]=0 a[2]=1 a[2]=0
x=a[5](5-1)!+a[4](4-1)!+a[3](3-1)!+a[2](2-1)!+a[1](1-1)!
x=24!+23!+02!+11!+00!
x=61
那麼在34152小的全排列有61個,那麼34152排在全排列的第62個。康托展開就是上述的描述。當然還有康托展開的逆運算。也是很有用的。c++**實現如下所示:
#include
using namespace std;
int getsmaller(int intarr, int key)//計算位置比key小的,標誌位為1(說明沒有參與康拓計算過的數字)的個數。
}return sum;
}int jiecheng(int n)//計算n的階乘
else
}int getcantor(int number, int length)
int numarr = new int[len];
int temp = number;
for (int i = 1; i < len; i++)//把所有數字通過求餘運算放到乙個陣列裡面,便於後序康拓展開運算。
int cantornum = 0;
for (int i = len - 1; i >= 1; i–)
return cantornum+1;
}int main()
康托展開在全排列的計算中有重要的作用,比如字串全排列的的字典序的排序等等運算。通過康托展開我們可以迅速確認乙個全排順序的位置,年與後續的計算和處理
康托展開 全排列
今天找到了一篇非常好的介紹康托展開的文章!其核心是這一張圖 letter 儲存所需字母表 void initletter 初始化字母表 int fact int n 階乘 return result void output vector v 輸出生成的結果 cout endl void divisi...
康托展開 全排列
對於n個數的全排列,共有n!中排列方式,如何求某乙個序列在整個排列中的次序 從小到大 以9的全排枚舉例 842697513是1 9全排列的第幾個?高中數學排列組合問題,只需要做到不重不漏 首先看第一位為8,那麼第一位為1 7的全排列都比它小,共有7 8!個。在第一位為8的情況下,其次看第二位為4,那...
全排列康托展開
n個元素有n 個不同的排列。將這n 個排列按字典序排列,並編號為0,1,n 1。每個排列的編號為其字典序值。例如,當n 3時,6 個不同排列的字典序值如下 0 1 2 3 4 5 123 132 213 231 312 321 任務 給定n 以及n 個元素的乙個排列,計算出這個排列的字典序值,以及按...