【问题标题】:Find sum of max integer in array with least space complexity查找空间复杂度最小的数组中最大整数的总和
【发布时间】:2015-11-08 13:29:12
【问题描述】:

我是编程新手,并试图通过探索来学习。我正在寻找一种解决方案,以在具有最佳空间复杂度的数组中找到最大时间重复整数的总和。假设我们有 [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;
}

【问题讨论】:

  • 抱歉不准确,我的意思是程序应该有尽可能低的内存消耗。希望说明清楚,谢谢
  • 从空间复杂度的角度来看,您的算法很好,因为它只使用了几个原始变量。当 O(n) 可能时,它的时间复杂度为 O(n^2)。
  • 谢谢,是的,我了解通过去除双循环来提高时间复杂度,这里我更关心空间复杂度。如果您可以指导,上述程序的空间复杂度可能是多少。
  • 好吧,这就是你能得到的最好的了。不需要 temp,因为您可以使用 a[i]。但是几个ints基本上没什么。忽略输入数组,额外的空间复杂度为 O(1)。

标签: java arrays algorithm performance


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    你的解决方案的空间复杂度1O(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 键和HashMap 是不可能的,但对于@ 可能987654343@ 键。)


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

    【讨论】:

    • 输入是一个整数数组,通过一些努力,您可以设法解决 O(n) 中的问题,而无需使用正确编辑的整数排序来修改 a
    • @JoulinRouge - 真的吗?请解释(在答案中)
    • 不,我写了“一些努力”:)
    【解决方案3】:

    我明白你的问题.. 现在可能有一个解决方案,有 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.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多