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

时间:2014-02-04 12:03:40

标签: c# algorithm search

我有两个变量i,j在运行时都是未知的。我有两个极限maximumi和maximumj,它们的值已知,使得i在0和它各自的极限之间(对于j来说是相同的)。我有另一个变量,它在运行时是已知的,是i和j的总和。在使用i和j执行某个计算之前,我需要找到具有等于变量sum的和的i和j的所有值。我试过的是使用一个嵌套for循环并简单地用暴力强制我找到i和j的值,这样每次可能我添加每个可能的j并检查总和是否等于sum。这适用于小范围,但随着我的限制接近无穷大,算法变得非常容易。我有3秒的阈值来找到这些数字。我的情况是否有推荐的数据结构。

4 个答案:

答案 0 :(得分:4)

var sum = 99999999;
var max = 60000000;
var min = 10000000;

var i = max;
var j = sum - max;

var result = new List<Tuple<int, int>>();
while (j >= min && j =< max)
{
    result.Add(new Tuple<int, int>(i, j));
    i--;
    j++;
}

无需暴力,因为这可以轻松计算。即使在最大值和最小值之间存在较大间隙,也能在几毫秒内平稳运行。

答案 1 :(得分:2)

您只需要一个循环(例如i0sum),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);
}

答案 2 :(得分:1)

你可以简单地枚举一下吗?

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));

当然,调整你的界限。

答案 3 :(得分:1)

int min( int a, int b ){ return a < b ? a : b; }
int max( int a, int b ){ return a > b ? a : b; }

void pairs( int sum, int maxi, int maxj ){
  if( maxi + maxj < sum ) return;
  maxi = min( maxi, sum );
  maxj = min( maxj, sum );
  for( int i = max( 0, sum - maxj); i <= min( maxi, sum ); i++ ){
    std::cout << "i=" << i << ", j=" << (sum - i) << std::endl;
  }
}