zoukankan      html  css  js  c++  java
  • php标准库中的优先队列SplPriorityQueue怎么使用?(继承)

    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 compare ( mixed $priority1 , mixed $priority2 )
    public int count ( void )
    public mixed current ( void )
    public mixed extract ( void )
    public int getExtractFlags ( void )
    public void insert ( mixed $value , mixed $priority )
    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 ¶

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

  • 相关阅读:
    React元素渲染
    初识JSX
    微信小程序复制文本到剪切板
    微信小程序报错request:fail url not in domain list
    小程序,通过自定义编译条件,模拟推荐人功能
    积分抵扣逻辑
    微信小程序 switch 样式
    tomcat 配置开启 APR 模式
    tomcat8 传输json 报错 Invalid character found in the request target. The valid characters are defined in RFC 3986
    c++数组初始化误区
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/9103176.html
Copyright © 2011-2022 走看看