「平坦化」とはどういう意味ですか?


13

私が木を持っていた場合、直感的に「平らにする」ことを意味します

ツリー内のすべてのアイテムのリストを取得し、左から右に移動しますか?

リンクされたリストがある場合、直感的に「フラット化」されます

これから始まるすべてのアイテムのリストを取得する

たとえば、リンクリストは、その内部例外を集約する例外で構成されます。例外のシーケンスを返すことを期待して、例外「flattenInnerExceptions」のメソッドに名前を付けるのは公平でしょうか?最初に最も外側の例外、最も内側の例外-最後に?

回答:


25

リストのリストがある場合、「flatten」は、すべてのリーフ要素のリストを順番に返す操作です。つまり、何かが変化します。

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

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

木の場合、フラット化は、すべてのリーフのリストを自然なトラバーサル順で生成します(NB:結果に含まれるのはリーフのみであるため、これをプレオーダー、インオーダー、ポストオーダーのトラバースと考えるかどうかは関係ありません)。

結果として、単純なリストの場合、「フラット化」操作は定義上、ID変換です。

平坦化は、段階または度単位で実行できます。例えば:

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

次のようにフラット化できます。

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

そして次に:

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

@Donal Fellows:これは木に関する質問の半分に対処します。リンクリストはどうですか?「フラットン」という用語でそれらについて話すのは直感的ですか?
GregC

@GregC、おそらくあなたはリンクリストと思われるものの例を追加したいと思うでしょう。

例を使用して質問を編集しました。
GregC

3
@GregC:リンクリストは、シーケンス抽象型の単なる実装です。(配列は、少なくとも1つのレベルでのその抽象型の実装でもあり、はい、重要な違いがあります;抽象型はすべてではありません。)ほとんどのメモリ割り当てシステムは、リンクリストをかなり高価にします。リストセルごとにメモリ割り当てのオーバーヘッドを払います(32ビットシステムではそのオーバーヘッドは多くの場合8バイトです)。したがって、一定時間の挿入と削除が必要でない限り、それらを使用することはお勧めしません。
ドナルドフェローズ

1
@BarisDemirayはい。すなわち、第一のレベルの平坦化の結果となり、もう一方は2ラウンド後になります...
ドナル・フェローズ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.