当前位置: 首页 > 面试题库 >

在不计算其他数的情况下找到第n个置换

俞飞鸣
2023-03-14
问题内容

给定代表置换原子的N个元素的数组,是否存在类似的算法:

function getNthPermutation( $atoms, $permutation_index, $size )

其中$atoms是元素数组,$permutation_index是排列的索引,是排列$size的大小。

例如:

$atoms = array( 'A', 'B', 'C' );
// getting third permutation of 2 elements
$perm = getNthPermutation( $atoms, 3, 2 );

echo implode( ', ', $perm )."\n";

将打印:

B, A

直到$ permutation_index才计算每个排列?

我听到了一些关于因式排列的知识,但是我发现的每个实现都给出了具有相同大小V的排列,这不是我的情况。

谢谢。


问题答案:

如RickyBobby所述,在考虑排列的字典顺序时,您应该利用阶乘分解来发挥自己的优势。

从实际的角度来看,这是我的看法:

  • 执行排序欧几里德师,除非你用阶乘的数字,与开始做(n-1)!(n-2)!等。
  • 将商保持在数组中。该i个商应该是一个数之间0n-i-1包容性的,其中i从去0n-1
  • 该数组 您的排列。问题在于每个商都不关心先前的值,因此您需要对其进行调整。更明确地说,您需要将每个值递增多少倍,就像先前的值较低或相等一样。

以下C代码应该使您了解其工作原理(n是条目数,i是排列的索引):

/**
 * @param n The number of entries
 * @param i The index of the permutation
 */
void ithPermutation(const int n, int i)
{
   int j, k = 0;
   int *fact = (int *)calloc(n, sizeof(int));
   int *perm = (int *)calloc(n, sizeof(int));

   // compute factorial numbers
   fact[k] = 1;
   while (++k < n)
      fact[k] = fact[k - 1] * k;

   // compute factorial code
   for (k = 0; k < n; ++k)
   {
      perm[k] = i / fact[n - 1 - k];
      i = i % fact[n - 1 - k];
   }

   // readjust values to obtain the permutation
   // start from the end and check if preceding values are lower
   for (k = n - 1; k > 0; --k)
      for (j = k - 1; j >= 0; --j)
         if (perm[j] <= perm[k])
            perm[k]++;

   // print permutation
   for (k = 0; k < n; ++k)
      printf("%d ", perm[k]);
   printf("\n");

   free(fact);
   free(perm);
}

例如,ithPermutation(10, 3628799)按预期打印十个元素的最后一个排列:

9 8 7 6 5 4 3 2 1 0


 类似资料:
  • 我遇到了一个非常奇怪的问题,java线程正忙着等待。 我有一个线程忙于等待其他线程的静态变量的状态。假设忙碌等待的线程正在等待另一个线程的静态int变量达到某个值 如果我使用上面的代码,线程将被卡在忙等待中,不会跳出while循环,即使确实达到5。 但是,如果我使用其他代码,那么线程确实会跳出忙等待循环。有时,一旦达到5,其他时候会晚一点。但它会发生。对于我的特定示例,我将其用作“无意义的工作”

  • 问题内容: 嘿。我有一个很大的数组,我想找到第N个最大值。我可以简单地对数组进行排序,然后采用第N个元素,但是我只对一个元素感兴趣,因此可能有比对整个数组进行排序更好的方法… 问题答案: 排序至少需要O(nlogn)运行时间- 有非常有效的选择算法可以在线性时间内解决您的问题。 (有时是),它基于quicksort(递归分区)的思想,是一个很好的解决方案(请参阅伪代码的链接+另一个示例)。

  • 我正在尝试检索列表中最频繁和不太频繁的元素。 我的输出是: 我试了一下: 但我不想使用模块并尝试更面向逻辑的解决方案。 你能帮我做没有收集吗?

  • 我试图用多个if语句构建一个简单的javascript页面。其思想是根据一堆if语句的计算结果添加到一个列表中。问题是,如果其中任何一个失败,就会触发else语句。我只想在它们都失败的情况下触发else。 当我运行它并且满足所有条件时,我会得到: 当我运行此程序且不满足任何条件时,我将得到: 但如果任何一个条件不满足,我会得到: 或 我试过使用,但它在第一次“匹配”后退出。所以在上面的例子中,如果

  • 当我运行我的新android项目时,我得到了错误: 因此,正如error所说,复制的本机库不在/verdor/lib或/system/lib中,在我的情况下如何解决这个问题? (我解压缩了apk包,在lib/there libcalculate.so下面) 但是当我运行我的应用程序时,同样的错误抛出: