O(n)中数组的查找模式

时间:2019-03-19 18:05:40

标签: java algorithm time-complexity

我认为我做对了,可以在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;
}

我要去哪里错了?谢谢

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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