【问题标题】:Finding mode of Array in O(n)O(n)中数组的查找模式
【发布时间】:2019-03-19 18:05:40
【问题描述】:

我认为我做对了,在 O(n) 中找到模式。但是在计时时,它似乎需要更接近 O(n*log(n)):

public int mode(List<Integer> numList) {
    //Holds frequencies
    int[] frequencies = new int[Collections.max(numList)+1];

    for(int i=0; i<numList.size(); i++) {
        frequencies[numList.get(i)]+=1;
    }

    //Convert to List
    List<Integer> freqArray = IntStream.of(frequencies).boxed().collect(Collectors.toCollection(ArrayList::new));

    int maxFreq = Collections.max(freqArray);
    int mode = freqArray.indexOf(maxFreq);

    return mode;
}

我哪里错了?谢谢

【问题讨论】:

  • 你所做的就像计数排序一样。它不会为每个输入产生输出。 [1,2147483647][-4,-5,-6]
  • 您为不均匀分布的列表分配了太多内存。最好使用 HashMap 在 O(n) 时间内计算。
  • @vivek_23 他正在寻求家庭作业方面的帮助。他早些时候发布了这个问题,但它被否决了。然后他删了。他的教授特别要求 O(n*log(n))。我之前告诉他怎么做 O(n)。

标签: java algorithm list collections time-complexity


【解决方案1】:

你几乎是对的,因为大多数操作都需要 O(n) 时间,除了流。即使遍历长度为 n 的Iterable,它们也可能比 O(n) 花费更多的时间。更多here

【讨论】:

    【解决方案2】:

    就像@Andronicus 指定的那样,您可以摆脱流并使用纯数组而不是列表。但同样,使用您的方法,您的时间复杂度不是O(n),而是O(m),其中m 是数组中的最大元素。也像 cmets 中提到的那样,您的方法不适用于负值。在这种情况下,HashMap 是您最好的选择,并且大多数情况下保证O(1) 插入/获取用于计算简单类型(如整数)的哈希值。

    【讨论】:

      猜你喜欢
      • 2014-01-21
      • 2012-01-17
      • 2011-11-28
      • 2011-05-11
      • 2020-01-22
      • 2012-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多