gpt4 book ai didi

algorithm - 给出组合时如何计算索引(字典顺序)

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:24:16 26 4
gpt4 key购买 nike

我知道有一种算法允许给定数字组合(无重复,无顺序),计算字典顺序的索引。
这对我的应用程序加速非常有用......

例如:

combination(10, 5)  
1 - 1 2 3 4 5
2 - 1 2 3 4 6
3 - 1 2 3 4 7
....
251 - 5 7 8 9 10
252 - 6 7 8 9 10

我需要算法返回给定组合的索引。
es: index( 2, 5, 7, 8, 10 ) --> 索引

编辑:实际上我正在使用一个 java 应用程序生成所有组合 C(53, 5) 并将它们插入到 TreeMap 中。我的想法是创建一个数组,其中包含我可以使用此算法索引的所有组合(和相关数据)。
一切都是为了加速组合搜索。但是我尝试了一些(不是全部)你的解决方案,你提出的算法比 TreeMap 的 get() 慢。
如果有帮助:我需要从 0 到 52 的 5 和 53 的组合。

再次感谢大家:-)

最佳答案

这是一个可以完成工作的代码片段。

#include <iostream>

int main()
{
const int n = 10;
const int k = 5;

int combination[k] = {2, 5, 7, 8, 10};

int index = 0;
int j = 0;
for (int i = 0; i != k; ++i)
{
for (++j; j != combination[i]; ++j)
{
index += c(n - j, k - i - 1);
}
}

std::cout << index + 1 << std::endl;

return 0;
}

它假设你有一个函数

int c(int n, int k);

这将返回从 n 个元素中选择 k 个元素的组合数。该循环计算给定组合之前的组合数。通过在末尾加一,我们得到了实际的索引。

对于给定的组合有c(9, 4) = 126 个包含 1 的组合,因此按字典顺序位于它之前。

以2为最小数的组合有

c(7, 3) = 35 种组合,其中 3 是第二小的数

c(6, 3) = 20 个组合,其中 4 是第二小的数

所有这些都在给定组合之前。

以2和5为最小的两个数的组合有

c(4, 2) = 6 个组合,其中 6 是第三小的数字。

所有这些都在给定组合之前。

等等

如果你在内部循环中放置一个打印语句,你将得到数字126、35、20、6、1。希望能解释代码。

关于algorithm - 给出组合时如何计算索引(字典顺序),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5307222/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com