在O(1)个额外空间和O(n)时间中对数组中所有元素的频率进行计数

时间:2019-02-26 17:40:21

标签: java algorithm performance data-structures space-complexity

问题描述:我在我的算法分配中发现了这个问题。 它想让我找到O(n)时间和O(1)空间中数组所有元素的频率。

Array可以像 Ar [] = {1,6,3,78,4,6,1}

经过一番思考后,我想到了这种方法:

  1. 迭代数组并找到最大元素。(O(n)时间)
  2. 创建一个新的size = max元素(O(1)空间)的数组
  3. 遍历原始数组,并将频率存储在新数组的索引处(O(n)时间)。

我对步骤2有疑问。 在步骤1中找到最大元素(例如m)后,我将制作一个新的大小为m的数组。 事物数组占用O(1)空间吗?如果没有,请解释

3 个答案:

答案 0 :(得分:1)

是的,您正确地找到了最大数目,然后创建该长度的哈希数组不是O(1)空间复杂度的解决方案,因为O(1)空间复杂度指的是恒定的空间使用率,但是如果您声明仅根据您的输入值确定数组的大小,然后空间如何才能为常数。 恒定空间或O(1)复杂度意味着不考虑输入值而是独立于输入的方法。 因此,您的方法不适用于该解决方案。 希望,我已经说清楚了。 但是,如果您想解决问题,可以在这里找到 Geeks for Geeks 它很好地说明了您的问题。

答案 1 :(得分:1)

没有任何关于您输入的假设,就无法在O(n)时间和O(1)空间内做到这一点

  • 拥有O(1)个空间意味着您可以预先确定要分配的空间量。意味着它是常量(因此不依赖于您的基本数组)
  • 如果您可以将输入限制为某个集合,则可以实现。一些例子是
    • 当给定包含the ASCII charsetchar数组时,可以将空间固定为128个integers的数组。然后,您遍历输入并递增arr[charCode(currentChar)]
    • 中的数字
    • 一组positive intergers。您可以创建一个Integer.MAX_VALUE大小为2^32 - 1的整数数组。然后应用与之前相同的逻辑。

答案 2 :(得分:1)

我认为在O(1)空间和O(n)时间中执行此操作将很困难,除非您可以做出一些假设,如其他一些答案所建议的那样。我认为分配长度为MAXINT的数组确实不是正确的选择。

在O(唯一值数量)空间和O(n)中的答案要容易得多。使用哈希,其中键是数组中的值,哈希值是计数。您将对数据进行一次遍历,然后您将获得一个具有完整计数的哈希。

HashMap<Integer,Integer> map.= new HashMap<Integer,Integer>();
for (int value: array) {
   Integer valueI = new Integer(value);
   if (!map.hasKey(valueI)) {
       Integer count = new Integer(1);
       map.put(valueI, count);
   }
   else {
       Integer oldCount = map.get(valueI);
       Integer newCount = new Integer(oldCount.intValue() + 1);
       map.put(valueI, count);
   }
}

类似的东西。地图的键包含唯一的值,以及每个计数的键映射的值。

在没有对数据做大量假设或分配一个非常大的数组的情况下,我无法想出在O(1)空间中可以做的任何事情。毕竟,您必须将结果存储在某个地方。