Voglio unire elenchi ordinati in un unico elenco. Come è questa soluzione? Credo che funzioni nel tempo O (n). Eventuali difetti evidenti, inefficienze o problemi stilistici?Revisione codice Java: Unisci elenchi ordinati in un unico elenco ordinato
Non mi piace l'idioma di impostare un flag per "questa è la prima iterazione" e usarlo per assicurarsi che "più basso" abbia un valore predefinito. C'è un modo migliore per aggirare questo?
public static <T extends Comparable<? super T>> List<T> merge(Set<List<T>> lists) {
List<T> result = new ArrayList<T>();
int totalSize = 0; // every element in the set
for (List<T> l : lists) {
totalSize += l.size();
}
boolean first; //awkward
List<T> lowest = lists.iterator().next(); // the list with the lowest item to add
while (result.size() < totalSize) { // while we still have something to add
first = true;
for (List<T> l : lists) {
if (! l.isEmpty()) {
if (first) {
lowest = l;
first = false;
}
else if (l.get(0).compareTo(lowest.get(0)) <= 0) {
lowest = l;
}
}
}
result.add(lowest.get(0));
lowest.remove(0);
}
return result;
}
Nota: non si tratta di compiti a casa, ma nemmeno del codice di produzione.
Controllare gli algoritmi "heap". – Anton
Penso che la tua implementazione sia soddisfacente, ma una nota sulla complessità algoritmica: supponendo un numero costante di liste di input, è O (n). Ma dal momento che il tuo metodo può gestire un numero arbitrario di liste di input, il tempo di esecuzione è O (M * n) - devi tenere conto del numero variabile di liste. Se M> log2 (n) +1 (penso), sarebbe effettivamente più veloce semplicemente concatenare tutti gli elenchi e un loro mergesort, che prende O (n * log2 (n)). Questo non è probabile che sia il caso molto spesso, ma vale la pena notare. – Dathan
Questo è un codice standard di merge-sort. Probabilmente puoi trovare ispirazione per un modo per ottimizzare il tuo loop su http://www.google.com/codesearch#search/&q=merge%5C%20sort&type=cs. Non dovresti avere quel "primo" booleano. –