Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 带约束的笛卡尔积_C# - Fatal编程技术网

C# 带约束的笛卡尔积

C# 带约束的笛卡尔积,c#,C#,你好,我是C#编程新手,我想问一个关于笛卡尔积的问题。我找到了通过StackOverflow进行计算的方法,并使用了它。我使用的方法是: char[] letters = { 'A', 'B', 'C' }; int[] numbers = { 1, 2, 3, 4 }; string[] colours = { "Red", "Blue" }; var cartesianProduct = from letter in letters fr

你好,我是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和Red之间的数组上载到程序中。我需要从程序中得到这些值的总和

如果我有10个数组来查找组合,那么它工作得很好,但是当我需要计算超过23个数组和超过100万亿个组合时,它就卡住了


有什么方法可以让它运行得更快吗?

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


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

不幸的是,您所能做的并不多。你的问题需要所谓的“指数时间”

正如@esel所指出的,您可以进行一些优化,并且可以使用并行。 但是,除非您的阵列有一个底层结构,或者您可以利用的数据之间存在某种相关性,否则您只会被困在这个“指数时间”中。添加到列表中的每个数组都将乘以计算所需的时间。这种情况迅速升级

有一个很小的安慰:只要你的数组中有一个是空的,这就会把整个数组变成空的

查看您的数据是否存在可利用的底层结构

编辑: 在评论中,您提到使用前10000个组合。我不太确定我是否理解其余部分,但如果您需要第一批10.000个
cartesianProduct
(即未加工),那么有一种方法:

var first10000 = cartesianProduct.Take(10000);
这是因为LinQ使用“惰性求值”:它将不计算笛卡尔乘积中的值,直到它必须这样做。因此,计算的值不会超过10000。

但是,如果需要先进行一些处理,如排序,那么恐怕您运气不好。

您到底想要什么?一致性值是什么?它们是什么意思?它们是如何储存的?你到底想要一个数字还是想要所有的组合?你打算用这100万亿的值做什么?一致性值的总和可以帮助我区分哪些组合是有用的。我在datagridview中上传一个矩阵,并将其存储到数组中!之后,我使用if-else条件中的数组来查找组合的和。重点是从100万亿个组合中抽取前10万个组合。有没有办法根据你的回答,每次给我一个组合,例如从0到10000,然后从10001到20000?谢谢!您可以将Take和合并。但是请记住,如果你想看整个笛卡尔积,你只需要停留在指数时间。将其处理成10000个元素的块并不能解决更深层的问题。