笛卡尔积有限制

时间:2014-01-15 11:13:23

标签: c#

您好,我是C#编程的新手,我想问一个与笛卡尔积有关的问题。我找到了通过StackOverflow计算的方法,我使用它。我使用的方法是:

char[] letters = { 'A', 'B', 'C' };

int[] numbers = { 1, 2, 3, 4 };

string[] colours = { "Red", "Blue" };


var cartesianProduct = from letter in letters
                       from number in numbers
                       from colour in colours
                       select new { letter, number, colour };

就我而言,笛卡儿产品意味着什么。例如,对于组合“A1Red”,我将一致性值介于A和1以及A和红色之间的数组上传到程序。我需要的程序是给我这个值的总和。

如果我有10个阵列可以找到这些组合,但是当我需要计算超过23个阵列并且组合总数超过100万亿时,它会完美地运行。

我能做些什么让它跑得快吗?

2 个答案:

答案 0 :(得分:1)

有一些方法可以让一些算法更快地运行,利用并行性来利用许多内核和特殊的CPU或GPU指令,一次处理域的多个部分。

但是,有时间限制。如果答案空间确实很大,那么您无法在合理的时间内计算结果。

答案 1 :(得分:1)

不幸的是,你无能为力。你的问题需要所谓的“指数时间”。

正如@esel指出的那样,你可以进行一些优化,你可以使用并行。 但是除非你的数组有一个底层结构,你可以利用的数据之间存在某种相关性,你只是坚持这个“指数时间”。添加到列表中的每个数组都会乘以计算所需的时间。这快速升级。

有一个非常小的安慰:只要你的任何数组都是空的,这就会把整个事物变成空集。

查看您的数据是否存在可以利用的基础结构。

修改 在评论中,你提到了前10,000个组合。我不太清楚我理解剩下的,但是如果你需要cartesianProduct的第一个10.000(即未经处理的),那么有一种方法:

var first10000 = cartesianProduct.Take(10000);

这是有效的,因为LinQ使用“懒惰评估”:它不会计算笛卡尔积中的值,直到它必须。因此,将计算不超过10000个值 但是,如果需要先进行一些处理,比如排序,那么我恐怕你运气不好。