Ich möchte sortierte Listen in eine einzige Liste zusammenführen. Wie ist diese Lösung? Ich glaube, es läuft in O (n) Zeit. Irgendwelche eklatanten Mängel, Ineffizienzen oder stilistische Probleme?Java Code Review: Sortieren Sie sortierte Listen in eine einzige sortierte Liste
Ich mag nicht das Idiom der Einstellung eines Flags für "das ist die erste Iteration" und verwenden, um sicherzustellen, dass "niedrigste" einen Standardwert hat. Gibt es einen besseren Weg?
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;
}
Hinweis: Dies ist keine Hausaufgabe, aber es ist auch nicht für den Produktionscode.
Überprüfen Sie "Heap" -Algorithmen. – Anton
Ich denke, Ihre Implementierung ist in Ordnung, aber ein Hinweis auf die algorithmische Komplexität: Unter der Annahme einer konstanten Anzahl von Eingabelisten ist es O (n). Da Ihre Methode jedoch eine beliebige Anzahl von Eingabelisten verarbeiten kann, ist die Laufzeit O (M * n) - Sie müssen die variable Anzahl von Listen berücksichtigen. Wenn M> log2 (n) +1 (glaube ich), wäre es eigentlich schneller, alle Listen einfach zu verketten und sie zusammenzufassen, was O (n * log2 (n)) erfordert. Dies ist wahrscheinlich nicht oft der Fall, aber es ist erwähnenswert. – Dathan
Dies ist der standardmäßige Zusammenführungs-Sortiercode. Unter http://www.google.com/codesearch#search/&q=merge%5C%20sort&type=cs finden Sie wahrscheinlich Anregungen, wie Sie Ihren Loop optimieren können. Sie sollten diesen "ersten" booleschen Wert nicht benötigen. –