Php 如何剥离或切片SplHeap(也称为SplMaxHeap、SplMinHeap)的底部项目?

Php 如何剥离或切片SplHeap(也称为SplMaxHeap、SplMinHeap)的底部项目?,php,heap,slice,spl,Php,Heap,Slice,Spl,我有一个有30件物品的房间。现在我想脱掉最后10个。如何以一种体面而有效的方式做到这一点 到目前为止,我看到的唯一解决方案是将前20个项目复制到一个新堆或将堆复制到一个数组,使用array\u slice并将它们也放入一个新堆中 我甚至找不到从堆里而不是从上面得到东西的方法 我想这是因为堆的一般设计有局限性吧?我也在考虑使用,但是我缺少了自动排序。一种方法是创建一个从SPL堆派生的新类,插入时只保留顶部(或底部,取决于堆)n个项 超级基本示例可能如下所示: class Top100 extend

我有一个有30件物品的房间。现在我想脱掉最后10个。如何以一种体面而有效的方式做到这一点

到目前为止,我看到的唯一解决方案是将前20个项目复制到一个新堆或将堆复制到一个数组,使用
array\u slice
并将它们也放入一个新堆中

我甚至找不到从堆里而不是从上面得到东西的方法


我想这是因为堆的一般设计有局限性吧?我也在考虑使用,但是我缺少了自动排序。

一种方法是创建一个从SPL堆派生的新类,插入时只保留顶部(或底部,取决于堆)n个项

超级基本示例可能如下所示:

class Top100 extends SplMinHeap
{
    protected $limit = 100;
    public function insert($value)
    {
        parent::insert($value);
        while (count($this) > $this->limit) {
            $this->extract();
        }
    }
}

Tobias Schlitt在2010年的文章中对此作了进一步讨论。

问题在于,在SPLHeap中没有“底部”。元素存储在树状结构中。术语“底部”变得有点无意义,然而,树总是有一个“顶部”,这正是SPLHeap可以返回的

如果您有少量的项,那么您可以选择其他数据结构(即使是简单的数组也足够了)。插入元素可能需要一点额外的时间(这是树非常有效的地方),但维护顶部和底部也很便宜(如
spldublelinkedlist

除非您要存储成千上万个元素,否则可能需要为此跳过SplHeap


注意:在PHP中创建fixedHeap结构非常简单,但我认为不会更快。基准测试以检查满足您需求的内容。

@PaulCrovella我明白了。我只是希望有人能找到一个聪明的方法来解决这个设计限制。如果没有好的答案,我知道至少我不必尝试它,我必须使用自定义数据结构。这有一个问题,现在你不能再提取顶部,除非你把它们全部取下来,并反转它们。