康托展开(数论)
康托展开 标签: 数学方法——数论 阅读体验: https://zybuluo.com/Junlier/note/1174122 一、定义 来自网络的定义: 康托展开是一个全排列到一个自然数的双射,常用于构建hash表时的空间压缩。 设有n个数 \((1,2,3,4,...,n)\) ,可以有组成不同( \(n!\) 种)的排列组合,康托展开表示的就是是当前排列组合在n个不同元素的全排列中的名次。 通俗来讲: 假设有一个 排列 {1,2,3,4,5},需要你在它的全排列中,找到排名第m的那个排列 全排列的顺序就是字典序越来越大的排列,和我们的 next_permutation() 函数的顺序一样 二、怎么实现? 首先,放一个很重要的公式(暂时不需要理解,后面慢慢就懂了): \[X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! \] 其中 $ ! $ 是阶乘的意思 我们再看一个表格 你先不管它的康托展开那一栏,根据后面的讲解再看 排列组合 名次 康托展开 123 1 0 * 2! + 0 * 1! + 0 * 0! 132 2 0 * 2! + 1 * 1! + 0 * 0! 213 3 1 * 2! + 0 * 1! + 0 * 0! 231 4 1 * 2! + 1 * 1! + 0 * 0! 312 5 2 * 2!