查找具有最小空间复杂度的数组中的最大整数之和

时间:2015-11-08 13:29:13

标签: java arrays algorithm performance

我是编程新手,并试图通过探索来学习。我正在寻找一种解决方案,以找到具有最佳空间复杂度的数组中的最大时间重复整数之和。假设我们[1,2,3,3]结果应该是6,空间复杂度最小,比如说O(n)。

我提出了一个解决方案但不确定复杂性。需要一些帮助来理解下面提到的代码是否具有最小的复杂性,或者它可能更好(绝对是!)。对不起,如果我犯了任何错误并提前致谢。

public static int maxDuplicateSumSpaceBased(int[] a)
{
  int maxRepCount = 1, tempCount;
  int maxRepNum = a[0];
  int temp = 0;
  for (int i = 0; i < (a.length - 1); i++)
  {
    temp = a[i];
    tempCount = 0;
    for (int j = 1; j < a.length; j++)
    {
      if (temp == a[j])
        tempCount++;
    }
    if (tempCount > maxRepCount)
    {
        maxRepNum = temp;
      maxRepCount = tempCount;
    }
  }
  return maxRepNum * maxRepCount;
}

3 个答案:

答案 0 :(得分:1)

实际上,输入的空间通常不计入O表示法,因此您的程序的空间复杂度为O(6)= O(c)= O(1)。 c是常数。实际上你总是使用6个变量。如果使用的空间量取决于给定的输入情况不同,但不是你的情况,因为无论你输入的长度如何,你总是使用6个变量。

如果你想把输入计算为占用空间(有时已经完成)你的空间复杂度将是O(6 + n)= O(n),假设n是输入的长度。

不可能做得更好,因为你可以轻松证明: 您输入的内存不会少(或者您必须记住所有输入)。由于输入是唯一不是常量的东西,因此使用的最大空间是存储n的输入所需的空间。

答案 1 :(得分:1)

解决方案的空间复杂度 1 O(1)。你不可能做得更好。

您的解决方案的时间复杂度为O(N^2)。您可以通过以下几种方式改进:

  • 如果您可以修改a,则可以对其进行排序{时间O(NlogN),空格O(1)}然后查找/计算最常见的值{O(N)O(1)}。总体复杂度为{O(NlogN)O(1)}。

  • 如果您无法修改a,请将其{O(N) / O(N)}复制,然后按上述步骤操作。总体复杂度为{O(NlogN)O(N)}。

  • 如果数字(M)的范围小于数字的数量,则可以使用存储桶排序。总体复杂度为{O(N)O(M)}。

  • 使用HashMap可以获得更好的时间复杂度。其总体复杂度平均为{O(N)O(N)} ...具有明显更大的比例常数。 (不幸的是,最坏的情况时间复杂度将是O(NlogN)O(N^2),具体取决于哈希映射实现。它发生在所有键冲突时。Integer密钥和{{ 1}},但HashMap键可能。)

1 - 我指的是另外到输入数组占用的空间。显然,用于输入数组的空间无法优化。这是给定的。

答案 2 :(得分:0)

我理解你的问题..现在可能有一个解决方案,有n个整数和所有整数k [1-n]。然后找到maxrepeatnumber需要O(n)时间。

  public static int maxDuplicateSumSpaceBased(int[] a)
{
  int maxRepCount = 1, tempCount;
  int k=a.length();
  for (int i = 0; i <k; i++)
  {
        a[a[i]%k]+=k;
  }
    int maxRepnumber=0,temp=a[0];
    for (int j = 1; j < k; j++)
    {
      if (temp < a[j])
        {
           temp=a[j];
           maxRepnumber=j;
        }
    }

  }
  return maxRepNum;
}

Then you sum all that number and it take O(n)and O(1) space.