[ホワイト] 2日目ほうき要約をバックトラックの質問(DFS)

はじめに:「後戻りと動的計画アルゴリズムの2種類の最大の研究である必要があり、参照検索をバックトラック順列の問題「理解」から」「(DFSが+リセット状態)、ビットマスク技術、再帰的な交換のラップアップを行うには」

 

第46号力バックル完全配列


 

問題を解決するためにバックトラック、私の経験では、アイデアやコードがより明確になるように、一般的には、ツリー構造で、ペンと紙、描かれた問題の再帰構造を拾う、確かに怠け者ではありません。そして、示されているコードによって描かれたマップでコードを書きます。

方法:「バックトラッキング検索」アルゴリズムまたは「深さ優先探索+ +状態をリセットプルーン」(この質問は何の剪定ではありません)

例の入力:[1, 2, 3]例えば、パーミュテーション問題として、限り、我々は、上層は、図面を通して下層から選択されることを確実にするために番号を選択すると発生しないが、全ての順列の重量なく得ることができる漏れません

ツリー構造は、図3に示します。

 

 注:

1、特にここで指摘:私のチャートは、突然のすべてを見せているが、私はあなたが図を層ごとに引き出されている描画すべきだと思う;

2、あらゆるレベルで、我々はいくつかの部分を持っています私たちのために枝を選択します。1未満の層の上に次の層の枝の数、各層がなぜ再び記録要素を使用することを、その追加のスペースを理解すべきである、このような観点から、番号をスケジュールするので、

図3に示すように、「配置」Nの全てツリー再帰ツリーのすべてのリーフノードがあります。

我々は正式な記述にこの問題をトップ:プロセスを解決することは、ツリーで回答を再帰的にツリー検索で、パスサーチは、解空間の問題は、再帰的な木である「深さ優先探索、」それはですこれは、によって特徴付けられる「バックに見えないレンガの壁にヒットしません。」

ツリーのリーフノードの先頭にプログラムの実行は、次いで、再帰最後に、リーフ・ノード・パスに現在のルートが完全な配列を構成する、結果セットに追加移動したとき、私は呼ばれるステップを取ります「として和解。」

この再帰的な方法で戻り、以降メソッドの復帰のために、2つのことを行うために:

(1)数の最後のリリースを占める
(2)現在選択されている位置合わせの最後の番号から吐出されます。

実際に戻ろうがそうすることを要求される各層の方法、に仕上がっています。このツリーは、各ノードは、初めてバックノード「の状態」に第一、第二バックに一度のノードを中心に、二度訪問し、ノードに来たことになります同じのとき「状態」は、そのようなプログラマの操作が呼ばれるプログラムに添付「状態にリセット。」

リセット状態は、そうでない場合、我々は複数のループ、制御不能なコードの量を書き込み、検索の方向が」検索をバックトラック「重要な操作を」バックトラッキング「されます」。

説明:

1、iは再帰的プロセスで記録され使用されている配列インデックスがこれまでに次の参照符号2および3に、ビットマップの代わりに、ハッシュテーブルを使用してもよい、使用され、それぞれ、参照コードJavaコード提供する;

2、プログラムは、ノードが、それがリストに追加した回数を考慮して、このノードへの深い再帰戻った後、あなたは「シーンを復元する」、「状態をリセット」する必要があると述べた最初の時間に行ったときポップアップの端からその数を置く必要性を検討する前に、これは操作の最後にリストされ、最も適切なデータ構造は、スタック(スタック)です。

クラスのソリューション:

    デフ並び替える(自己、NUMS):
        lenの場合(NUMS)== 0:
            戻る[] 

        使用= [偽] * LEN(NUMS)
        RES = [] 
        自己.__ DFS(NUMS、0、[]、使用、 RES)
        を返すRES 

    DEF __dfs(自己、NUMS、インデックス、予め、使用、RES): 先写递归终止条件
        もしインデックス== LEN(NUMS):
            res.append(pre.copy())
            リターン

        範囲のiについて(LEN(NUMS)):
            使用しない場合は[I]:
                没有用过、就用它如果#
                使用[I] =真
                pre.append(NUMS [i])と
 
                #DFSは前後、コードが対称であります
                自己.__ DFS(NUMS、指数+ 1、事前に、使用済みの、RES)
 
                使用[I] =偽
                pre.pop()

 概要:

この例で理解することができる、「戻る」、「状態をリセット」動作アルゴリズム、「バック検索」=「深さ優先トラバーサル+ +リセット状態プルーン。」

1「深さ優先探索」「レンガの壁がバックに見えないヒットしない」である;

2、「状態をリセット」する時間を元に戻す、つまりは「状態」に戻ってその場所に来て、最後の時間であることを同じ。

コードの再帰的な形である前後に3は、コードでは、しばしば層で行われる「対称」。

 

 

注意:

頼む:なぜコードres.append(pre.copy()):

liweiwei1419 9:これは、Python、Java言語「質量参加の方法」に渡された「可変オブジェクトが」引用符で囲まれているのであれば、あるres.append(pre)ので、resストア内の変数は、接合時に葉にあるpre参照変数、およびpre変数最終的に戻って、空のリストが完了した後に[]、使用しres.append(pre)ますが、空のリストの束が表示されます。

これにより、使用する必要があるpre[:]のコピー、または使用取得するために、スライス操作をpre.copy()する方法を。

あなたは、ネットワーク内の「Pythonのパラメータ渡し機構」、「値の転送」、「参照渡し」、「ディープコピー」、「シャローコピー」、「リストのコピーとスライス」を検索し、関連するキーワードを取得することができ、知識のこの部分知識。説明この知識は、自分の能力の範囲を超えてきました。

私は間違った場所を説明する必要がある場合は、ご指摘歓迎。


著者:liweiwei1419
リンクします。https://leetcode-cn.com/problems/permutations/solution/hui-su-suan-fa-python-dai-ma-java-dai-ma-by-liweiw/
出典:滞在ボタン( LeetCode)
の著作権は著者が保有します。商業転載は非商用の転載は、ソースを明記してください、権限の作者に連絡してください。

 

ボタン17号の滞在文字の組み合わせの電話番号


クラス溶液:
    DEF letterCombinations(自己、数字:STR) - >リスト[STR]:
        いない場合桁:
            []戻り
        
        dict1 = { '2': 'ABC'、 '3': 'DEF'、 '4':」 GHI」、5 '': 'JKL'、 '6': 'MNO'、 '7': 'PQRS'、 '8': 'TUV'、 "9": 'WXYZ'} 
        
        パス= [] 
        自己.__ DFS (パス、[]、数字、0、dict1)
        リターンパス
    
    DEF __dfs(自己、パス、パス、数字、インデックス、dict1):
        インデックスが== LEN(桁)とします
            。paths.appendは( ''参加(パス。コピー()))
            リターン
        
        範囲のiについて(LEN(dict1 [桁[インデックス])):
            パス。追加(dict1 [桁[インデックス] [i])と
            自己.__ DFS(パス、パス、数字、インデックス+ 1、dict1)
            path.pop()
        

 

 注意:

リスト内のデータ・パスは、[ 'A'、 'E'、 'i' は、...]です

使用する必要がある:paths.append( ''(path.copyを())に参加します。)

path.copy()を忘れないでください!

おすすめ

転載: www.cnblogs.com/ACStrive/p/11441816.html