“扁平化”是什么意思?


13

如果我有一棵树,会直观地暗示“变平”

获取树中所有项目的列表,从左到右遍历?

如果我有一个链表,会直观地暗示

从此开始获取所有物品的清单

例如,一个链表将由一个聚集其内部异常的异常组成。为异常命名一个方法“ flattenInnerExceptions”是否公平,希望它会返回一系列异常,最外层的异常优先,最后内层的异常-最后?

Answers:


25

如果我有一个列表列表,则“ flatten”将是按顺序返回所有叶子元素的列表的操作,即发生一些变化:

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

进入

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

对于树木,展平将按自然遍历顺序生成所有叶子的列表(注意:由于只有叶子在结果中,因此您将其视为顺序遍历,顺序遍历还是顺序遍历都没有关系。)

结果,对于一个简单的列表,按照定义,“展平”操作就是身份转换。

展平可以分阶段或度数执行。例如:

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

可以展平为:

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

然后:

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

@同胞们:这解决了关于树木的一半问题。链接列表呢?用“ Flatten”一词谈论它们是否直观?
GregC 2011年

@GregC,也许您想添加一个示例,说明您认为链表是什么。

用示例编辑问题。
GregC 2011年

3
@GregC:链表只是序列抽象类型的实现。(数组在至少一个级别上也是该抽象类型的实现,是的,两者之间存在显着差异;抽象类型并不是全部内容。)由于您的事实,大多数内存分配系统使链接列表相当昂贵。重新支付每个列表单元的内存分配开销(在32位系统上,开销通常约为8个字节),因此除非您需要进行恒定时间的插入和删除操作,否则我不建议您使用它们。
Donal Fellows

1
@BarisDemiray是的。那将是第一阶段展平的结果,另一个将是在两轮之后…
Donal Fellows
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.