堆(Heap)就是為了實現優先隊列而設計的一種資料結構,它是通過構造二元堆積(二叉樹的一種)實現。根節點最大的堆叫做最大堆或大根堆,根節點最小的堆叫做最小堆或小根堆。二元堆積還常用於排序(堆排序)。SplHeap 是一個抽象類別,實現了Iterator , Countable介面。最大堆(SplMaxHeap)和最小堆(SplMinHeap)就是繼承它實現的,可以在PHP程式中直接使用。
類摘要:
abstract SplHeap implements Iterator , Countable { // 建立一個空堆 public __construct ( void ) // 比較兩個節點的大小 abstract protected int compare ( mixed $value1 , mixed $value2 ) // 返回堆節點數 public int count ( void ) // 返回迭代指標指向的節點 public mixed current ( void ) // 從堆頂部提取一個節點並重建堆 public mixed extract ( void ) // 向堆中添加一個節點並重建堆 public void insert ( mixed $value ) // 判斷是否為空白堆 public bool isEmpty ( void ) // 返回迭代指標指向的節點的鍵 public mixed key ( void ) // 迭代指標指向下一節點 public void next ( void ) // 恢複堆 public void recoverFromCorruption ( void ) // 重設迭代指標 public void rewind ( void ) // 返回堆的頂部節點 public mixed top ( void ) // 判斷迭代指標指向的節點是否存在 public bool valid ( void )}
例子說明:
<?php/** * 實現一個自己的最大堆 * * @author 瘋狂老司機 */ class iMaxHeap extends SplHeap { /** * 實現compare抽象方法,使用關聯陣列的值進行比較排序 * SplMaxHeap不能滿足我們的需求 */ public function compare($array1, $array2) { $values1 = array_values($array1); $values2 = array_values($array2); if ($values1[0] === $values2[0]) return 0; return $values1[0] < $values2[0] ? -1 : 1; }}$heap = new iMaxHeap();$heap->insert(array ('a' => 12));$heap->insert(array ('b' => 20));$heap->insert(array ('c' => 23));$heap->insert(array ('d' => 32));$heap->insert(array ('e' => 15));$heap->insert(array ('f' => 17));$heap->insert(array ('g' => 31));$heap->insert(array ('h' => 11));$heap->insert(array ('i' => 18));$heap->insert(array ('j' => 24));var_dump($heap->top());while ($heap->valid()) { $cur = $heap->current(); list ($team, $score) = each($cur); echo $team . ': ' . $score . '<br/>'; $heap->next();}?>
以上輸出:
array (size=1)
'd' => int 32
d: 32
g: 31
j: 24
c: 23
b: 20
i: 18
f: 17
e: 15
a: 12
h: 11