【问题标题】:Rank and unrank permutations with just one cycle仅用一个循环对排列进行排序和未排序
【发布时间】:2020-05-05 03:04:56
【问题描述】:

我想使用给定的 len 按字典顺序对一个循环的排列进行排名和取消排名。

一个循环的排列是你可以在这个循环中访问每个元素的地方。

p:= (2,3,1) 是一个有一个循环的排列。排名第一。

p:= (3,1,2) 也有 1 个循环,但排名为 2,因为排列的字典顺序更大,所以它成为更大的排名。

p:= (1,2,3) 是一个有 3 个循环的排列。 (1),(2),(3)

我怎样才能有效地按字典顺序排列(用一个循环排列)和 unrank(排列 + len 用一个循环排列)?我不知道如何存档。

【问题讨论】:

    标签: python arrays algorithm permutation ranking


    【解决方案1】:

    我发现了一种排名解决方案。我们知道长度为n 的排列有n-1!一个循环的排列。由于这些知识,我们可以得出以下解决方案。

    排名:例如2341

    我们开始计算排名第 1 位的排名,这给出了(n-1[position])! as tempvalue。然后我们计算2 的索引为0,因为1 正在通过它创建循环(1)。为了完成第一个位置的计算,我们需要将元素的indextempvalue 相乘,这导致0 为temprank_0。 现在我们继续这个步骤为剩余的位置添加temprank_0+temprank_1+temprank_2+temprank_4 = 0

    Unranking:4 用于排列 len 4:

    我们通过(n-2[postion+1])! 来划分排名,21234 的索引,它不会创建循环,因此排列的第一个位置是4。然后我们从4 中减去2 times (n-2)!。 这个我们继续这个两次。所以我们有412。所以最后我们只添加剩余的值 3 最后我们得到排列 4123

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-22
      • 2018-01-31
      • 1970-01-01
      • 1970-01-01
      • 2011-09-30
      • 1970-01-01
      • 2014-06-21
      相关资源
      最近更新 更多