O que significa "achatar"?

13

Se eu tivesse uma árvore, "achataria" implicaria intuitivamente

obter uma lista de todos os itens da árvore, passando da esquerda para a direita?

Se eu tiver uma lista vinculada, "achatar" implicará intuitivamente

obtenha uma lista de todos os itens, começando com este

Por exemplo, uma lista vinculada seria composta de uma exceção que agrega sua exceção interna. Seria justo nomear um método na exceção "flattenInnerExceptions" com a expectativa de que retornasse uma sequência de exceções, a exceção mais externa primeiro e a exceção mais interna - por último?

GregC
fonte

Respostas:

25

Se eu tivesse uma lista de listas, "achatar" seria a operação que retorna uma lista de todos os elementos da folha em ordem, ou seja, algo que muda:

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

Para dentro

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

Para árvores, o achatamento está gerando uma lista de todas as folhas em ordem de travessia natural (NB: como apenas as folhas estão no resultado, não importa se você pensa nisso como travessia de pré, entrada ou pós-ordem).

Como conseqüência, para uma lista simples, a operação “achatar” é, por definição, uma transformação de identidade.

O achatamento pode ser realizado em estágios ou graus. Por exemplo:

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

pode ser achatado para:

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

e depois para:

 [a, b, c, d, e, f, g, h]
Donal Fellows
fonte
@Donal Fellows: trata da metade da questão sobre árvores. E as listas vinculadas? É intuitivo falar sobre eles com o termo "Achatar?"
Gregc
@ GregC, talvez você queira adicionar um exemplo do que considera uma lista vinculada.
Editou a pergunta com um exemplo.
Gregc
3
@ GregC: Uma lista vinculada é apenas uma implementação de um tipo abstrato de sequência. (Uma matriz também é uma implementação desse tipo abstrato em pelo menos um nível, e sim, existem diferenças significativas; os tipos abstratos não são a história toda.) A maioria dos sistemas de alocação de memória torna as listas vinculadas bastante caras, devido ao fato de que você ' está pagando a sobrecarga de alocação de memória por célula da lista (essa sobrecarga costuma ter cerca de 8 bytes em um sistema de 32 bits); portanto, eu não recomendaria usá-las, a menos que você precise inserir e excluir em tempo constante.
Donal Fellows
1
@BarisDemiray Sim. Isso seria o resultado da primeira achatamento nível, eo outro seria após duas rodadas ...
Donal Fellows