Java Streames sono entrambi metodi sorted
e limit
, che restituiscono rispettivamente una versione ordinata di uno stream e restituiscono uno stream restituendo solo un numero specificato di elementi di uno stream. Quando queste operazioni vengono applicati in successione, come ad esempio in:prestazioni di Stream.sorted(). Limit()
stream.sorted().limit(qty).collect(Collectors.toList())
è l'ordinamento viene eseguito in un modo che ordina qty
oggetti o è l'intera lista ordinata? In altre parole, se qty
è stato risolto, questa operazione è O(n)
? La documentazione non specifica le prestazioni di questi metodi da soli o in combinazione tra loro.
La ragione per cui chiedo è che l'ovvia implementazione imperativa di queste operazioni sarebbe quella di ordinare e quindi limitare, prendendo tempo Θ(n * log(n))
. Ma queste operazioni insieme possono essere eseguite in O(n * log(qty))
e un framework di streaming intelligente potrebbe visualizzare l'intero stream prima di eseguirlo per ottimizzare questo caso speciale.
L'intero flusso è ordinato. –
Dipende dalle caratteristiche di questo flusso; se il suo sottostante 'Spliterator' segnala che il flusso è' SORTED', quindi 'sort()' è un no-op; altrimenti, come già detto, l'intero stream è ordinato, il che significa che tutti gli elementi prodotti dallo stream devono essere sottratti prima di iniziare l'operazione di ordinamento - e questo è solo logico – fge
@fge ... ma ... pensarci ... ci sono algoritmi che otterranno i k elementi più piccoli di una lista non ordinata di elementi 'N' in' O (N) '. http://stackoverflow.com/questions/5380568/algorithm-to-find-k-smallest-numbers-in-array-of-n-items. Dovrebbe essere possibile implementare l'algoritmo per i flussi Java 8, sebbene non il modo in cui l'OP sta cercando di farlo. –