首页 > 其他分享 >康托编码与解码

康托编码与解码

时间:2023-05-04 22:55:43浏览次数:48  
标签:编码 排列 ... 解码 个数 给定 编号 康托

简介

对于一个集合 {1, 2, ... , n} ,其不同排列有 \(n!\) 种,将各种排列按照字典序从小到大编号(0 ~ \(n!-1\) )。康托编码与解码旨在解决这么一个问题:给定一个排列X,它的序号是多少。或者给定一个序号,它的排列是怎么样的。

康托表达式

\(X=f(n) \cdot (n-1)! + f(n-1) \cdot (n-2)! + ... + f(1) \cdot 0!\)

编码

给定一个序列 \(a_na_{n-1}...a_1\),\(f(i)\) 表示在该位置的右边比其小的数的个数,即 \(a_{i-1},a_{i-2}...a_1\) 中比 \(a_i\) 小的个数。例如给定一个排列2314,计算其编码步骤如下:

1. 在2右边且比2小的数的个数为有1个(1)
2. 在3右边且比3小的数的个数有1个(1)
3. 在1右边且比1小的数的个数有0个
4. 在4的右边且比4小的数的个数有0个

故排列2314的编号为 X = 1·3!+ 1·2! = 8
同理,计算可得2134的编号为6,1423的编号为4

解码

给定集合 {1,2,3,4},给定编号13,求其排列,步骤如下:

1. 13 / 3!= 2 余 1
2. 1 / 2 != 0 余 1
3. 1 / 1 ! = 1 余 0
4. 0 / 0! = 0 余 0

商表示该位置的右边有多少个数比它大,故编号13对应的排列为3142
同理,给定编号5,可以求得排列为1432

例题

60.排列序列
image

题解

该题中编号是从1开始,因此为了适用康托展开时,我们得将k减,代码如下:

class Solution {
public:
    string getPermutation(int n, int k) {
        //求阶乘
        vector<int> factorial(n);
        factorial[0] = 1;
        for (int i = 1; i < n; ++i)
        {
            factorial[i] = factorial[i - 1] * i;
        }
        //k的编号从1开始,因此需自减才能适用康托表达式
        --k;
        string ans;
        //用valid来度量order的大小,order即为前文提到的f函数
        vector<int> valid(n + 1, 1);
        for (int i = 1; i <= n; ++i) 
        {
            int order = k / factorial[n - i] + 1;
            for (int j = 1; j <= n; ++j) 
            {
                //遍历到位置i
                //order代表比某一个数小的数的个数且在该数左边未出现过的数的个数
                order -= valid[j];
                if (!order) 
                {
                    //ans代表在位置i上真实的数
                    ans += (j + '0');
                    valid[j] = 0;
                    break;
                }
            }
            k %= factorial[n - i];
        }   
        return ans;     
    }
};

标签:编码,排列,...,解码,个数,给定,编号,康托
From: https://www.cnblogs.com/parallel-138/p/17372797.html

相关文章

  • [oeasy]python0048_注释_comment_设置默认编码格式
    注释Comment回忆上次内容使用了版本控制git制作备份进行回滚 尝试了嵌套的控制结构层层控制 不过除非到不得以尽量不要太多层次的嵌套 这样从顶到底含义明确而且还扁平 扁平也能含义明确......
  • 该方法实现网页编码的自动识别和转换
    """该方法实现网页编码的自动识别和转换"""#python第三方库chardet不可靠,把gbk编码解析成Windows-1254@retry(stop_max_attempt_number=5,wait_random_min=2000,wait_random_max=20000,)defpage_trancode(content):codes=chardet.detect(content)ifcodes[&......
  • DER编码
    一、任务详情参考附件中图书p120中7.1的实验指导,完成DER编码Name实例中,countryName改为"CN",organizationName="你的学号"commonName="你的姓名拼音"用echo-n-e"编码">你的学号.der中,用OpenSSLasn1parse分析编码的正确性提交编码过程文档(推荐markdown格式)附件:PKI.C......
  • PostGIS中获取所有EPSG的编码以及对应Proj4字符串
    场景PostGIS在Windows上的下载与安装:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/124107198在上面安装好PostGIS后会默认生成一个spatial_ref_sys表,此表保存空间数据库中使用的坐标系统的数字ID和文本描述。 安装好之后就可以将其导出为需要的文件格式,或......
  • der编码
    任务详情参考附件中图书p120中7.1的实验指导,完成DER编码Name实例中,countryName改为"CN",organizationName="你的学号"commonName="你的姓名拼音"用echo-n-e"编码">你的学号.der中,用OpenSSLasn1parse分析编码的正确性提交编码过程文档(推荐markdown格式)附件:PKI.CA与数字证......
  • 机器学习预测给定生物DNA序列是编码序列还是非编码序列
    在生物学中,DNA序列通常指非编码序列,因为DNA是生物体内存储基因信息的一种生物大分子,具有一定的生物学特性和结构。然而,基于DNA序列的机器学习预测可以包括编码和非编码序列的任务。以下是一些基于DNA序列的机器学习应用:应用于非编码DNA序列的机器学习模型:基因预测:使用机器学习......
  • 从0开始构建一个Oauth2Server服务 <19> Token 编解码
    Token编解码令牌提供了一种通过在令牌字符串本身中编码所有必要信息来避免将令牌存储在数据库中的方法。这样做的主要好处是API服务器能够验证访问令牌,而无需对每个API请求进行数据库查找,从而使API更容易扩展。OAuth2.0BearerTokens的好处是应用程序不需要知道您决定如......
  • DER编码
    任务详情参考附件中图书p120中7.1的实验指导,完成DER编码Name实例中,countryName改为"CN",organizationName="你的学号"commonName="你的姓名拼音"用echo-n-e"编码">你的学号.der中,用OpenSSLasn1parse分析编码的正确性提交编码过程文档(推荐markdown格式)附件:PKI.CA与......
  • 数字证书编码ASN.1
    查看姓名、学号的16进制ASCII码echo-n"LiuJinming"|od-tc-tx1echo-n"20201327"|od-tc-tx1对TBSCertificate进行DER编码1.序列号1174(0x0496)2.证书签发者DN="CN=VirtualCA证书有效期=20200222000000-202202220000004.证书持有者DN=CN=LiuJinming,OU=Pers......
  • c# 流、文件、字符串与byte数组、字符编码
    c#中的流对象间进行信息或者数据的交换时总是先将对象或数据转换为某种形式的流,再通过流的传输,到达目的对象后再将流转换为对象数据。所以,可以把流看作是一种数据的载体,通过它可以实现数据交换和传输。流的特殊性在于它是动态的和线性的,动态是指数据的内容和时间有关,例如,在某......