Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.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#_Algorithm_Search - Fatal编程技术网

C# 找到具有一定总和的两个变量的所有值的最佳方法

C# 找到具有一定总和的两个变量的所有值的最佳方法,c#,algorithm,search,C#,Algorithm,Search,我有两个变量I,j在运行时都是未知的。我有两个极限maximumi和maximumj,它们的值已知,因此I介于0和各自极限之间(与j相同)。我还有另一个变量,它在运行时是已知的,是I和j的和。在使用I和j执行特定计算之前,我需要找到I和j的所有值,它们的和等于变量和。我尝试的是使用一个嵌套的for循环,简单地强制我找到I和j的值,这样对于每一个可能的值,我添加每一个可能的j,并检查和是否等于和。这对于小极限非常有效,但当我的极限接近无穷大时,算法会变得可怕。我有一个3秒的阈值来找到这些数字。是否

我有两个变量I,j在运行时都是未知的。我有两个极限maximumi和maximumj,它们的值已知,因此I介于0和各自极限之间(与j相同)。我还有另一个变量,它在运行时是已知的,是I和j的和。在使用I和j执行特定计算之前,我需要找到I和j的所有值,它们的和等于变量和。我尝试的是使用一个嵌套的for循环,简单地强制我找到I和j的值,这样对于每一个可能的值,我添加每一个可能的j,并检查和是否等于和。这对于小极限非常有效,但当我的极限接近无穷大时,算法会变得可怕。我有一个3秒的阈值来找到这些数字。是否有适合我的情况的推荐数据结构。

您只需要一个循环(例如
i
0
sum
),并且
j
将始终等于
sum-i
。无需为
j
创建嵌套循环,因为其值总是已知的

int sum = 1337;
for (int i = 0; i <= sum; i++)
{
   var j = sum - i;
   Console.WriteLine("{0} + {1} = {2}", i, j, sum);
}
int-sum=1337;
对于(int i=0;i您只需要一个循环(例如
i
0
sum
)和
j
将始终等于
sum-i
。无需为
j
创建嵌套循环,因为其值总是已知的

int sum = 1337;
for (int i = 0; i <= sum; i++)
{
   var j = sum - i;
   Console.WriteLine("{0} + {1} = {2}", i, j, sum);
}
int-sum=1337;
对于(int i=0;i
var sum=9999999;
var max=60000000;
var最小值=10000000;
var i=最大值;
var j=总和-最大值;
var result=新列表();
而(j>=min&&j=
无需暴力,因为这很容易计算。即使在最大值和最小值之间存在较大间隙,也能在几毫秒内平稳运行。

var sum=9999999;
var max=60000000;
var最小值=10000000;
var i=最大值;
var j=总和-最大值;
var result=新列表();
而(j>=min&&j=

不需要暴力,因为这很容易计算。即使在最大值和最小值之间有很大的间隙,也可以在几毫秒内平稳运行。

您可以简单地枚举它们吗

List<Tuple<int, int>> options = new List<Tuple<int, int>();
for(int a=0; a < sum; a++)
    options.Add(new Tuple<int, int>(a, sum-a));

List options=new List您可以简单地枚举它们吗

List<Tuple<int, int>> options = new List<Tuple<int, int>();
for(int a=0; a < sum; a++)
    options.Add(new Tuple<int, int>(a, sum-a));
List options=newlist
intmin(inta,intb){返回ab?a:b;}
无效对(整数和、整数最大值、整数最大值){
if(maxi+maxjintmin(inta,intb){返回ab?a:b;}
无效对(整数和、整数最大值、整数最大值){
if(maxi+maxj对于(int i=max(0,sum-maxj);我甚至值得将其更新为已使用的延迟执行。如果数字特别大,那么它将生成一个巨大的列表,如果您只想处理一个子集(例如,前100000个),这将是一种浪费编辑:如果你需要对它们进行
计数,因为组合的数量是一个常数,你可以返回一个包含
IEnumerable
和计数值的复合对象。是的,如果我见过它,这很快。谢谢。放弃了列表,这对我的需要来说是不必要的。此外,我没有那种空间。@TheJackal最大值值可以不同?OP中没有最小值?@laune i和j的限制可以不同。i和j的最小值都是零,甚至可能值得将其更新为已使用的延迟执行。如果数字特别大,它将生成一个庞大的列表,如果您只想处理子集,这将是一种浪费(比如说,前10万)编辑:如果你需要对它们进行
计数,因为组合的数量是一个常数,你可以返回一个包含
IEnumerable
和计数值的复合对象。是的,如果我见过它,这很快。谢谢。放弃了列表,这对我的需要来说是不必要的。此外,我没有那种空间。@TheJackal最大值值可以不同?OP中没有最小值?@laune i和j的极限可以不同。i和j的最小值都是零,这要感谢kostov。这也是一个强大的代码宝石。在更大的极限上,给出了更快的时间。
int sum=1337777;for(int i=0;i=0&&sum-i为此感谢kostov。这也是一个强大的代码宝库。在更大的限制上给出了更快的时间。
int sum=133777777;for(int i=0;i=0&&sum-i