07_3プライオリティキュー

表には、継続的にプライオリティキューを実装します:

「」「達成優先キューリストに基づいて」「」


クラスPrioQueueError(とValueError):
     パス


クラスPrioQueue:
     「」「
    データは、優先順に格納される
    優先度の高い値が小さい要素
    「」、」

    DEF  __init__(セルフ、ELIST = []):
        self._elems =リスト(ELIST)  デフォルト値はリスト変換して、変数の対象となり、コピーを作成し、回避共有 
        self._elems.sort(リバース= 真)

    DEF エンキュー(セルフ、E):
        I LEN =(self._elems) - 1。
         一方、 I> = 0:
             IF self._elems [I] <= E:
                I - = 1
            BREAKの
        #が終了している間、私は-1または下付き電子の最初の要素よりも大きい 
        self._elems.insert(I + 1。、e)の

    DEF is_empty(自己):
         戻り値 はありませんself._elems 

    DEF PEEK(セルフ) :
         IF self.is_empty():
             昇給 PrioQueueError(' トップで' の戻り self._elems [-1 ] 

    DEF デキュー(セルフ):
         IF self.is_empty():
             昇給 PrioQueueError(' POPで' の戻りself._elems。ポップ()


P = PrioQueue([1、2、3、4 ])
印刷(p._elems)
p.enqueue( 5 プリント(p._elems)

リニアテーブルを使用して実装プライオリティキュー、リンクされたリストは、連続シートか否かを、常に存在要素を挿入する操作で撮影され、一つの特定の線形複雑度の作動要素

 ヒーププライオリティキューの実装:

「」 " に基づいてヒープ(上部小ヒープ)実施プライオリティキュー
各ノードのスタックデータは、より少ないまたは子ノードであるデータに等しく、
キー挿入および削除スタック操作を解決するために下方スクリーニング、上方点をスクリーニング、スクリーニングと呼ばれ
スタックの最後の要素(最下部右端ノード)を除去し、残りの要素は依然としてスタックを形成する
-インサート要素:
    最後の要素を添加し、得られた結果は、完全なバイナリツリーのスタックと見なすことができるが、必ずしもそうではありませんヒープ、ニーズをスクリーニングすることは上向きに一度行われる
-アップスクリーニング:
    連続親ノードのデータと比較して新しい要素(E)を添加し、eが小さい二つの要素の位置を交換した場合、交換要素eを比較することにより、
絶えず親ノードE <E =時間、またはルートノードに、データを移動するには、停止する達したE。

挿入概要を:(リスト連続)要素に新たな要素を追加した後にアップ後に行われています操作をスクリーニングスクリーニングおよび比較の操作の切り替え
数がバイナリツリー内の最長パスの長さを超えない、添加元素の操作の性質に応じてバイナリツリーは、O(LOGN)時間で行うことができる
-ポップアップ要素:
    なぜならスタックの トップ要素が最良の要素は、それがラウンドファンの残りは2サブスタックと見られ、最終的に一つの要素の元のスタックから削除することができ、要素をポップする必要があることである、
残りの要素はまだヒープ、ヒープの上に、この要素を置くために実行する必要のスクリーニング完全2のフォークの数が、ヒープダウン復元するために得られた
-スクリーニングダウン:
    二つのサブスタック、B及び元の電子スタッカサイズの比較の最後の要素の上部要素、ヒープ全体として最小トップ
    eが最小でない場合*は、最小値は、最小である場合、トップ素子の等価削除、スタックの一番上を移動する、またはBのルートとなる
    第2の比較が上部に最小化した場合* Eを地元の木は、全体の構造は、ヒープとなっているヒープになってきました
    *またはEは、全体の構造であるヒープになり最後に落ちている
「」「


クラスPrioQueueError(ValueErrorを):
     パス


クラスPrioQueueを:
     」「」使用して、リストの記憶素子を、スタックのトップのヘッドエンドにフッタを追加要素「」 " 

    DEF  __init__(セルフ、ELIST = []):
        self._elems = リスト(ELIST)
         IF ELIST:
            self.buildheap()  スタックに

    DEF エンキュー(セルフ、E):
        self._elems.append(なし)
        self.siftup (E、(self._elems)でlen - 1 

    上方上映
    DEF siftup(セルフ、E、最終):
        elems、I、JSelf._elems =、最後に、(最終- 1)// 2   ルート要素の最後の要素の位置:// 2 - (1ラスト。) 
        下に一つの正しい挿入位置を見つけるために、マイナー頂点スタック、検査工程
        一方、 I> 0  E < elems [J]:
            elems [I] = elems [J] 
            I、J = J(J - 1)// 2 
        elems [I] = E 

    DEF is_empty(自己):
         復帰 しないセルフ._elems 

    デフPEEK(自己):
         もしself.is_empty():
             昇給 PrioQueueError(' トップで' の戻りself._elems [0] 

    デフデキュー(自己):
         "" " 弹出元素""" 
        もしself.is_empty() :
             昇給 PrioQueueError(' POPで' 
        elems = self._elems 
        E0 = elems [0]  要素のスタックの最上位 
        E = elems.pop()  ポップアップの最後の要素
        のIFでlen(elems)> 0:
            self.siftdown(E、0、lenは(elems))
        を返すE0 

    #が下方スクリーニング
    DEF siftdown(セルフ、E、開始、終了):
         "" " 新しい保持素子を使用して場所を見つける" "" 
        elems、I、J = self._elems、開始します  * 2 + 1を開始#を開始* 2 + 1:スタックの最初の小さなスタックトップ
        しばらく J < 終了:
             IF。J + 1 <エンドそして elems [J + 1] <elems [J]:   #1 検索elems [J + 1]とelems [j]が小さくなる 
                。J = 1 + IF:E <elems [J]  E 3のうち最小の、位置たBREAK 
            elems [I]は、 elems [J] =   elems [J]移動三の中で最小 
            。I、J = J、J + 2 * 1 
        elems [I] = E DEFの:buildheap(セルフ) = (self._elems)lenの
         ための Iの範囲(端// 2、-1、-1 ):
            self.siftdown(self._elems [I]、I、エンド)
P = PrioQueue([1 ,. 3 ,. 6 、4 ,. 5 ])
 プリント(p._elems)

            
                

    

プリント' ======== ' プリント(p.dequeue())
 プリント(p.dequeue() )
 プリント(p.dequeue())
 プリント(p.dequeue())
 プリント(p.dequeue()) 

[1、3、6、4、5] ======== 1 3 4 5 6

 認識に基づいてヒープ優先度キュー、作成時間複雑度はO(N)であり、挿入及び排出複雑さが第1工程の(Nログ)挿入はテーブル要素の最後に追加されているO、置換リストオブジェクトをもたらすことができます要素記憶領域、従って最悪の場合、O(n)が発生することが

おすすめ

転載: www.cnblogs.com/fly-book/p/11746661.html