【发布时间】:2019-01-15 07:30:24
【问题描述】:
我正在使用这个库进行组合: https://github.com/eoincampbell/combinatorics/
我需要的是找到相当大的集合(最多约 30 个元素)的第 n 个排列和计数元素,但我什至在开始之前就停止了,请查看以下代码:
int[] testSet = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21};
var permutation = new Permutations<int>(testSet);
var test = permutation.Count;
直到 20 个元素的大集合,一切都很好,一旦我添加了第 21 个,排列就会停止正常工作,例如。 这是 permutation.Count 返回的内容:
-4249290049419214848
这远非正确的数字。
我假设这一切都归结为我使用了多么庞大的数字——库使用的整数/长整数溢出。这就是为什么,我要征求意见 - 有图书馆吗?方法?还是一种相当快速的实现方式来让组合学在大整数上工作?
谢谢!
【问题讨论】:
-
您是否尝试将
int替换为System.Numeric.BigInteger?我认为这是 .net 知道的最大整数表示。 -
您只需要特定的组合和数字吗?我假设您可以计算两者,而无需创建所有可能的排列的完整集。即使您切换到基于 BigInteger 的实现,这也会很快溢出您的内存。
-
是的,我目前正在编写自己的基于 BigInteger 的解决方案,希望可能有一些库可以加快速度,但是哦,好吧 :) 我确实需要随机组合和计数。
-
在您的示例中 permutation.Count 等于 21!超过一个长整数的最大值。要生成随机排列,您不需要知道第 n 个。您可以在您的号码列表中模拟无折扣抽奖,使用显示已抽奖号码的表格。
标签: c# permutation combinatorics large-data