Heap::Simpleモジュールを使用してヒープから特定の要素を削除する方法はありますか?一番上の要素を削除する方法があります。Heap :: Simpleの要素をPerlで削除する方法
0
A
答えて
3
ヒープの先頭以外のものを削除する場合は、ヒープ構造は必要ありません。データグラフなどで作業している場合は通常、ヒープのみが必要です。あなたはどんな問題に取り組んでいますか?そして、単純なハッシュでは、あなたが望むことはしませんか?
3
残念ながら、Heap :: Simpleはトップノード以外のものの抽出をサポートしていません。削除したいものまですべてを削除してから、すべてを元に戻す必要があります。
#!/usr/bin/env perl
use v5.10.0;
use strict;
use warnings;
use Heap::Simple;
my $heap = Heap::Simple->new;
$heap->insert(1,2,3,4,5);
# Remove 1, 2 and 3
my $item_to_remove = 3;
my @items = $heap->extract_upto($item_to_remove);
pop @items;
# Put 1 and 2 back
$heap->insert(@items);
# 1, 2, 4, 5
say join ", ", $heap->keys;
より洗練されたヒープタイプは、要素の削除をより適切に処理します。 Fibonacci heapsに効率的な削除操作があります。 Binomial heapsは、効率的に他のヒープをマージすることができます。より洗練されたCPANのヒープの実装がいくつかありますが、最適化を深めすぎる前にプロファイルする必要があります。
一般的なアルゴリズムやバイナリヒープから任意のノードを削除することは、バイナリヒープはバイナリツリーの特別なケースであるため、バイナリツリーから削除することと大きく異なりません。
- ルートから始めて、問題のノードを検索するツリーを歩きます。
- そのノードを自身のヒープのルートとして扱い、通常どおりに削除します。
両方ともO(logn)操作であり、非常に効率的です。
関連する問題
- 1. アンドロイドのSimple ListView要素を削除する
- 2. 方法でのArraList要素の削除
- 3. Perl配列の要素を削除する
- 4. Chromeのdevtoolsで要素IDのポップアップを削除する方法
- 5. PHPを使用しているときに選択から要素を削除する方法Simple HTML Domライブラリ
- 6. C++でポインタの要素を削除する方法
- 7. PowerShellでcsprojの要素を削除する方法
- 8. のperlから要素を削除し、アレイの結果に
- 9. webdriver.io node.jsでDOMから要素を削除する方法
- 10. タグマッチングで要素を削除する方法
- 11. Nestableリストで要素を削除する方法
- 12. pythonでプロット要素を削除する方法
- 13. C#でルート要素を削除する方法/
- 14. Perlで配列要素を削除する「正しい」方法は何ですか?
- 15. 要素の出現をすべて削除する方法
- 16. Genesis FrameworkのSimple Hookを削除する
- 17. 角度要素の最後の子を削除する方法
- 18. Hibernate:コレクション内の要素を削除する最良の方法
- 19. 削除要素
- 20. 配列から特定の要素を削除する方法
- 21. 追加後にドキュメントフラグメント内の要素を削除する方法
- 22. XMLファイルの重複した要素を削除する方法
- 23. 3Dマトリックスのゼロ要素を削除する方法は?
- 24. R - データテーブル内のリストから要素を削除する方法
- 25. JQueryで要素を削除
- 26. PerlのXML :: Twigを使って要素を削除する方法はありますか?
- 27. C:バイナリヒープの最小要素を削除する
- 28. display:noneを使用して要素を削除する方法?
- 29. jQuery()を使用して要素を削除する方法
- 30. jqueryを使用して子要素を削除する方法
私はそれほど遠くに行きません。ヒープを使用する良い場所は、将来発生するイベントを追加するタイマーのリストです。次のタイマーを設定するタイミングを調べるためにトップエレメントを調べ、タイマーがタイムアウトするとトップエレメントをポップします。しかし、時には、ユーザーが期限切れになる前にタイマーをキャンセルするよう求めることがあります。 – hobbs
@hobbsどのようにタイマーをキャンセルしますか? – Schwern
@Schwen:あなたはイベントキューを維持していますか?あなたがあなたのアプリケーションを説明したなら、それは私たちを助けるでしょう。そのヒープとは独立してヒープ内のすべてのアイテムにアクセスする必要がある場合、アイテムデータへのポインタのヒープにする必要があります。アイテムを削除すると、そのアイテムを削除済みとしてマークするだけで、ヒープから引き出されたときに無視されるようになります。 – Borodin