【SPL標準庫專題(8)】Datastructures:SplHeap & SplMaxHeap & SplMinHeap

堆(Heap)就是爲了實現優先隊列而設計的一種數據結構,它是經過構造二叉堆(二叉樹的一種)實現。根節點最大的堆叫作最大堆或大根堆,根節點最小的堆叫作最小堆或小根堆。二叉堆還經常使用於排序(堆排序)。php

1352265671_1438.jpg-27.3kB

類摘要

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

從上面能夠看到因爲類中包含一個compare的抽象方法,因此該類必須爲抽象類(不可實例化,只能被繼承使用);算法

最小堆和最大堆其實就是對compare該抽象方法的一個算法的兩種呈現; 也能夠本身寫一個類繼承SplHeap按本身的方式來作排序;數據結構

Example

自定義排序堆

class MySimpleHeap extends SplHeap
{
  //compare()方法用來比較兩個元素的大小,決定他們在堆中的位置
  public function  compare( $value1, $value2 ) {
    return ($value2 - $value1);
  }
}
$obj = new MySimpleHeap();

$obj->insert( 4 );
$obj->insert( 8 );
$obj->insert( 1 );
$obj->insert( 0 );

echo $obj->top();  //8

foreach( $obj as $number ) {
  echo $number;
  echo PHP_EOL;
}

最大堆與最小堆

$heap = new SplMaxHeap();
$heap->insert(100);
$heap->insert(80);
$heap->insert(88);
$heap->insert(70);
$heap->insert(810);
$heap->insert(800);

//最大堆,從大到小排序
$heap->rewind();
while($heap->valid()){
  echo $heap->key(),'=>',$heap->current(),PHP_EOL;
  $heap->next();
}
相關文章
相關標籤/搜索