有沒有辦法使用Heap::Simple模塊從堆中移除特定的元素?只有一種方法可以刪除頂部元素。如何從Perl中的Heap :: Simple中移除元素
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. pyqt:如何從QVBoxLayout中移除元素?
- 2. 從ListBuffer中移除元素
- 3. Jsoup,從元素中移除元素
- 4. 如何從子元素中移除父元素的旋轉?
- 5. 如何從克隆元素中移除嵌套元素?
- 6. 從Array中刪除元素Perl
- 7. 如何使用Perl的XML :: Simple獲取XML元素的屬性?
- 8. 如何識別在python中從set()中移除的元素?
- 9. 從陣列中移除元素,然後移動其他元素
- 10. 移除device_vector中的元素
- 11. 從元組中移除元素時多餘的空元素
- 12. 如何從Perl數組中刪除元素?
- 13. 如何從Perl數組中刪除元素?
- 14. 如何在我處理後從Perl數組中刪除元素?
- 15. 如何在java中從javax.json.JsonArray中移除元素?
- 16. 如何從包含列表的類中移除List的元素?
- 17. 如何從沒有JQuery的元素的同胞中移除類?
- 18. 從set元素中移除unicode字符?
- 19. 從對象jquery中移除元素
- 20. 從javascript對象中移除元素
- 21. Apache Pig從包中移除組元素
- 22. 無法從陣列中移除元素
- 23. 從元素集中移除對象
- 24. 從陣列中動態移除元素
- 25. 從父元素中移除一個類
- 26. JQuery從父項中移除元素
- 27. XSLT從xml中移除元素
- 28. 從陣列中移除元素
- 29. jquery從錶行元素中移除div
- 30. 量角器從dom中移除元素
我不會那麼遠。使用堆的一個好地方是定時器列表,您可以添加將來發生的事件,查看頂層元素以找出何時設置下一個定時器,並在定時器到期時彈出頂層元素。但有時用戶會要求在計時器到期之前取消計時器。 – hobbs 2012-02-26 00:39:25
@hobbs你如何取消該計時器? – Schwern 2012-02-26 01:14:04
@Schwen:你在維護一個事件隊列嗎?如果你解釋你的申請,它會幫助我們。如果您需要獨立於堆堆訪問堆中的所有項目,則必須使其成爲一堆指向項目數據的指針。刪除一個項目就涉及到只將這個項目標記爲已刪除,這樣當它從堆中拉出時就可以忽略它。 – Borodin 2012-02-26 03:30:09