Quiero fusionar listas ordenadas en una sola lista. ¿Cómo es esta solución? Creo que funciona en O (n) tiempo. ¿Alguna falla flagrante, ineficacia o problemas de estilo?Revisión de código Java: combina listas ordenadas en una sola lista ordenada
Realmente no me gusta el modismo de establecer una bandera para "esta es la primera iteración" y usarla para asegurar que "más bajo" tenga un valor predeterminado. ¿Hay una mejor manera de evitar eso?
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: esto no es tarea, pero tampoco es para código de producción.
Revisa los algoritmos de "montón". – Anton
Creo que su implementación es buena, pero una nota sobre la complejidad algorítmica: Suponiendo un número constante de listas de entrada, es O (n). Pero dado que su método puede manejar un número arbitrario de listas de entrada, el tiempo de ejecución es O (M * n); debe tener en cuenta la cantidad variable de listas. Si M> log2 (n) +1 (creo), en realidad sería más rápido simplemente concatenar todas las listas y fusionarlas, lo que toma O (n * log2 (n)). Es probable que este no sea el caso muy a menudo, pero vale la pena señalarlo. – Dathan
Este es el código de combinación de clasificación estándar. Probablemente pueda encontrar inspiración para una forma de optimizar su bucle en http://www.google.com/codesearch#search/&q=merge%5C%20sort&type=cs. No debería necesitar tener ese 'primer' booleano. –