¿Qué significa "aplanar"?

13

Si tuviera un árbol, "aplastar" implicaría intuitivamente

obtener una lista de todos los elementos en el árbol, recorriendo de izquierda a derecha?

Si tengo una lista vinculada, "aplanar" implicaría intuitivamente

obtener una lista de todos los elementos, comenzando con este

Por ejemplo, una lista vinculada estaría compuesta por una excepción que agregue su excepción interna. ¿Sería justo nombrar un método en la excepción "flattenInnerExceptions" con la expectativa de que devolvería una secuencia de excepciones, la excepción más externa primero y la excepción más interna, la última?

GregC
fuente

Respuestas:

25

Si tuviera una lista de listas, "aplanar" sería la operación que devuelve una lista de todos los elementos de la hoja en orden, es decir, algo que cambia:

[[a, b, c], [d, e, f], [g, h i]]

Dentro

[a, b, c, d, e, f, g, h, i]

Para los árboles, el aplanamiento está generando una lista de todas las hojas en orden transversal natural (NB: dado que solo las hojas están en el resultado, no importa si piensas en esto como un recorrido transversal previo, interno o posterior).

Como consecuencia, para una lista simple, la operación "aplanar" es, por definición, una transformación de identidad.

El aplanamiento se puede realizar en etapas o grados. Por ejemplo:

[[[a, b], [c, d]], [[e, f], [g, h]]]

se puede aplanar para:

[[a, b, c, d], [e, f, g, h]]

y luego a:

 [a, b, c, d, e, f, g, h]
Compañeros de Donal
fuente
@Donal Fellows: Esto aborda la mitad de la pregunta sobre los árboles. ¿Qué pasa con las listas vinculadas? ¿Es intuitivo hablar de ellos con el término "Acoplar"?
GregC
@GregC, quizás desee agregar un ejemplo de lo que considera que es una lista vinculada.
Editó la pregunta con un ejemplo.
GregC
3
@GregC: Una lista vinculada es solo una implementación de un tipo abstracto de secuencia. (Una matriz también es una implementación de ese tipo abstracto en al menos un nivel, y sí, hay diferencias significativas; los tipos abstractos no son la historia completa). La mayoría de los sistemas de asignación de memoria hacen que las listas vinculadas sean bastante caras debido al hecho de que usted ' está pagando la sobrecarga de asignación de memoria por celda de lista (esa sobrecarga suele ser de aproximadamente 8 bytes en un sistema de 32 bits), por lo que no recomendaría usarlos a menos que necesite insertos y eliminaciones de tiempo constante.
Donal Fellows
1
@BarisDemiray Sí. Ese sería el resultado del aplanamiento de primer nivel, y el otro sería después de dos rondas ...
Donal Fellows