まとめこの記事では、Stack データ構造の基本的な操作とそのいくつかの応用について紹介します。 括弧の一致検出、式の評価、関数の呼び出しにおける Stack の応用について説明します。 再帰は特別な種類の関数呼び出しです。再帰はプログラミングにおいて非常に重要であり、理解するのが難しいため、再帰についての私の理解を説明します。 ***スタックと再帰を使用して、古典的なゲーム「ハノイの塔」をエレガントに解く方法を説明します。 この記事では、式の評価とハノイの塔の HTML5 デモも紹介します。 スタック導入Stack はスタックです。以下は Wikipedia の定義です。
定義によれば、スタックに対する操作は、プッシュ、ポップ、スタックの最上位要素 (top) の取得の 3 つだけであることがわかります。さらに、スタックはスタックの最上位要素のみを操作できます。つまり、片側のみで操作できます。 スタックに最後に入力された要素が最初にポップアウトされるため、スタックは Last In First Out (LIFO) 構造とも呼ばれます。 スタックの操作は非常に簡単です。スタックを実装するには、単一のリンク リスト (LinkedList) と配列を使用できます。 ただし、JavaScript では、Array に pop() および push() 操作が付属しており、Array[Array.length-1] を使用して top() 操作を実装できます。したがって、別の Stack 型を実装する必要はなく、Array を使用して表現するだけで済みます。 応用Stack の LIFO プロパティにより、多くの実用的な問題を解決するのに適しています。以下では、そのアプリケーションを 3 つ取り上げて説明します。 括弧の一致検出 通常、エディタでコードを書く場合、一部のエディタでは括弧が互いに一致しているかどうかを自動的に検出します。一致していない場合は、エラー メッセージが表示されます。 Stack の LIFO 機能を使用すると、この機能を簡単に実装できます。 アルゴリズムの疑似コードは次のとおりです。
アルゴリズムの原理は、閉じ括弧に遭遇すると、常にそれに一致する最後の開き括弧を探すというものです。開き括弧が見つからない場合、または最後の開き括弧が一致しない場合は、エラーが報告されます。 常に最後の要素だけを見つける必要があるため、開いた括弧をスタックにプッシュし、一致したときにポップします。 Stack の特性により、このアルゴリズムは単純かつ明確であり、消費される時間の計算量は線形レベル O(n) です。 式の評価Stack の強力な機能により、式の評価にも使用できるようになります。 2+4/(3-1)という式を考えてみましょう。 この式には 3 種類の記号があります。
これを計算するアルゴリズムは次のとおりです。
以下は式評価のデモです。 関数呼び出しコードをデバッグしているときに、関数エラーが発生すると、次のような同様のエラー プロンプトが表示されることがよくあります。
実際のところ、1 か所でミスをしただけなのに、なぜこれほど多くのエラー メッセージが出力されたのでしょうか? その理由は、インタープリターがエラーを報告する関数のすべての呼び出し関数のスタックを出力するためです。 関数が呼び出されると、呼び出された関数に切り替える必要がありますが、関数呼び出しが終了すると、元の位置に戻らなければなりません。 スタックを使用すると、これを秩序だった方法で実現できます。つまり、関数が呼び出されると、現在の関数の変数とコンテキストがスタックにプッシュされます。関数呼び出しが終了すると、スタックがポップされ、以前のコンテキストと変数が取得されます。 #p# 再帰関数呼び出しの特殊なケースは、自分自身を呼び出すもので、再帰と呼ばれます。 最も簡単な例、階乗を解く:
再帰は非常に便利なツールですが、初心者にとっては理解が難しいことがよくあります。再帰についての私の理解についてお話ししたいと思います。
明らかに、再帰は自分自身を呼び出すことであり、理髪店で鏡を見るのと非常に似ています。終了条件がなければ、自分自身がいくつあるかを知ることはできません。
実際、再帰を使用して問題を解決する本質は、元の問題よりも小さく、同じ方法で処理できる問題を見つけることです。さらに、再帰がいつ終了するか、つまり再帰の終了条件を決定する必要があります。 たとえば、階乗を求めるには次のようにします。
このように問題を分析すると、n の階乗はどのように計算するのでしょうか? 答えは、n が 0 の場合は 1 を返し、それ以外の場合は n-1 の階乗を n 倍したものを返します。 したがって、階乗の再帰式は次のようになります。
階乗再帰の終了条件は n==0 です。問題を絞り込む方法は、n-1 の問題が n の問題と同じであることを見つけることです。 明らかに、再帰の基礎は関数呼び出しであり、関数呼び出しの基礎はスタックです。したがって、各再帰のコストは、スタックを継続的にプッシュおよびポップする必要があり、多くのスペースを消費し、冗長な計算が発生する可能性もあります。 考えられる解決策としては、末尾再帰、動的プログラミングなどがあります。 ハノイの塔ハノイの塔は古典的なゲームです。 Wikipedia の説明は次のとおりです。
ハノイの塔には多くの解法があります。***Ya の解法は再帰的方法だと思います。ハノイの塔の解法がわからない場合は、読み続ける前に再帰的方法を使用して解いてみてください。 確かに、最初は再帰的に解決する方法がわからなかったのですが、解決策を読んでみると、エレガントで独創的であることがわかりました。 ハノイの塔の再帰疑似コードは次のとおりです。
アルゴリズム全体の考え方は次のとおりです。
問題の絞り込み戦略は、n 枚のプレートを a から c に移動する方法であり、同じことが n-1 枚のプレートを a から c に移動する場合にも当てはまります。 n が 3 に減ったら、まず上の 2 つのプレートを b に移動し、次に下のプレートを c に移動し、最後に b 上の 2 つのプレートを c に移動します。 これが問題の終了条件です。 このアルゴリズムの時間計算量は指数関数的に O(2^n) です。導出については、「ハノイの塔の計算量」を参照してください。最小の解決ステップ数は 2^n-1 です。 ハノイの塔の伝説:
伝説が真実であれば、修道士たちがこの作業を完了するには 2^64 − 1 歩必要になります。1 秒間に 1 枚の皿を移動できたとすると、完了までに 5846 億年かかります。宇宙全体の年齢は現在わずか137億年です-.-! こちらはハノイの塔のデモです: オリジナルリンク: http://wuzhiwei.net/ds_app_stack/ |
<<: 人気ゲーム2048 - AIプログラムアルゴリズム分析
>>: NSA、RSA暗号化アルゴリズムに2つ目のバックドアを追加
半世紀以上前に誕生して以来、人工知能(AI)革命は全世界に大きな影響を与えてきました。特に過去10年...
国際学習表現会議(ICLR 2024)は今年で12回目となり、今年は5月7日から11日までオーストリ...
今日の大手企業が AI におけるいくつかの大きな課題をどのように克服しているか。概要:多くの企業はビ...
次世代のインテリジェントコネクテッドカーには、高度な自動運転システムが必須です。車両が自動運転をいか...
[[204973]]序文:今月、テンセント研究所とIT Juziは共同で「2017年中米人工知能ベン...
[[227827]] 福岡県香春町で先日、農薬散布ドローンの試験飛行が行われた。以前は、1.8エーカ...
階乗とは、必要な数値が得られるまで 1 × 2 × 3 × 4 を掛け合わせることを意味します。 C...