大O:这个算法的时间复杂度是多少?

时间:2016-03-14 23:38:05

标签: java arraylist time-complexity java-stream collectors

下面我的方法的最佳情况和最坏情况时间复杂度是什么?

我知道ArrayList.add()的时间复杂度为O(1)但不确定loaded.stream().distinct().collect(Collectors.toList());

  public static int countUnique(WordStream words) {

    ArrayList<String> loaded = new ArrayList<String>();
    ArrayList<String> empty = new ArrayList<String>();

    // Fill loaded with WordStream words
    for (String i : words) {
      loaded.add(i);
    }

    empty = (ArrayList<String>) loaded.stream().distinct().collect(Collectors.toList());

    return empty.size();
  }

2 个答案:

答案 0 :(得分:1)

您可以通过不使用流来更简洁地实现这一点:

HashSet<String> loaded = new HashSet<>();
for (String i : words) {
  loaded.add(i);
}
return loaded.size();

你并没有从并行流中获得太多好处,因为你已经连续执行了这个循环。

这种方法也是O(n)。

如@Holger所述,如果WordStreamCollection(而不仅仅是Iterable),则可以更简洁地实施:

return new HashSet<>(words).size();

但是,问题中未指明WordStream实际上是Collection

答案 1 :(得分:0)

首先,ArrayList()并非O(1)适用于所有操作,但适用于add()

distinct()是O(n),因为它必须检查所有元素。每次迭代都是O(1),因为它是由HashSet支持的,它是O(1)。

您可以使用以下代码替换您的代码:

return (int)loaded.parallelStream().distinct().count();

这会快得多,但仍然是O(n)