幅優先と深さ優先アルゴリズム

 

バックトラッキング 

(探査とバックトラック)バックトラックすることは、私たちの目標を達成するために最適な選択の検索、良好な状態に検索前方に押し、です。

オリジナルの選択が優れていないか、その目標を達成するために発見したときにステップを探求する、しかし、再選択するバックステップです、

これは、バックトラックの戻り徒歩技術上のどこにもつながりません、と呼ばれる状態のバックトラックポイントの条件満たす「バックトラックポイントを。」

1.深さ優先探索(深さ優先探索)

  深さ優先探索の主な特徴は、我々は今、すべてを検索する必要はありませんその隣接頂点に頂点を検索するとき、頂点の隣接頂点が多いと想定され、

  バック頂点が頂点まで検索を続ける代わりに、彼の周りの隣接頂点は、既に訪問されました、そして彼は、検索の頂点の頂点の残りの部分にそれを返すことができます。

  簡単に再帰を使用して実施することができる深さ優先探索を実現します。

2.幅優先探索(幅優先探索)

  深さ優先探索焦点にBFSに対しては、異なります

  深さ優先迷路は人のようである、あなたが行くする1つの方法を選択する必要があり、

  時間は任意の複数の人が持っている、と一度未訪問の頂点が接続されているすべての頂点を行って、その後、これらの頂点から、このプロセスを継続するように幅優先探索です。

我々はの具体的な実現を使用するとFIFOキューを、このプロセスを達成するために:

  1. 出発点は、最初のキューに追加され、その後、キューに入れられた始点と頂点は、隣接する、デキュー

  2. チームのVチームの最初の要素と彼をマークします

  3. 次いで、標識されていない接続要素とvがキューイングされ、キューが空になるまで、ステップ2に進み

  幅優先探索の重要な役割は、それが最短経路を見つけることができるということです、これはよく理解されている、なぜなら幅優先探索のすべての可能な方向への出発点から1歩進んで、それぞれの先頭に相当し、その後、最初のパスがこの宛先に到達するために最短が、この点を訪問されていないと、もはやアクセスすることができ、このパスは変更されません後に到着する予定である必要があります。

 

幅優先トラバーサルは爬虫類戦略、幅優先探索戦略を使用する理由で最も広く使われている爬虫類である、三つの主要な理由があります。

  • シードは、多くの場合、比較的近いから重要なページは、例えば、我々はそれがサーフィンの連続深化して、Webページの重要性が少なくを見ている、最も人気のあるニュースになりがち、ニュースサイトをオープンしました。
  • ワールド・ワイド・ウェブの実際の深さは17層まで到達することができますが、常に非常に短いパスでページが到達しています。幅優先トラバースがこのページに到達する最速になります。
  • 幅優先の爬虫類と協力クロール、爬虫類とより多くの協力をより助長は、多くの場合、駅内でクロールするようにリンクされ、クロールが強く閉じました。

バイナリツリートラバーサルグラフィックス

  

#深度第一約トラバーサル
#1幅優先:層トラバーサルによってレベル、層横断

ルートトラバーサル(再帰的)に関する: -第1の深#1 
DEF depth_tree(tree_node)
    :tree_nodeないなしIS IF 
        プリント(tree_node._data)
        tree_node IFいずれも._leftないれていない:
            リターンdepth_tree(tree_node._left)#再帰トラバーサル
        tree_node._rightがNoneでない場合:
            戻りdepth_tree(tree_node._right)再帰トラバーサル#1 

#の幅優先:レベルトラバース、層トラバーサル(キューの実装)によって層
level_queue DEF(ルート):
    ルートをなしていない場合:
        戻り
    MY_QUEUE = [] 
    ノード=ルート
    my_queue.append(ノード)#ルートキュー
    一方のMY_QUEUE:
        ノードは= my_queue.pop(0)#の-queueの
        印刷(node.elem )#アクセスノード
        :node.lchildはNoneではない場合
            my_queue.append(node.lchild)#入队列
        node.rchildがNoneでない場合:
            my_queue.append(node.rchild)#入队列

 データ構造設計:

法のリスト:

ツリーデータ構造設計#1 
#1リスティング方法
#説明:ルートノード左右ノード:このリストには、3つの要素含み
 my_Tree = [ 
     「D」、ルートノード#
     [「B」を、
      [ 'F.'、[]、[]、
      [ 'G'、[ 'E'、[]、[]、[]] 
      ]、#左サブツリー
    [ 'C'、
     []、
     [ 'A'、 [ 'H'、[]、[]、[]] 
     ]#右サブツリー
] 

#リスト操作関数の
機能は、リスト(デフォルト最後の要素)の要素を除去するために使用され、要素を返す()#のPOP値。
#挿入()関数は、リスト内の指定された位置、及びノーリターン値にオブジェクトを指定するために使用されます。

#深さ優先:先行順走査について(再帰的)
DEF depth_tree(tree_node):
    IF tree_node:
        印刷(tree_node [0]) アクセス左のサブツリー
        IF tree_nodeの[1]:
            depth_tree([1] tree_node)#再帰的トラバーサル
        #アクセス右部分木
            depth_tree(tree_node [2])#再帰トラバーサル         
depth_tree(my_Tree) 結果:
#1 DBFGECAHの

#幅優先:レベル1つのレベルトラバーサル(キュー実装)トラバース
DEFのlevel_queue(ルート):
    もしそうでないルート:
        戻り
    MY_QUEUE = [] 
    =ルートノード
    my_queue.append(ノード)#ルートキュー
    一方のMY_QUEUE:
        (0)#の-queueノード= my_queue.pop 
        印刷#アクセスノード([0]ノード)
        IFノード[1]:
            my_queue.append(ノード[1])#キュー
        ノードIF [2]:
            my_queue.append(ノード[2])キュー番号に        
level_queue(my_Tree) 結果:
#DBCFGAEH

方法II:メソッドのクラスノード構成

 

#2構築されたクラス
型のSTRとして#ツリーのクラス、クラス変数ルートルートノード
#クラスツリーのノードについて、左側の変数右/、空のデフォルト
 クラスのツリーを:
     ルート=「」
     右なし= 
     左=なしを
     #クラスを初期化する
     :__init __(自己、ノード)DEF 
        self.root =ノード

    DEFのset_root(セルフ、ノード):
        self.root =ノード

    DEFのget_root(セルフ):
        リターンself.rootの

#初期化ツリー
#はルートセット
Aを=ツリー( 'A')
B =ツリー( 'B')
C =ツリー( 'C')
D =ツリー( 'D')
E =ツリー( 'E')、
F =ツリー( 'F.')
G =ツリー( 'G')
H =ツリー( 'H')
スパニング提供ノード#間のリンク、
H = a.left 
B.F =左
b.right = G
A = c.right 
    ルート・キュー番号にmy_queue.append(ノード)
B = d.left 
d.right = C 
g.left = Eの

#の深さ優先:トラバーサル(再帰的)程度
DEF depth_tree(tree_node):
    :tree_nodeなしていない場合は
        印刷(tree_node.root)
        IFがtree_node.leftされていませんなし:
            depth_tree(tree_node.left)#再帰トラバーサル
        tree_node.rightがどれでない場合:
            depth_tree(tree_node.right)#再帰トラバーサル
depth_tree(D)#着信ルート
#結果:
#1 DBFGECAHの

#幅優先:レベルトラバース、 (キューの実装)の層横断
DEFのlevel_queue(ルート):
    ルートはなしない場合:
        戻り
    MY_QUEUE = [] 
    ノード=ルート
    一方MY_QUEUE:
        ノード= my_queue.pop(0)#の出队列
        プリント(node.root)#访问点结
        node.leftがNoneでない場合:
            my_queue.append(node.left)#入队列
        node.rightがNoneでない場合:
            my_queue.append(node.right)#入队列
level_queue(D) 結果:
#DBCFGAEH

 

 公共の番号からこの記事の抜粋は:ジェーンは、Pythonは、私は公共の数を追跡するために学んでてきたと述べました。

 

おすすめ

転載: www.cnblogs.com/jjb1997/p/11403967.html