php标准库中的优先队列SplPriorityQueue怎么使用?(继承)
一、总结
1、new对象,然后通过insert方法和extract方法来使用,top方法也很常用。
2、类的话首先想到继承,所以可以继承SplPriorityQueue来实现自己特定功能的优先队列。(继承思想)
二、php标准库中的优先队列SplPriorityQueue怎么使用?
而优先队列SplPriorityQueue是基于堆(后文介绍)实现的。
SplPriorityQueue简单使用:
1 $pq = new SplPriorityQueue(); 2 3 $pq->insert('a', 10); 4 $pq->insert('b', 1); 5 $pq->insert('c', 8); 6 7 echo $pq->count() .PHP_EOL; //3 8 echo $pq->current() . PHP_EOL; //a 9 10 /** 11 * 设置元素出队模式 12 * SplPriorityQueue::EXTR_DATA 仅提取值 13 * SplPriorityQueue::EXTR_PRIORITY 仅提取优先级 14 * SplPriorityQueue::EXTR_BOTH 提取数组包含值和优先级 15 */ 16 $pq->setExtractFlags(SplPriorityQueue::EXTR_DATA); 17 18 while($pq->valid()) { 19 print_r($pq->current()); //a c b 20 $pq->next(); 21 } 22
三、php手册:SplPriorityQueue
简介 ¶
The SplPriorityQueue class provides the main functionalities of a prioritized queue, implemented using a max heap.
类摘要 ¶
SplPriorityQueue implements Iterator , Countable {
/* 方法 */
public __construct ( void )
public int count ( void )
public mixed current ( void )
public mixed extract ( void )
public int getExtractFlags ( void )
public bool isCorrupted ( void )
public bool isEmpty ( void )
public mixed key ( void )
public void next ( void )
public void recoverFromCorruption ( void )
public void rewind ( void )
public void setExtractFlags ( int
$flags
)public mixed top ( void )
public bool valid ( void )
}Table of Contents ¶
- SplPriorityQueue::compare — Compare priorities in order to place elements correctly in the heap while sifting up
- SplPriorityQueue::__construct — Constructs a new empty queue
- SplPriorityQueue::count — Counts the number of elements in the queue
- SplPriorityQueue::current — Return current node pointed by the iterator
- SplPriorityQueue::extract — Extracts a node from top of the heap and shift up
- SplPriorityQueue::getExtractFlags — Get the flags of extraction
- SplPriorityQueue::insert — Inserts an element in the queue by sifting it up
- SplPriorityQueue::isCorrupted — Tells if the priority queue is in a corrupted state
- SplPriorityQueue::isEmpty — Checks whether the queue is empty
- SplPriorityQueue::key — Return current node index
- SplPriorityQueue::next — Move to the next node
- SplPriorityQueue::recoverFromCorruption — Recover from the corrupted state and allow further actions on the queue
- SplPriorityQueue::rewind — Rewind iterator back to the start (no-op)
- SplPriorityQueue::setExtractFlags — Sets the mode of extraction
- SplPriorityQueue::top — Peeks at the node from the top of the queue
- SplPriorityQueue::valid — Check whether the queue contains more nodes
1 quick implementation of SPL Priority Queue: 2 3 <?php 4 5 class PQtest extends SplPriorityQueue 6 { 7 public function compare($priority1, $priority2) 8 { 9 if ($priority1 === $priority2) return 0; 10 return $priority1 < $priority2 ? -1 : 1; 11 } 12 } 13 14 $objPQ = new PQtest(); 15 16 $objPQ->insert('A',3); 17 $objPQ->insert('B',6); 18 $objPQ->insert('C',1); 19 $objPQ->insert('D',2); 20 21 echo "COUNT->".$objPQ->count()."<BR>"; 22 23 //mode of extraction 24 $objPQ->setExtractFlags(PQtest::EXTR_BOTH); 25 26 //Go to TOP 27 $objPQ->top(); 28 29 while($objPQ->valid()){ 30 print_r($objPQ->current()); 31 echo "<BR>"; 32 $objPQ->next(); 33 } 34 35 ?> 36 37 output: 38 39 COUNT->4 40 Array ( [data] => B [priority] => 6 ) 41 Array ( [data] => A [priority] => 3 ) 42 Array ( [data] => D [priority] => 2 ) 43 Array ( [data] => C [priority] => 1 )
四、测试题-简答题
1、SplPriorityQueue的入队方法和出队方法是什么?
解答:insert和extract。top方法也很常用。
2、如何遍历一个SplPriorityQueue?
解答:valid()+current()+next()。
29 while($objPQ->valid()){
30 print_r($objPQ->current());
31 echo "<BR>";
32 $objPQ->next();
33 }
3、SplPriorityQueue的实现原理是什么,用的那种数组结构?
解答:用的大根堆。using a max heap。
4、如何插入一个元素到SplPriorityQueue中去?
解答:$objPQ->insert('A',3); 先值后优先级,是一个map。
5、如何写符合自己功能的优先队列(通过继承)?(有类先想继承)
解答:继承SplPriorityQueue类即可,class PQtest extends SplPriorityQueue 。
6、如何设置SplPriorityQueue的提取数据方式,是值是优先级还是两者都提取?
解答:通过SPLPriorityQueue的setExtractFlags方法,$pq->setExtractFlags(SplPriorityQueue::EXTR_DATA);