您好,我是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万亿时,它会完美地运行。
我能做些什么让它跑得快吗?
答案 0 :(得分:1)
有一些方法可以让一些算法更快地运行,利用并行性来利用许多内核和特殊的CPU或GPU指令,一次处理域的多个部分。
但是,有时间限制。如果答案空间确实很大,那么您无法在合理的时间内计算结果。
答案 1 :(得分:1)
不幸的是,你无能为力。你的问题需要所谓的“指数时间”。
正如@esel指出的那样,你可以进行一些优化,你可以使用并行。 但是除非你的数组有一个底层结构,你可以利用的数据之间存在某种相关性,你只是坚持这个“指数时间”。添加到列表中的每个数组都会乘以计算所需的时间。这快速升级。
有一个非常小的安慰:只要你的任何数组都是空的,这就会把整个事物变成空集。
查看您的数据是否存在可以利用的基础结构。
修改强>
在评论中,你提到了前10,000个组合。我不太清楚我理解剩下的,但是如果你需要cartesianProduct
的第一个10.000(即未经处理的),那么有一种方法:
var first10000 = cartesianProduct.Take(10000);
这是有效的,因为LinQ使用“懒惰评估”:它不会计算笛卡尔积中的值,直到它必须。因此,将计算不超过10000个值 但是,如果需要先进行一些处理,比如排序,那么我恐怕你运气不好。