【发布时间】:2021-12-18 02:50:06
【问题描述】:
我最近发现了一个有趣的问题,看起来是这样的:
有一个枯燥的排序算法,它从数组中取出第一个数字,它找到一个比第一个元素低1的元素(或者当没有更低的元素时它会取最高元素一),并将其放在前面。 将索引为 x(从 0 开始计数)的元素放在前面的成本等于它的索引。 它继续这个过程,直到数组被排序。 任务是计算排序所有 n! 的成本!从 1 到 n 的数字排列。答案可能很大,所以答案应该以 m 为模(输入中给出了 n 和 m)
示例:
Input (n,m): 3 40
Answer: 15
There are permutations of numbers from 1 to 3. The costs of sorting them are:
(1,2,3)->0
(1,3,2)->5
(2,1,3)->1
(2,3,1)->2
(3,1,2)->4
(3,2,1)->3
sum = 15
我的程序生成所有可能的数组并一一排序。它的复杂度是 O(n!*n^2),太高了。我被我所有的想法和这种蛮力解决方案所困。
我还发现了一些有趣的事情:
- 当我按这些成本的数量对排列排序的成本进行分组时,我得到了一个奇怪的数字: n=7 https://cdn.discordapp.com/attachments/503942261051228160/905511062546292807/unknown.png (每行有 2 个数字 x * y,在它们之前有 y 个空格。x 排序成本,y 排列成本(1-n)的排序成本等于 y)。分数是所有行 x*y 的总和。如果需要,我可以为其他人提供这个数字。
- 可能与斐波那契数有关,只是一种感觉。
- 从图 1 中可以看出,有一个段,其中所有 y 都相同。它从 x=n^2-4n+3 开始。
问题:我怎样才能更有效地解决这个问题?
【问题讨论】:
-
"将索引为 x 的元素(从 0 开始计数)放在前面的成本等于它的索引。" - 它是原始数组中的索引(与当前迭代中的索引相反),对吧?
-
是当前迭代中的索引。 4231,这里下一步的成本是2,那么我们有3421,下一步也是2,而不是1。
标签: algorithm sorting sequence factorial