バイナリ ツリーの事前順序、イン順序、および事後順序のトラバーサルは、アルゴリズムとデータ構造における基本的な問題です。再帰バイナリ ツリー トラバーサル アルゴリズムは、再帰の典型的な応用です。 バイナリ ツリー ノードが次のように定義されていると仮定します。
事前順序トラバーサル アルゴリズムと事後順序トラバーサル アルゴリズムは似ています。 ただし、トラバーサル アルゴリズムだけでは不十分です。多くのアプリケーションでは、トラバーサル自体を抽象化する必要もあります。合計関数があると仮定すると、リンクリスト、配列、バイナリツリーなどのさまざまなデータ構造に適用できると期待されます。この時点で、イテレータの概念を抽象化し、イテレータを介してアルゴリズムとデータ構造を分離して、一般的なアルゴリズムをさまざまな種類のデータ構造に適用できるようになります。合計関数は次のように定義できます。
線形構造として、リンクリストの反復子の実装は非常に単純で直感的ですが、バイナリツリーの反復子の実装はそれほど簡単ではありません。再帰トラバーサルを反復子に直接変換することはできません。その理由は、バイナリ ツリーの再帰トラバーサルが呼び出しスタック上でコンパイラによって自動的に実行され、プログラマーがこのプロセスを十分に制御できないためです。この場合、コールスタック全体のプッシュとポップを自分で制御できれば、制御の目的は達成されるのではないでしょうか。まず、二分木走査の非再帰アルゴリズムを見てみましょう。
スタックベースの非再帰アルゴリズムを通じて、トラバーサル プロセスを制御できるようになりました。次に、これをイテレータとしてカプセル化する方法を検討します。 ここで重要なのは、トラバーサル プロセスがスタックの状態によって表されることを理解することです。したがって、反復子にはスタック構造が含まれている必要があり、各反復プロセスはスタックに対する操作であることは明らかです。イテレータ インターフェースが次のとおりであると仮定します。
以下は、バイナリ ツリーの順序付きトラバーサル反復子の実装です。
次に、このイテレータ実装の時間と空間の複雑さを見てみましょう。明らかに、スタックは最大ですべてのノードを格納する必要があるため、その空間計算量は O(n) です。時間の複雑さはどうでしょうか? next() の呼び出しでは最大 n 回のスタック操作が実行され、トラバーサル プロセス全体で next() を n 回呼び出す必要があるため、反復子全体の時間計算量は O(n^2) になりますか?答えはノーです!各ノードは 1 回だけプッシュおよびポップされるため、反復プロセス全体の時間計算量は依然として O(n) です。実際、これは再帰的トラバーサルの時間と空間の複雑さとまったく同じです。 コード実行の順序を制御するためにスタックを明示的に使用するほかに、yield セマンティクスをサポートする言語 (C#、Python など) ではより直接的なアプローチがあります。以下は、yield に基づいたバイナリ ツリーの順序付きトラバーサルの Python 実装です。
yield と return の違いに関する一般的な説明は、yield が戻ると、システムは関数呼び出しの状態を保持し、次に関数が呼び出されたときに、最後の実行ポイントから実行を継続するというものです。これは、スタック セマンティクスとはまったく異なるプロセス制御セマンティクスです。 Python のインタープリタは C で書かれていますが、C は yield セマンティクスをサポートしていません。では、インタープリタはどのようにして yield をサポートするのでしょうか? 再帰的トラバーサルを反復的トラバーサルに変換する上記の経験から、Python インタープリターが yield コードに何らかの変換を加えたに違いないと推測できたと思います。再帰を非再帰に変換できた場合は、yield コードを非 yield コードに変換するコンパイラーを作成してもよいでしょう。 オリジナルリンク: http://coolshell.cn/articles/9886.html |
<<: OpenGL ES 入門: 組み込み 3D グラフィックス アルゴリズム標準
>>: 優秀なプログラマーが開発効率を上げるために知っておくべき32のアルゴリズム
この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...
[[416193]]近年、民間ドローンの急速な発展に伴い、航空写真撮影市場におけるドローンの応用はま...
広く認識されている機械学習の形式には、教師あり学習、教師なし学習、半教師あり学習、強化学習の 4 つ...
360は12月20日、Water Dropライブストリーミングプラットフォームを積極的に永久に閉鎖...
ノア著制作:51CTO テクノロジースタック(WeChat ID:blog)かつて AI の王者だっ...
企業データの量と複雑さは増大しており、ビジネス上の意思決定や戦略計画においてデータが果たす中心的な役...
今日の急速に変化する物流の世界では、効率が鍵となります。世界経済は商品の円滑な流れに完全に依存してい...
皆さんもご存知のとおり、GPT-4 や PaLM などの最先端の言語モデルは、複雑な質問に答えたり、...
グーグルは7月28日、ゴミ捨てなどのタスクを理解できるようロボットを訓練するのに役立つ新しい人工知能...
この記事はLeiphone.comから転載したものです。転載する場合は、Leiphone.com公式...
この記事は、Heart of Autonomous Driving の公開アカウントから許可を得て転...
将来の 6G ネットワークのより豊富なビジネス アプリケーションと極めて厳しいパフォーマンス要件を満...