毎日のアルゴリズム: 完全順列問題

毎日のアルゴリズム: 完全順列問題

[[435870]]

繰り返しのない数字のシーケンスが与えられた場合、そのシーケンスのすべての可能な順列を返します。

例:

  1. 入力: [1,2,3]
  2. 出力:
  3. [
  4. [1,2,3],
  5. [1,3,2],
  6. [2,1,3],
  7. [2,3,1],
  8. [3,1,2],
  9. [3,2,1]
  10. ]

この質問はバックトラッキングアルゴリズムの典型的な応用シナリオである。

1. アルゴリズム戦略

バックトラッキング アルゴリズムは、検索方法とヒューリスティック メソッドです。各ステップで選択を行います。この選択では期待される結果が得られないことが判明すると、バックトラックして新しい選択を行います。深さ優先探索はバックトラッキングアルゴリズムの考え方を使用します。

2. 適用可能なシナリオ

バックトラッキング アルゴリズムは非常に単純で、解決策が見つかるまで試行を続けるだけです。このアルゴリズムの考え方により、幅探索問題、つまり一連の可能な解決策から要件を満たす解決策を選択する問題を解決するためによく使用されます。

3. コードの実装

配列[1, 2, 3]の完全な順列は次のように書くことができます。

まず、1 から始まる完全な順列を書きます。これらは、[1, 2, 3]、[1, 3, 2] であり、これは 1 + [2, 3] の完全な順列です。

2 から始まるすべての順列を書き出してみましょう。[2, 1, 3]、[2, 3, 1] は、2 + [1, 3] の完全な順列です。

最後に、3 で始まる順列をすべて書き出します。これらは [3, 1, 2]、[3, 2, 1] であり、これらは 3 + [1, 2] のすべての順列です。

それはバックトラッキングの考え方であり、列挙検索に多少似ています。すべての解決策を列挙し、期待を満たすものを見つけます。考えられる解決策を定期的にすべて列挙し、漏れや重複を避けるために、問題解決のプロセスを複数の段階に分けます。各ステージで、私たちは分岐点に直面します。ランダムにいずれかの道を選択します。この道が実行可能ではない (期待される解決策を満たしていない) とわかったら、前の分岐点に戻り、別の道を選択して続行します。

これは明らかに再帰的な構造です。

  • 再帰の終了条件は、順列内の十分な数が選択されることです。そのため、現在のプログラムが再帰するレベルを示す変数が必要です。この変数を深さまたはインデックスと呼びます。これは、完全な順列内のインデックスを使用して数を決定する必要があることを意味します。
  • used(object): 数字が選択されているかどうかを示すために使用します。数字(num)が選択されている場合は、used[num] = true に設定します。このように、次の位置を考えるとき、O(1)の時間計算量で数字が選択されたかどうかを判定できます。これは、「スペースを時間と交換する」というアイデアです。
  1. let permute = function (nums) {
  2. // 配列を使用してすべての可能な順列を保存します
  3. res = [] とします
  4. (数値の長さ === 0)の場合{
  5. 戻り
  6. }
  7. 使用 = {}、パス = []
  8. dfs(数値、数値の長さ、0、パス、使用、res)
  9. 戻り
  10. }
  11. dfs = function (nums, len, depth, path, used, res) とします。
  12. // すべての数字が入力されています
  13. 深さ === 長さの場合{
  14. res.push([...パス])
  15. 戻る 
  16. }
  17. (i = 0; i < len; i++)の場合{
  18. もし (!used[i]) {
  19. //配列を動的に維持する
  20. パス.push(数値[i])
  21. 使用済み[i] = 
  22. // 次の数字を再帰的に入力し続ける
  23. dfs(数値、長さ、深さ + 1、パス、使用、解像度)
  24. // 操作を元に戻す
  25. 使用[i] = 
  26. パス.pop()
  27. }
  28.        
  29. }
  30. }

4. 複雑性分析

時間計算量: O(n?n!)、ここでnはシーケンスの長さ

これは順列と組み合わせです。各レベルでの順列と組み合わせの数は Amn=n!/(n?m)! なので、すべての順列は次のようになります。

A1n + A2n + … + An-1n = n!/(n?1)! + n!/(n?2)! + … + n! = n! * (1/(n?1)! + 1/(n?2)! + … + 1) <= n! * (1 + 1/2 + 1/4 + … + 1/2n-1) < 2 * n!

また、各内部ノードは n 回ループするため、非リーフノードの時間計算量は O(n?n!) になります。

  • 空間計算量: O(n)

リートコード: https://leetcode-cn.com/problems/permutations/solution/quan-pai-lie-wen-ti-by-user7746o/

<<:  10億件の速達配送のピークを迎える中、Baidu OCRが物流企業のスピードアップにどのように貢献しているかをご覧ください。

>>:  量子コンピューティングは人工知能の未来でしょうか?

ブログ    

推薦する

知識をグラフに変換するには、いくつのステップが必要ですか?インターネット上で最も包括的な清華ナレッジグラフレポートの89ページ

ナレッジグラフは、人工知能の重要な分野技術です。2012年にGoogleによって提案され、大規模な知...

Githubのオブジェクトカウントアルゴリズム

Github を使用しているときに、次のプロンプトを見たことがありますか? $ gitクローンhtt...

...

このマウスはFPSゲームのプレイ方法を自ら学習し、トレーニングの精度はプロのプレイヤーと同等です。

この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...

カリフォルニア州の自動運転路上試験規則が変更され、軽輸送車両も許可範囲に含まれる可能性がある

現在、多くの自動運転車開発者は米国カリフォルニア州(以下、「カリフォルニア」という)で路上試験を行う...

マスク氏の最新チップ:脳とコンピューターの相互作用に特化し、視覚障害者が「見る」ことを可能にする

自分で認めなさい!マスク氏のニューラリンクはチップを開発している。この技術は「数年以内」にリリースさ...

人工知能の台頭によりプログラマーは消滅するのでしょうか?

ローコードおよびノー​​コード プラットフォームの爆発的な成長により、個人でも組織でも、従来はコード...

Meili United が VALSE カンファレンスで「ファッションをグラフィックで説明」する画像アルゴリズムの体験を共有する方法

最近、第7回ビジョンと学習セミナー(VALSE)が厦門大学で成功裏に終了しました。 VALSE は ...

スマートシティの建設が加速、ドローンが4つの面で貢献

[[415675]]都市化が継続的に加速し、都市人口が継続的に増加したことで、人々は質の高い都市生活...

顔認証闇市場:実在人物認証ビデオは1セット100元、アプリで検証可能

「1セット100元で、身分証明書の表裏の写真、身分証明書を持っている写真、うなずいたり首を振ったり口...

高性能自動運転ドメインコントローラ設計の主要要素

[[438361]]次世代自動運転システムの設計における反復的な更新は、主に新機能の継続的な反復に反...

...

人工知能の主な研究段階と将来の発展方向は何ですか?

人工知能は常にコンピュータ技術の最前線にあり、人工知能研究の理論と発見はコンピュータ技術の発展の方向...

データセンターから発電所まで: 人工知能がエネルギー利用に与える影響

人工知能 (AI) は急速に現代生活に欠かせないものとなり、産業を変革し、私たちの生活、仕事、コミュ...

...