这个问题有两个部分,但由于我正在尝试与 Prolog 实现进行比较,解决一个问题可能会立即导致另一个问题的解决方案。
- 给定整数列表的排列
{1,2,...,N}
,我如何知道字典顺序中该排列的索引是什么?
- 给定一个数字
k
,我该如何计算k
- 数字的排列{1,2...,N}
?
我正在寻找一种算法,它可以比仅仅迭代一个算法更好地完成这个任务next permutation
功能k
次。据我所知,应该可以直接计算这两者。
到目前为止,我想到的是,通过查看左边的数字,我可以知道特定索引处每个数字之前有多少种排列,然后以某种方式将它们组合起来,但我不确定这是否会导致正确的解决方案。
想想有多少排列是从数字 1 开始的,有多少排列是从数字 2 开始的,等等。假设 n = 5,则 24 个排列从 1 开始,24 个排列从 2 开始,依此类推。如果您正在寻找排列,假设 k = 53,则有 48 种以 1 或 2 开头的排列,因此 #53 是以 3 开头的排列中的第五个。
在以 3、6 开头的排列中,每个排列都以 31、32、34 或 35 开头。因此,您正在寻找以 (3, 1) 开头的第五个排列。有两个排列,每个排列都以 312、314 和 315 开头。因此,您要查找以 315 开头的两个排列中的第一个排列。即 31524。
应该很容易将其转换为代码。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)