【康拓展开逆康托展开】
百度百科就够了
自己的体会:
康托展开是基于比他小的前面的个数来进行计算的
另外康托展开也是一个数组到一个数的映射,因此也是可用于hash,用于空间压缩。比如在保存一个序列,我们可能需要开一个数组,如果能够把它映射成一个自然数, 则只需要保存一个整数,大大压缩空间。比如八数码问题。
欧拉项目上的第二四题就需要用逆康拓展开的,不过这道题不是说的自然数,包括0,所以构建数组的时候把0搞进去就好了
(欧拉项目上记得不赞成贴code的,
#include <bits/stdc++.h>
using namespace std;
static const int fac[]={1,1,2,6,24,120,720,5040,40320,362880};//阶乘
int cantor(int *a,int n){ //康托展开int x=0;for(int i=0;i<n;++i){int smaller=0; //当前位置之后小于它的个数for(int j=i+1;j<n;++j){if(a[j]<a[i])++smaller;}x+=fac[n-i-1]*smaller;}return x;
}
void decantor(int x,int n){std::vector<int> v;std::vector<int> a;for(int i=0;i<n;++i) v.push_back(i);//这儿根据要求被排列的数字进行选择有那几个,不过要注意一下在0作为前导的时候for(int i=1;i<=n;++i) v.push_back(i);for(int i=n;i;--i){int r = x % fac[i-1];int t= x / fac[i-1];x=r;sort(v.begin(),v.end()); //从小到大排序 a.push_back(v[t]); //剩余数里第t+1个数为当前位v.erase(v.begin()+t); // 移除选做当前位的数}int sz=a.size();for(int i=0;i<sz;++i)cout<<a[i];cout<<endl;
}
int main(){cantor();decantor(1000000-1,10);
}
【康拓展开逆康托展开】相关推荐
- 康托展开与逆康托展开详解
文章目录 康拓展开 运用 板子 逆康托展开 板子 康拓展开 康托展开是一个全排列到一个自然数的双射,常用于构建哈希表时的空间压缩. 康托展开的实质是计算当前排列在所有由小到大全排列中的名次,因此是可逆 ...
- 数论--康托展开与逆康托展开模板
ACM常用模板合集 #include<bits/stdc++.h>using namespace std; const int MAX = 13; int Fac[MAX],N; //求出 ...
- 数学--数论--康托展开与逆康托展开
康托展开 可以理解为把一个全排列映射到一个数上面,因为全排列如果按照从小到大或者从大到小,肯定是有一个确定的序列的. 一般是从小到大的序列个数.我们就是要求出这个序列的位置.,想法很简答,就是求出前面 ...
- UVA11525 Permutation 逆康托展开
传送门 文章目录 题意: 思路: 题意: 思路: 逆康托展开板子 // Problem: UVA11525 Permutation // Contest: Luogu // URL: https:// ...
- 基本算法——康托展开与逆康托展开
含义 康托展开是一个全排列到一个自然数的双射,常用于构建哈希表时的空间压缩. 康托展开的实质是计算当前排列在所有由小到大全排列中的顺序,因此是可逆的. 原理 X = s1(n-1)! + s2(n-2 ...
- 详解康托展开与逆康托展开
康托展开 rank=an(n−1)!+an−1(n−2)!+⋯+a10! 再举个例子说明. 在(1,2,3,4,5)5个数的排列组合中,计算 34152的康托展开值. 首位是3,则小于3的数有两个,为 ...
- 关于康托展开和逆康托展开详解,及python代码
在LeetCode上有这样一道题: 60. 第k个排列 给出集合 [1,2,3,-,n],其所有元素共有 n! 种排列. 按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下: ...
- 康托展开和逆康托展开
简述 康托展开是一个全排列到一个自然数的双射,常用于构建hash表时的空间压缩.设有n个数(1,2,3,4,-,n),可以有组成不同(n!种)的排列组合,康托展开表示的就是是当前排列组合在n个不同元素 ...
- java实现排程算法_康托展开算法和逆康托展开算法[Java实现]
基于这篇介绍我实现了基于Java的算法 都能看懂的康托展开_ltrbless的博客-CSDN博客blog.csdn.net 条件 一个数组:[1, 2, 3, 4, 5] 康托展开算法 找出 524 ...
最新文章
- linux中的网络配置
- java 多项式拟合最多的项数_牛顿插值法、曲线拟合、多项式拟合
- 酷狗音乐在线试听下载
- C语言中, 有些时候数值名并不与指针等价.
- [转]Angular2 使用管道Pipe以及自定义管道格式数据
- libcap-ng库旨在使具有posix功能的编程比传统的libcap库容易得多
- mysql group_concat null_MySQL教程之concat以及group_concat的用法
- PyTorch 入坑九:权重初始化
- 移除单元格选中时的高亮显示状态
- 关于机器学习一些好的博客和资料
- SwiftUI iOS 精品开源之 具有货币转换功能的iOS计算器 网络后端汇率API (教程含源码)
- 【力扣 912】十大排序算法
- centos host在哪 local_centos怎么查看hostid
- Go语言之工具Go Playground
- 手机就能申请摇号 杭州市小客车摇号功能全新上线
- Typescript助力项目开发:JS切换TS、TS类型定制与思考
- python数据清洗--对双十一淘宝直播流量数据进行数据真实性验证
- 人工智能于交通系统而言
- 【c++ primer】第五版第十四章习题答案
- Android 应用程序开发