【问题标题】:Paradigms for constructing permutations explained解释了构造排列的范式
【发布时间】:2020-05-22 08:40:46
【问题描述】:

根据Algorithm Design Manual Sec 14.4,构造排列有两种范式:

  1. 排名/取消排名
  2. 增量变化

我没有掌握该部分,我希望有其他解释。能否举例说明这两者?

【问题讨论】:

  • 链接失效
  • 它托管在谷歌图书上,所以也许你很遗憾需要一个谷歌帐户来查看它:-/

标签: permutation combinatorics


【解决方案1】:

排名/取消排名

排列的特定排名将整数与一组不同项的所有排列的特定顺序相关联。出于我们的目的,排名会将整数 0..(n!-1) 分配给整数 0..(n-1) 的所有排列的排序。

Rank({2, 1, 0, 3}) = 17

Unranking是逆过程:给定一个秩r获得排列。

Unrank(17) = {2, 1, 0, 3}

因此,rankunrank函数必须互为逆,即存在一个bijection

permutation p = Unrank(Rank(p), n)

例如,按字典顺序排列的数字 0 到 3 的排列顺序如下:

PERMUTATION      RANK
  (0, 1, 2, 3) ->  0
  (0, 1, 3, 2) ->  1
  (0, 2, 1, 3) ->  2
  (0, 2, 3, 1) ->  3
  (0, 3, 1, 2) ->  4
  (0, 3, 2, 1) ->  5
  (1, 0, 2, 3) ->  6
  (1, 0, 3, 2) ->  7
  (1, 2, 0, 3) ->  8
  (1, 2, 3, 0) ->  9
  (1, 3, 0, 2) -> 10
  (1, 3, 2, 0) -> 11
  (2, 0, 1, 3) -> 12
  (2, 0, 3, 1) -> 13
  (2, 1, 0, 3) -> 14
  (2, 1, 3, 0) -> 15
  (2, 3, 0, 1) -> 16
  (2, 3, 1, 0) -> 17
  (3, 0, 1, 2) -> 18
  (3, 0, 2, 1) -> 19
  (3, 1, 0, 2) -> 20
  (3, 1, 2, 0) -> 21
  (3, 2, 0, 1) -> 22
  (3, 2, 1, 0) -> 23

增量变化

增量更改方法通过定义下一个和上一个操作来将一个排列转换为另一个排列,通常通过交换两个元素来工作。棘手的部分是安排交换,以便在生成所有交换之前不会重复排列。下面的输出图片使用连续排列之间的单次交换给出了 {1,2,3} 的六个排列的排序。

参考文献

https://rosettacode.org/wiki/Permutations/Rank_of_a_permutation https://en.wikipedia.org/wiki/Factorial_number_system#Permutations https://computationalcombinatorics.wordpress.com/2012/09/10/ranking-and-unranking-of-combinations-and-permutations/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-04
    • 2014-03-24
    • 2011-09-10
    • 1970-01-01
    • 1970-01-01
    • 2017-08-21
    • 2017-01-14
    相关资源
    最近更新 更多