zoukankan      html  css  js  c++  java
  • 康托展开

    转自维基百科

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

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

    公式

    X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0!

    其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。

    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-1)!,因为此数为唯一的,因此可以康托展开用来作为HASH函数。

  • 相关阅读:
    6. 复习complex类的实现过程
    英文文献写作注意事项
    5. 操作符重载与临时对象
    4. 参数传递与返回值
    3. 构造函数
    JSON之Asp.net MVC C#对象转JSON,DataTable转JSON,List<T>转JSON,JSON转List<T>,JSON转C#对象
    JSON.NET 使用技巧
    异常处理 Exception
    HTTP报文
    HttpWebRequest类
  • 原文地址:https://www.cnblogs.com/xz816111/p/4367257.html
Copyright © 2011-2022 走看看