序文みなさんこんにちは。私はカタツムリを採っている小さな男の子です。 LeetCode を練習していると、バックトラッキング アルゴリズム タイプの問題によく遭遇します。バックトラッキング アルゴリズムは 5 つの基本アルゴリズムの 1 つであり、大企業では一般的にこのアルゴリズムについて質問します。今日は、バックトラッキングアルゴリズムのルーチンを学びましょう。記事に不正確な点があれば、指摘してください。ありがとうございます〜
1. バックトラッキングアルゴリズムとは何ですか?バックトラッキング アルゴリズム。すべての可能な候補ソリューションを探索してすべてのソリューションを見つけるアルゴリズム。 試行錯誤の考え方を採用し、問題を段階的に解決しようとします。問題を段階的に解決するプロセスで、既存の段階的な回答が試行によって有効かつ正しい解決策を提供できないことが判明した場合、前のステップまたはそれ以前のステップの計算をキャンセルし、他の可能な段階的な解決策を通じて問題の答えを再度見つけようとします。バックトラッキング法は通常、最も単純な再帰法を使用して実装されます。上記の手順を繰り返すと、次の 2 つの状況が発生する可能性があります。
人生で似たような例を挙げると、例えば羊飼いの少年の羊が道の分かれ道で迷子になります。少年は羊を探すために道のさまざまな分かれ道に沿って歩き、次から次へと分かれ道で羊を見つけようとします。羊が見つからない場合は、羊が見つかるまで、道の分岐点で別の道を探しながら戻り続けます。 次の図は、羊を見つけるための意思決定ロードマップです。 羊飼いの少年は A の方向を見てから C の方向に歩きました。羊が見つからなかったので、道の分岐点に戻り、D の方向に歩き続けました... 羊が見つかるまで。これがバックトラッキングです。 2. アルゴリズムの問題はバックトラッキングアルゴリズムにつながる重複する数字のない配列 nums が与えられた場合、すべての可能な順列を返します。回答は任意の順序で返すことができます。 例1: 入力: nums = [ 1 , 2 , 3 ] 例2: 入力: nums = [ 0 , 1 ] 2.1 実装のアイデアこの質問を読んだ後、最初に思い浮かぶのはすべての順列を列挙することですが、パターンなしでそれらを列挙することはできませんよね?たとえば、3 つの数字 [1,2,3] を並べ替える場合、最初の数字を 1 として並べ替えると、2 番目の数字は 2 または 3 のみになります。2 番目の数字が 2 の場合、3 番目の数字は 3 のみになります... 羊を探す羊飼いのルートマップを参考にして、全体の配置のツリー図を描くと、次のようになります。 実際、ルート ノードからツリーをトラバースし、パスに沿って番号を記録し、リーフ ノードに移動すると、順列を取得できます。すべてのリーフ ノードをたどると、完全な配置が得られます。 この木をもっと明確に理解するにはどうすればいいでしょうか? 理解を容易にするために、nums の数字 k を k 個の選択肢と見なすことができます。たとえば、[1,2,3] の場合、各数字には 1、2、3 の 3 つの選択肢があります。 選択するたびに、空間ツリーが展開されます。 選択が完了したら、選択したパスが重複している場合は、それを切り詰めます。 上の図のツリーは、すべての要素をトラバースし、空間ツリーを拡張してから、剪定を行うものとして見ることができます。下記の通り さて、ツリーの成り立ちがわかったので、ツリーをトラバースして完全な順列を見つける方法を見てみましょう。ツリーの枝をたどるたびに、決断を下すようなものです。実行されたパスと選択肢をツリー ノードの 2 つの属性として利用できるようになります。 ルートノードにいる場合、利用可能な選択肢は1、2、3で、以下に示すように、歩いたパスは空です。 リーフノードに到達すると、辿ってきたパス配列の長さは要素群の数と等しくなります。このとき、辿ってきたパスは条件を満たす解となります。 2.2 コードの実装コードはどのように記述しますか? 以前ツリートラバーサルを学習したとき、通常は再帰を使用しましたが、この質問でも再帰を使用します。
実装コードは次のとおりです。 クラスソリューション{ なぜバックトラックが必要なのでしょうか? あるいは、なぜバックトラック アルゴリズムを使用するのでしょうか? 1 つの順列を見つけるだけでなく、条件を満たすすべての順列を見つける必要があるからです。 再帰呼び出しが終了すると、現在の再帰分岐は終了し、他の分岐に移動して検索を続ける必要があります。 そのため、現在の選択を解除し、選択前の状態に戻ってから次のオプションを選択して次の分岐に入る必要があります。 3. バックトラッキングアルゴリズムフレームワークルーチン徹底的にパターンを見つけ、バックトラッキングの決定木を要約する バックトラッキングアルゴリズムフレームワークコードを適用する 3.1. 徹底的にパターンを見つけ、バックトラッキング決定木を要約するバックトラック型の質問の場合も、網羅的な列挙が基本となります。通常、徹底的な列挙を通じてパターンを見つけ、その後バックトラッキングの決定ツリーを描きます。たとえば、上記の完全な順列の例。 決定木のノードには通常、実行されるパスと実行可能な選択肢という 2 つの属性があります。決定バックトラッキングツリーを要約するときには、この点に注意する必要があります。 3.2. バックトラッキングアルゴリズムフレームワークの適用バックトラッキング問題を解決することは、実際には決定木のトラバーサル プロセスを解決することです。検討すべき質問は 3 つあります。
バックトラッキング アルゴリズムの疑似コード フレームワークは次のとおりです。 //すべてのパスコレクション 4. Leetcode ケース分析の質問:重複要素のない整数配列候補とターゲット整数 target が与えられた場合、数値の合計がターゲット数値 target と等しくなる候補のさまざまな組み合わせをすべて見つけ、リストの形式で返します。これらの組み合わせは任意の順序で返すことができます。 候補内の同じ番号は、制限なく繰り返し選択できます。少なくとも 1 つの数字に異なる数の選択された数字がある場合、2 つの組み合わせは異なります。 例1: 入力: 候補= [ 2 , 3 , 6 , 7 ] 、ターゲット= 7 例2: 入力:候補= [ 2 , 3 , 5 ] 、ターゲット= 8 4.1 アイデアまず、パターンを徹底的に探してみましょう。例 1 のデータ、候補 = [2,3,6,7]、ターゲット = 7 を取ります。 7 = 2 + 2 + 3 例 2 のデータをもう一度取り上げてみましょう。 8 = 2 + 2 + 2 + 2 実際、パターンは非常に明確です。候補配列の要素をターゲットから 1 つずつ減算するだけです。0 に減算できれば、それが解決策です。 次に、ツリーを描画します。ターゲットはツリーのルート ノードと考えることができ、ブランチは次のように候補配列の要素と子ノードの差を表します。 次に、バックトラッキング アルゴリズム フレームワークを適用します。 歩んできたパス、オプション リスト、終了条件をどのように表現するのでしょうか。次の図を参照してください。 オレンジ色のノード 4 に移動すると、リスト内のオプションはマイナス 2 またはマイナス 3 になります。これは、マイナス 6 が負の数であるためです。オプション リストであるかどうかをどのように判断しますか? 現在のターゲットの値から選択するブランチを引いた値が 0 より大きい限り、オプション リストとして使用できます。 選択されるパスは -3 ブランチです。 終了条件はどうでしょうか? 負の数または 0 ノードに到達すると、終了する時間であり、それ以上の決定は行えません。 4.2 コードの実装最後に、トレースバック アルゴリズム フレームワークの疑似コードを次のように使用します。 クラスソリューション{ 参考文献と謝辞「Labuladong のアルゴリズム チートシート」 leetcode 公式サイト |
Lenovo Tech World 2020 イノベーション テクノロジー カンファレンスが本日開...
[[212334]]モバイル インターネット時代に生きる技術オタクとして、私は嫌がらせのテキスト メ...
この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...
フィナンシャル・タイムズによると、シティグループは5年以内に投資銀行部門の技術・ビジネススタッフの5...
機械学習、ビッグデータ、自動化は世界の産業システムに革命をもたらしており、エネルギー業界も例外ではあ...
ファーウェイは6月25日、成都で開催された2022 Ascend AI開発者イノベーションデーで、人...
百度は昨年7月にAIプラットフォームをオープンして以来、開発者にAIオープンテクノロジーの能力を継続...
ディープラーニングの人気は、基本的に人々の計算能力の追求によるものです。最近、MIT は警告を発しま...
Google のアルゴリズムは毎年何百回も更新されます (Google は通常、これらの更新について...
人工知能を単純に目的別に分類すると、意思決定型AIと生成型AIの2つに分けられます。いわゆる意思決定...
[[440946]]この記事はAI新メディアQuantum Bit(公開アカウントID:QbitA...
この記事は、JVM の世代別ガベージ コレクション プロセスを紹介し、さまざまなガベージ コレクショ...
みなさんこんにちは。今日は実践的なチュートリアルを皆さんと共有したいと思います。いつものように、まず...
人工知能サービス - Microsoft Cognitive Services には当初、視覚、音声...