Cosa significa "appiattire"?


13

Se avessi un albero, "appiattirei" implicherebbe intuitivamente

ottenere un elenco di tutti gli elementi nella struttura, attraversando da sinistra a destra?

Se ho un elenco collegato, "appiattire" implicherebbe intuitivamente

ottenere un elenco di tutti gli elementi, a partire da questo

Ad esempio, un elenco collegato sarebbe costituito da un'eccezione che aggrega la sua eccezione interna. Sarebbe giusto nominare un metodo sull'eccezione "flattenInnerExceptions" con l'aspettativa che restituisca una sequenza di eccezioni, prima l'eccezione più esterna e l'eccezione più interna - ultima?

Risposte:


25

Se avessi un elenco di elenchi, "appiattire" sarebbe l'operazione che restituisce un elenco di tutti gli elementi foglia in ordine, ovvero qualcosa che cambia:

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

In

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

Per gli alberi, l'appiattimento sta generando un elenco di tutte le foglie in ordine di attraversamento naturale (NB: poiché solo le foglie sono nel risultato, non importa se si pensa a questo come attraversamento pre, in o post ordine.)

Di conseguenza, per un semplice elenco l'operazione "appiattisci" è per definizione una trasformazione dell'identità.

L'appiattimento può essere eseguito in più fasi o gradi. Per esempio:

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

può essere appiattito per:

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

e poi a:

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

@Donal Fellows: risolve la metà della domanda sugli alberi. Che dire degli elenchi collegati? È intuitivo parlarne con il termine "Appiattire?"
GregC,

@GregC, forse vorresti aggiungere un esempio di ciò che ritieni sia un elenco collegato.

Modificato la domanda con un esempio.
GregC,

3
@GregC: un elenco collegato è solo un'implementazione di un tipo astratto di sequenza. (Un array è anche un'implementazione di quel tipo astratto su almeno un livello e sì, ci sono differenze significative; i tipi astratti non sono l'intera storia.) La maggior parte dei sistemi di allocazione della memoria rende gli elenchi collegati abbastanza costosi a causa del fatto che " pagando l'overhead di allocazione della memoria per cella di elenco (quell'overhead è spesso di circa 8 byte su un sistema a 32 bit), quindi non consiglierei di usarli a meno che non abbiate bisogno di inserimenti ed eliminazioni a tempo costante.
Donal Fellows,

1
@BarisDemiray Sì. Quello sarebbe il risultato dell'appiattimento di primo livello, e l'altro sarebbe dopo due round ...
Donal Fellows
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.