SPL,PHP 标准库(Standard PHP Library) ,从 PHP 5.0 起内置的组件和接口,且从 PHP5.3 已逐渐的成熟。SPL 在所有的 PHP5 开发环境中被内置,同时无需任何设置。
对于理解堆以及实现堆很重要的一点就是明白堆的表现形式,堆是树的一种,所以很自然的想到使用链表来实现堆,其实不然,由于我们需要频繁的对堆进行增加删除,所以一般堆的底层都是通过数组来实现,那么就有一个问题:数组如何表现出堆的结构呢?这里就有一个规则,即数组的第一个元素(即下标为0的元素)为堆的根节点,其他节点按照堆结构自上而下,自左而右依次表示为数组中的元素,这是一种既非前序也非后序,更非中序的遍历树的方式。
堆原理图
SplHeap
堆、大头堆、小头堆和优先队列是同一类数据结构,都是基于堆的实现。 堆是一颗完全二叉树,常用于管理算法执行过程中的信息,应用场景包括堆排序,优先队列等。 堆分为大头堆和小头堆,在定义上的区别是父节点的值是大于还是小于子节点的值, 在SPL中,它们的区别以比较函数的不同体现,而比较函数的不同仅仅体现在比较时交换了下位置和函数名的不同。
参考资料
PHP-SPL-SplHeap
SplHeap类说明
PHP的堆以数组的形式存储数据,默认初始化分配64个元素的内存空间,新元素插入时,如果当前元素的个数总和超过分配的值,则会将其空间扩大一倍,即*2。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| 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 ) }
|
SplHeap使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| <?php
class MySimpleHeap extends SplHeap { public function compare( $value1, $value2 ) { return ( $value1 - $value2 ); } } $obj = new MySimpleHeap(); $obj->insert( 4 ); $obj->insert( 8 ); $obj->insert( 1 ); $obj->insert( 0 ); echo $obj->top(); echo $obj->count(); echo '<br/>'; foreach( $obj as $number ) { echo $number.PHP_EOL; }
84 8 4 1 0
|
SplMaxHeap(最大堆)、SplMinHeap(最小堆)
SplMaxHeap和SplMinHeap都是SplHeap类的子类,直接继承了SplHeap的所有方法和属性,各自实现了自己的compare方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| $minHeap = new SplMinHeap(); $maxHeap = new SplMaxHeap(); for ($i=1; $i<=10; $i++) { $minHeap->insert(rand(1, 1000)); $maxHeap->insert(rand(1, 1000)); } print_r("min heap!"); print_r($minHeap); foreach ($minHeap as $value) { print_r($value); } print_r("max heap!"); print_r($maxHeap); foreach ($maxHeap as $value) { print_r($value); }
|