2013-05-26 24 views
0

我試圖擴展PHP的SplMinHeap,所以我可以限制我的堆可以容納的項目數量。問題是,當我嘗試訪問頂層元素時,它應該是最小值,它給了我最大值。我到目前爲止的代碼非常簡單: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()); 
     } 
    } 
}; 

當我插入數字1到15我希望它打印1 5倍,而不是將其打印10.我也試圖擴展插件的方法,使用與myInsert相同的代碼,但用parent::insert代替$this->insert。我只是不知道這是否會使用我的擴展compare或默認的,這就是爲什麼我切換它。

奇怪的是,如果使用正常的SplMinHeap並插入相同的數字,我將在調用top()時得到1。

任何人都可以幫我弄清楚我做錯了什麼嗎?

+1

似乎定義比較函數定義的堆型。如果您將創建自己的比較函數 - 您將擁有自己的堆類型)祝您好運。 –

+0

@u_mulder這可能是不這樣做的一個很好的理由:) – vascowhite

回答

2

問題是比較方法。 只要改變比較

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

,你會得到你的SplMinHeap。 此外,我認爲你應該擴展SplHeap類,而不是SplMinHeap

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()); 
     } 
    } 
};