给定代表置换原子的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
个商应该是一个数之间0
和n-i-1
包容性的,其中i
从去0
到n-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下面) 但是当我运行我的应用程序时,同样的错误抛出: