【发布时间】:2014-03-24 22:12:27
【问题描述】:
我有一个方法可以将 value 转换为 newBase 长度 length 数。
英文的逻辑是:
If we calculated every possible combination of numbers from 0 to (c-1)
with a length of x
what set would occur at point i
虽然下面的方法工作得很好,但由于使用了非常大的数字,可能需要很长时间才能完成:
例如,在 64 位架构、四核 PC 上完成 value=((((65536^480000)-1)/2)、newbase=(65536)、length=(480000) 大约需要一个小时)。
private int[] GetValues(BigInteger value, int newBase, int length)
{
Stack<int> result = new Stack<int>();
while (value > 0)
{
result.Push((int)(value % newBase));
if (value < newBase)
value = 0;
else
value = value / newBase;
}
for (var i = result.Count; i < length; i++)
{
result.Push(0);
}
return result.ToArray();
}
我的问题是,我怎样才能将此方法更改为允许多个线程计算部分数字的方法?
我正在使用 C#,但如果你不熟悉它,那么伪代码也可以。
注意:方法来自这个问题:Cartesian product subset returning set of mostly 0
【问题讨论】:
-
“我的问题是,我怎样才能将这种方法更改为允许多个线程计算出部分数字的方法?” ---这是一个错误的问题。您最好并行处理原始数字数组。因此,这种精确的方法可以针对不同的数字并行运行。只要这是pure function - 它应该是微不足道的。
-
虽然我同意你的观点,但我不确定如何改写我的问题以反映这一点。你介意编辑一下吗?
-
“可能需要很长时间才能完成。” ---你可以从澄清这一点开始。使用线程进行编程会带来一些开销并使代码更加复杂。让我们从确保它是必需的开始。
-
@zerkms:我已经用一个例子澄清了“很长时间”
-
@HenkHolterman:这是个好主意,我认为 Stack 会更快,我看看是否可以将其更改为 int 数组。
标签: c# multithreading math set-theory