康托展开

✍ dations ◷ 2025-08-21 15:13:37 #康托展开

康托展开是一个全排列到一个自然数的双射,常用于构建哈希表时的空间压缩。康托展开的实质是计算当前排列在所有由小到大全排列中的顺序,因此是可逆的。

以下称第x个全排列都是指由小到大的顺序。

X = a n ( n 1 ) ! + a n 1 ( n 2 ) ! + + a 1 0 ! {displaystyle X=a_{n}(n-1)!+a_{n-1}(n-2)!+cdots +a_{1}cdot 0!}

其中, a i {displaystyle a_{i}} 为整数,并且 0 a i < i , 1 i n {displaystyle 0leq a_{i}<i,1leq ileq n}

a i {displaystyle a_{i}} 的意义参见举例中的解释部分

例如,3 5 7 4 1 2 9 6 8 展开为 98884。因为X=2*8!+3*7!+4*6!+2*5!+0*4!+0*3!+2*2!+0*1!+0*0!=98884.

解释:

排列的第一位是3,比3小的数有两个,以这样的数开始的排列有8!个,因此第一项为2*8!

排列的第二位是5,比5小的数有1、2、3、4,由于3已经出现,因此共有3个比5小的数,这样的排列有7!个,因此第二项为3*7!

以此类推,直至0*0!

显然,n位(0~n-1)全排列后,其康托展开唯一且最大约为n!,因此可以由更小的空间来储存这些排列。由公式可将X逆推出唯一的一个排列。

既然康托展开是一个双射,那么一定可以通过康托展开值求出原排列,即可以求出n的全排列中第x大排列。

如n=5,x=96时:

首先用96-1得到95,说明x之前有95个排列.(将此数本身减去1)用95去除4! 得到3余23,说明有3个数比第1位小,所以第一位是4.用23去除3! 得到3余5,说明有3个数比第2位小,所以是4,但是4已出现过,因此是5.用5去除2!得到2余1,类似地,这一位是3.用1去除1!得到1余0,这一位是2.最后一位只能是1.所以这个数是45321.

按以上方法可以得出通用的算法。

相关

  • 北投社北投社(巴赛语:Ki-pataw)为台湾清治时期平埔族之巴赛族中的一社。“北投”发音为Pataauw,巴赛语为女巫的意思,经猜测,是因为该地为硫磺产地,烟孔弥漫似乎有女巫出现而得名。16世纪
  • 美国陆军特种作战司令部美国陆军特种作战司令部(英语:United States Army Special Operations Command, USASOC)是美国陆军负责特种作战的司令部,总部位于北卡罗来纳州布拉格堡(Fort Bragg),是美国特种作
  • 约瑟夫·基廷格约瑟夫·威廉·基廷格(Joseph William Kittinger II,1928年7月27日-),美国空军退役上校、飞行部队指挥官和职业军官。他在越南战争中担任美军战斗机飞行员,并因飞机被击落而受北越
  • 铃木裕树铃木裕树(1983年10月3日-),日本演员。所属经纪公司为株式会社ワタナベエンターテインメント旗下的D-BOYS。写真集个人写真集铃木裕树オフィシャルブログ“STAND BY MY” (2013.0
  • 马雷克斯·梅耶里斯马雷克斯·梅耶里斯(拉脱维亚语:Mareks Mejeris,1991年9月2日-),拉脱维亚篮球运动员,现在效力于拉脱维亚球队里加篮球俱乐部。他也代表拉脱维亚国家男子篮球队参赛。
  • 黄彭年黄彭年(1824年-1890年),字子寿,号陶楼,晚号更生,贵州贵筑(今贵阳市)人,祖籍湖南醴陵,清朝政治人物,进士出身。其父黄辅辰,官至凤邠道,世居醴陵枫林市。黄彭年于道光二十三年(1843年)中举人。
  • 常振明常振明(1956年10月-),北京人。曾任中国中信集团董事长,中信泰富主席兼董事总经理,中信证券党委书记。常的父亲是清华大学教授常迵。文革初期,常因停课而赋闲在家,受其父学生余昌民
  • 王室情妇王室情妇(Royal mistress)是古代欧洲王室成员所包养的情妇。古代欧洲的婚姻制度受到基督教的牵制,提倡一夫一妻制,欧洲皇室和贵族离婚受严格的条件限制,而且必须由教会同意(通常是
  • 巴安尼米亚·舒巴希奇巴安尼米亚·舒巴希奇(塞尔维亚语:Branimir Subašić,1982年4月7日-),生于贝尔格莱德,阿塞拜疆职业足球运动员,现效力于中国足球超级联赛长春亚泰,在他效力尼菲治时,他得到阿塞拜疆国
  • 布万龙属布万龙属(属名:),又译浦阳龙,是种蜥脚下目盘足龙科恐龙,化石被发现于白垩纪早期的泰国布万(Phu Wiang)地区。模式种是诗琳通布万龙(),是由Martin、埃瑞克·比弗托(Eric Buffetaut)、以及Suteethorn等人在1994年叙述、命名。种名是以泰国公主诗琳通公主为名。布万龙身长约15到20米。