日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【康拓展开逆康托展开】

發(fā)布時間:2025/4/16 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【康拓展开逆康托展开】 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

?百度百科就夠了

自己的體會:
康托展開是基于比他小的前面的個數(shù)來進(jìn)行計算的
? ? ? ?另外康托展開也是一個數(shù)組到一個數(shù)的映射,因此也是可用于hash,用于空間壓縮。比如在保存一個序列,我們可能需要開一個數(shù)組,如果能夠把它映射成一個自然數(shù), 則只需要保存一個整數(shù),大大壓縮空間。比如八數(shù)碼問題。

歐拉項目上的第二四題就需要用逆康拓展開的,不過這道題不是說的自然數(shù),包括0,所以構(gòu)建數(shù)組的時候把0搞進(jìn)去就好了
(歐拉項目上記得不贊成貼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; //當(dāng)前位置之后小于它的個數(shù)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);//這兒根據(jù)要求被排列的數(shù)字進(jìn)行選擇有那幾個,不過要注意一下在0作為前導(dǎo)的時候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]); //剩余數(shù)里第t+1個數(shù)為當(dāng)前位v.erase(v.begin()+t); // 移除選做當(dāng)前位的數(shù)}int sz=a.size();for(int i=0;i<sz;++i)cout<<a[i];cout<<endl; } int main(){cantor();decantor(1000000-1,10); }

?

總結(jié)

以上是生活随笔為你收集整理的【康拓展开逆康托展开】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。