Skip to content

算法Algorithm

排列逆序编码与字典序编号

Lehmer code · Permutation ranking and unranking · Inversion code

用右侧较小元素数构造排列的混合进位码,证明确定性编解码和字典序rank/unrank,再复用逆序生成乘积。

形式陈述 ​

对排列 π=π1⋯πn,定义右侧逆序码

ci=|{j:i<j≤n, πj<πi}|(1≤i≤n).

它满足 0≤ci≤n−i。编码映射在 Sn 与所有满足这些界的整数向量之间一一对应。这里采用按“位置”索引的 Lehmer 码,不是按“数值”索引的另一种 inversion table。

按自然顺序 1<2<⋯<n 对排列作字典序排列,并从零开始编号,则

rank(π)=∑i=1nci(n−i)!.

合法编号恰是 0,1,…,n!−1。解码可先用阶乘混合进位除法恢复 ci,再依次从当前未用元素的递增表中选第 ci+1 小者。

直觉

排到第 i 位时,已经用过的元素都不能再出现。剩余元素中,比 πi 小的恰好有 ci 个,它们最终都在右边。因此 ci 记录当前元素在“剩余列表”中的零起点名次。

解码时,从 [1,…,n] 开始,第 i 步列表长度为 n−i+1,约束 ci≤n−i 保证所选位置存在;选完删除。生成的排列重新编码必得原向量,因为其余未选元素最终恰在右侧。反过来,原排列也会在每一步选回自己。这同时证明了编解码互逆与码的全部范围。

字典序编号要数此前的排列。首次与 π 不同的位置若是 i,可在该位改选 ci 个较小未用元素,其余位置有 (n−i)! 个任意完成。不同的首次差异位置互斥,所以总和就是 rank 公式。阶乘在这里数自由后缀,而非某种近似权重。

例子与边界

取 π=3142。第一项三的右侧有一、二两个较小元素,第二项一没有,第三项四的右侧有二一个,所以

(c1,c2,c3,c4)=(2,0,1,0),rank=2⋅3!+0⋅2!+1⋅1!=13.

从编号十三解码:13=2⋅6+1,第一码为二,剩余一;1=0⋅2+1,第二码为零;1=1⋅1+0,第三码为一;最后码零。未用列表的选择是

[1,2,3,4]→c1=23,[1,2,4]→c2=01,[2,4]→c3=14,[2]→2.

恰恢复 3142。编号十二对应 3124,编号十四对应 3214,可直接比较邻项字典序作独立检查。

逆序总数 inv(π)=∑ici,本例为三;它只保留各位总和,不能恢复排列。132 与 213 都只有一个逆序,但码分别为 (0,1,0) 和 (1,0,0),编号也不同。

输入 (0,2,0) 不是三元素排列的合法码,因为第二位最多为一。编号 n! 也超出范围,不能“取模继续”而静默改变用户指定的对象。空排列具有空码和编号零,符合 0!=1。

若元素有重复,剩余后缀不再有统一的 (n−i)! 个不同排列,字典序排名必须按实际重数计算多项式系数;本算法不能直接对重复数据应用。一般互异标签只要先明确一个全序并映射为秩即可。

推论与应用

直接扫描剩余列表可在 O(n2) 次比较/移动内编码或解码,存储 O(n);使用支持顺序统计的数据结构可加速,但正确性仍来自上面的剩余元素不变量。精确编号需要能容纳 n! 的整数,固定字长溢出会使算法失去双射性。

各个码位独立取遍 0,…,n−i,所以按逆序数统计的有限生成多项式是

∑π∈Snqinv(π)=∏j=1n(1+q+⋯+qj−1).

n=4 时系数 1,3,5,6,5,3,1。这个乘积及四阶频数在既有Kendall τ 页已用逐次插入推导;此处复用作为码位求和的交叉检查,新接口是确定性编解码与字典序编号。

令 q=−1 可见 n≥2 时偶逆序与奇逆序排列一样多;亦可交换两个固定位置构造反号配对。令 q=1 必须用多项式形式得到 n!,若先写成 (1−qj)/(1−q) 再直接代一,会制造可去的零分母。

主指标等分布通过 Foata 第二变换把下降位置之和送成像的逆序数,因此也具有本页的 q 阶乘分布。但主指标不是本页 Lehmer 码的逐位数据,不能据它独自恢复原排列。含重复符号的精细权重由Gaussian 多项式处理;那里的 q 多项式系数是逆序加权的分解结果,不能逐项把此处频数除以普通重数阶乘。

参考资料
  • Richard P. Stanley,Enumerative Combinatorics, Vol. 1,作者第二版书稿,§1.3,Proposition 1.3.12及其后 code 定义、Corollary 1.3.13,书稿印页35–37。该书区分按数值的 I(w) 与按位置的 code(w)=I(w−1);本页采用后者。
  • 字典序 rank 公式与逆向混合进位在正文按“首次差异位置”完整证明;不把统计分布的出处冒充排名算法的证明。
关系图谱7 个相邻概念 · 2 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组
类型化关系