インタビュアー: 貪欲アルゴリズムとバックトラッキングアルゴリズムについて、どのように理解していますか?応用シナリオ?

インタビュアー: 貪欲アルゴリズムとバックトラッキングアルゴリズムについて、どのように理解していますか?応用シナリオ?

[[429460]]

この記事はWeChatの公開アカウント「JS Daily Question」から転載したもので、著者はHuihuiです。この記事の転載についてはJS Daily Question公式アカウントまでご連絡ください。

1. 貪欲アルゴリズム

貪欲アルゴリズムは、貪欲アルゴリズムとも呼ばれ、アルゴリズム設計における考え方の一種です。

各段階は局所的な最適選択であり、全体最適を達成することを期待しているが、結果は必ずしも最適ではない。

コイン交換の例を見てみましょう。1元、2元、5元のコインを複数持っていて、それを一定の金額に交換したいのですが、必要なコインの最小数は

今 11 元を両替したい場合、貪欲アルゴリズムの考え方に従って、まず最も額面が大きい 5 元硬貨を選択して両替します。すると、11 = 5 + 5 + 1 となり、これが最適な選択肢となります。

しかし、持っている硬貨の額面が 1、3、または 4 で、それを 6 元に交換したい場合、貪欲アルゴリズムによれば、6 = 4 + 1 + 1 が選択されますが、これは最良の選択ではありません。

上記の例から、貪欲アルゴリズムにはいくつかの欠点があることがわかります。貪欲アルゴリズムが使用されるシナリオには、次のような特徴があります。

貪欲法によって問題を解決できる場合、貪欲法が一般的にその問題を解決する最善の方法となります。

貪欲アルゴリズムを選択するかどうかは、主に次の 2 つの特性があるかどうかによって決まります。

  • 貪欲な選択: 問題に対する全体的な最適解が一連の局所的最適解を通じて達成され、各選択が前の選択に依存できるが、後で行われる選択に依存する必要がない場合。
  • 最適なサブ構造: 問題に対する最適な解決策にそのサブ問題に対する最適な解決策が含まれている場合、その問題は最適なサブ構造という特性を持ちます。問題の最適なサブ構造プロパティは、その問題が貪欲アルゴリズムによって解決できるかどうかの鍵となります。

2. バックトラッキングアルゴリズム

バックトラッキング アルゴリズムもアルゴリズム設計におけるアイデアです。問題の解決策を徐々に見つけて構築する戦略です。

バックトラッキング アルゴリズムは、問題に対する可能な解決策から始まります。それが機能しない場合は、問題が解決されるまでバックトラックして別のアクションを選択します。

バックトラッキング アルゴリズムを使用する問題には、次の特性があります。

  • 行列の方向や木のパスなど、パスはたくさんある
  • これらの道の中には行き止まりと人生の道があり、アイデアは質問の要件を満たさない道であり、人生の道は要件を満たしています。
  • 通常、再帰はすべてのパスをシミュレートするために使用されます

一般的な疑似コードは次のとおりです。

  1. 結果 = []
  2. 関数backtrack(path, selectlist):
  3. 終了条件が満たされた場合:
  4. result.add (パス)
  5. 戻る 
  6.  
  7. 選択リスト選択の場合:
  8. 選択する
  9. backtrack(パス、オプションリスト)
  10. 選択を元に戻す

次の 3 つの問題の解決に重点を置きます。

  • パス:つまり、選択されたもの
  • 選択リスト
  • 終了条件

たとえば、古典的なバックトラッキング アルゴリズムは、次のように完全な順列問題を解決するために使用されます。

重複する数字のない配列 nums の場合、すべての可能な順列を返したいとします。この問題を解決するアイデアは次のとおりです。

  • 再帰ですべてのケースをシミュレートする
  • 重複した要素に遭遇した場合はバックトラックする
  • 再帰エンドポイントに到達して戻るすべての状況を収集し、

コードは次のとおりです。

  1. var permute =関数(数値) {
  2. const res = []、パス = [];
  3. バックトラッキング(nums, nums.length, []);
  4. resを返します
  5.      
  6. 関数バックトラッキング(n, k, used) {
  7. パスの長さがkの場合
  8. res.push( Array.from (パス));
  9. 戻る;
  10. }
  11. ( i = 0; i < k; i++ とします) {
  12. if(used[i])継続する;
  13. パスをプッシュします(n[i]);
  14. used[i] = true ; // 同じブランチ
  15. バックトラッキング(n, k, 使用済み);
  16. パスをポップします。
  17. 使用済み[i] = false ;
  18. }
  19. }
  20. };

結論

分割統治法と動的プログラミングについても学習しました。次は貪欲アルゴリズムとバックトラッキング アルゴリズムについて学習します。

分割統治法、動的計画法、貪欲戦略のソリューションは次のとおりです。

これら 3 つに対応する典型的な問題は次のとおりです。

参考文献

https://zh.wikipedia.org/wiki/%E8%B4%AA%E5%BF%83%E7%AE%97%E6%B3%95

https://leetcode-cn.com/problems/permutations/solution/dai-ma-sui-xiang-lu-dai-ni-xue-tou-hui-s-mfrp/

https://cloud.tencent.com/developer/article/1767046

<<:  人間の農業の将来は主にロボットに依存することになるのでしょうか?基本的に人間の介入は必要ありません

>>:  DFSアルゴリズムは5つの島の問題を克服する

ブログ    
ブログ    
ブログ    
ブログ    
ブログ    

推薦する

MITが脳制御ロボットを開発:脳波を使ってロボットのエラーを修正できる

ロボットが人間のように行動するためには、人間を理解する必要があります。多くの場合、それは妥協しなけれ...

...

...

自動化には限界がない: SF Express のサプライチェーンは RPA を活用してデジタル変革を加速

[51CTO.comからのオリジナル記事]最近、UiPathとSF Supply Chainは共同オ...

2020年のトレンドの方向性: 産業用インターネットの人工知能アプリケーションが基礎となる

年末が近づくにつれ、多くの研究機関が2020年のトレンド予測を発表しています。これらの予測の多くは、...

...

...

...

Stability AIのCEOが大胆な発言:5年後には人間のプログラマーは存在しなくなる

最近、Stability AIの創設者兼CEOであるEmad Mostaque氏が再び衝撃的な発言を...

A*、ダイクストラ、BFS 経路探索アルゴリズムの視覚的な説明

この記事はLeiphone.comから転載したものです。転載する場合は、Leiphone.com公式...

サイバーセキュリティの専門家が知っておくべきAIフレームワーク

1. AIフレームワークの重要性AIフレームワークは、人工知能のオペレーティングシステムであり、基本...

...

日常生活における人工知能の応用トップ 10

[51CTO.com クイック翻訳]経済社会の発展に伴い、テクノロジーはますます複雑になっています...