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

  • 相关阅读:
    关于注解
    关于泛型
    关于ER图和UML图之间的对比
    关于Eclipse中的egit的常规使用和模板
    关于Eclipse中的开源框架EMF(Eclipse Modeling Framework),第三部分
    关于Eclipse Modeling Framework进行建模,第二部分
    SQL Server 2005/2008备份数据库时提示“无法打开备份设备”
    试用版SQL Server 2008 R2 提示评估期已过
    该登录名来自不受信任的域,不能与 Windows 身份验证一起使用。
    SVN-如何删除 SVN 文件夹下面的小图标
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/9103176.html
Copyright © 2020-2023  润新知