0

我正在尝试扩展 PHP 的 SplMinHeap,这样我就可以限制我的堆可以容纳的项目数量。问题是,当我尝试访问应该是最小值的顶部元素时,它给了我最大值。到目前为止,我的代码非常简单:

class MyHeap extends SplMinHeap {
    public static $limit = 10;

    public function compare($value1, $value2) {
         return ($value1 - $value2);
    }

    public function myInsert($value) {
        if ( $this->count() < self::$limit ) {
            $this->insert($value);
        } else {
            var_dump($this->top());
        }
    }
};

myInsert当我插入数字 1 到 15 时,我希望它打印 1 5 次,而不是打印 10。我还尝试扩展 insert 方法,使用$this->insertparent::insert. 我只是不知道那会使用我的扩展版compare还是默认版,这就是我切换它的原因。

奇怪的是,如果使用普通的 SplMinHeap 并插入相同的数字,我会在调用top().

谁能帮我弄清楚我做错了什么?

4

2 回答 2

2

问题是比较方法。只是改变比较

public function compare($value1, $value2) {
     return ($value2 - $value1);
}

你会得到你的 SplMinHeap。另外我认为你应该扩展SplHeap类,而不是SplMinHeap

于 2013-05-26T16:43:47.403 回答
0

我不确定您的比较方法要实现什么,因为它与默认比较方法完全相同,但删除它可以解决问题。您已将 compare 方法声明为 public,这会在基类中的方法受到保护时生成警告。

您也可以直接覆盖插入方法,一切都会正常工作:-

class MyHeap extends SplMinHeap {
    public static $limit = 10;

    public function insert($value) {
        if ($this->count() < self::$limit) {
            parent::insert($value);
        } else {
            var_dump($this->top());
        }
    }
};
于 2013-05-26T16:49:18.380 回答