私は最大ヒープの途中から特定の要素を削除するスカイライン問題を解決するアルゴリズムを実装しようとしています。私が現在やっているのはmaxheap.remove(index)
ですが、私はheapify(maxheap)
をフォローアップしなければなりません。私はあなたがそれを行うtreemap
のような何かを使用することができますJavaで知っている。とにかく、それはO(n)時間かかる各別のメソッドを呼び出すよりも効率的にPythonで行うにはありますか?ヒープ内の特定の要素をPythonでヒーププロパティを失うことなく削除するには?
答えて
私は、各要素を無視するかどうかのフラグを持つデータ構造にする必要があります。あなたがヒップアップすると、それがフラグを立てた要素であれば、もう一度ポップします。これは非常に簡単で明白であり、ヒープが内部的にどのように動作するかについては何も知りません。たとえば、ヒープ内の要素が実際にどこにあるかを知る必要はありません。
このアプローチの欠点は、フラグが立てられた要素が時間とともに累積する傾向があることです。時にはそれらをフィルタリングしてからheapifyすることもできます。
このソリューションでは十分ではない場合は、Pythonでbtreeの実装を検索する必要があります。それはあなたがJavaで慣れているツリーマップのように振る舞います。
ヒープから任意の項目を削除するのは、その項目がヒープ内のどこにあるかを知っていれば、O(ログn)操作です。アルゴリズムは次のとおりです。
Move the last item in the heap to the position that contains the item to remove.
Decrement heap count.
If the item is smaller than its parent
bubble it up the heap
else
sift it down the heap
主な問題は、ヒープ内の項目の位置を見つけることです。あなたが指摘したように、もっと情報を保持しない限り、O(n)操作を実行します。
これを効率的に解決するには、アイテムキーを含む辞書を作成し、値はヒープ内のそのアイテムのインデックスです。ただし、辞書を維持する必要があります:あなたは、ヒープに項目を挿入するときは、変更するたびに、あなたが
- は、辞書エントリ
- を追加しますヒープ内の項目の位置、辞書内の項目の値を更新します。
その辞書を使用すると、ヒープ内のアイテムの位置にO(1)アクセス権があり、O(log n)で削除できます。
はい、インプリメンテーション方法に応じて、インデックスまたはポインタを持っている方が効率的です。
最大の 子で削除する必要があるインデックス/ポインタの番号を置き換え、子供がいないノードに到達するまで、子プロセスを再帰的に繰り返しますこれは簡単に削除できます。
このアルゴリズムの複雑さはO(log n)です。
- 1. Javascript - 要素内の特定の文字を削除する
- 2. iFrameで特定の要素を削除するには
- 3. 配列内の特定の要素から余分なスペースを削除する
- 4. 全要素ではなくリストから特定のプロパティを削除したい
- 5. Pythonで要素内の特定の要素と文字列を検索する
- 6. 特定のリンクリストで奇数の要素を削除するコードを書く
- 7. 削除クラス全く内側要素は
- 8. Python - MongoDBで文書内の特定のエントリを削除する
- 9. xml要素内にテキストパターンを囲む方法(特定のxml要素の内部にある場合を除く)
- 10. 要素名を失うことなくリスト内のユニークな要素を見つける
- 11. 特定の要素の前後の空白を削除する
- 12. XSL変換 - 特定の要素の空要素を削除する
- 13. CSSは、特定のクラスの要素と子要素を除くすべての要素を選択します。
- 14. jQueryで要素をゆっくりと削除するには?
- 15. 配列から特定の要素を削除する方法
- 16. リストから特定の要素を削除する(POPing)
- 17. 要素から特定のテキストを削除する
- 18. jQuery要素から特定のテキストを削除する
- 19. パンダのデータフレーム内の特定のセルについては、リストの要素を削除してください
- 20. web - クリップボードへのセクションのコピーと特定の要素の削除
- 21. JavaScriptと特定のCSS要素を削除/削除できないようにするにはどうすればよいですか?
- 22. C++任意の要素メソッドを削除したヒープ
- 23. 子のメソッドを失うことなく変数の値を削除する
- 24. xmlの特定の反復要素を削除します。
- 25. 特定の画面サイズの要素を削除します。
- 26. XSLTで特定のテキストを持つサブ要素を持つ要素を削除するには
- 27. HTML要素がページの特定の部分よりも下になると、その要素を削除するにはどうすればよいですか?
- 28. 特定の要素を除いたPythonのリストを印刷するには?
- 29. 削除することなくテキストファイルの内容を削除する方法
- 30. 最小最大ヒープの最大要素の削除
あなたは、ヒープのどのような実装を参照してくださいか?ヒープ要素への明示的なアクセスを示す 'remove'演算子が含まれている場合、' change priority'を含むこともあります。 – MBo
@MBo Pythonでは明白な実装は標準ライブラリにあるheapqです。 – btilly