流过滤器的时间复杂度

2022-09-03 01:48:24

我有一个这样的代码:

List<Listing> Listings = new ArrayList<>();
Listings.add(listing1);
Listings.add(listing2);
...
...
...

Listing listing= listings.stream()
                .filter(l -> l.getVin() == 456)
                .findFirst();

我的问题是过滤过程的时间复杂度是多少?如果它是O(n),我的直觉是将其转换为像数据结构一样的HashSet,以便时间复杂度可以变成O(1),有没有一种优雅的方法来做到这一点


答案 1

是的。流筛选在内部使用迭代。O(n)

您可以按如下方式将其转换为地图:

Map<Integer, Listing > mapOfVinToListing = listings.stream().collect(Collectors.toMap(Listing::getVin, Functions.identity()); // Assuming vin is unique per listing
mapOfVinToListing.get(456);// O(1)

但是,该转换过程也是O(n)。因此,如果您只需要执行此操作一次,请使用过滤器。如果需要多次查询同一列表,则将其转换为地图可能很有意义。

您也可以尝试使用并行流。在某些情况下,它们的性能可能更高,但这在很大程度上取决于确切的情况。


答案 2

最坏的情况是,但由于是懒惰的,如果之前找到该值,它将停止迭代。如果您需要恒定的时间查找,则始终,转换为a是一个好主意,但代价是额外的空间;如果列表很大,你应该考虑这一方面。事实上,如果列表很小,那么a和a之间的差异几乎不会很明显,除非你在时间关键型系统中工作。O(n)StreamMapMapList


推荐