下面我的方法的最佳情况和最坏情况时间复杂度是什么?
我知道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();
}
答案 0 :(得分:1)
您可以通过不使用流来更简洁地实现这一点:
HashSet<String> loaded = new HashSet<>();
for (String i : words) {
loaded.add(i);
}
return loaded.size();
你并没有从并行流中获得太多好处,因为你已经连续执行了这个循环。
这种方法也是O(n)。
如@Holger所述,如果WordStream
是Collection
(而不仅仅是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)