当前位置: 首页 > 后端技术 > PHP

SPL数据结构2-Heap,最大堆,最小堆

时间:2023-03-30 00:26:56 PHP

堆是一种常见的数据结构。底层是用数组实现的二叉树。但是没有父子指针。根据堆属性排序。分为min-heap和max-heap。最小堆:父节点的值小于每个子节点的值最大堆:父节点的值大于每个子节点的值一般用于以下场景:快速排序(最大值和最小值value)priorityqueuemaxheap/minheapspl中的SplHeap抽象类实现了堆数据结构。SplMaxHeap和SplMinHeap继承自SplHeap,分别用于实现最大堆和最小堆。下面的代码以最大堆为例。最小堆和最大堆类似//最大堆$maxheap=newSplMaxHeap();//插入一个节点并重建堆$maxheap->insert(12);$maxheap->insert(3);$maxheap->insert(222);$maxheap->insert(2);$maxheap->insert(312);$maxheap->insert(3);$maxheap->insert(13);$maxheap->insert(32);$maxheap->insert(3);$maxheap->insert(1);//最大推顶元素:312echo"最大推顶元素:".$maxheap->top().PHP_EOL;//提取顶部元素//提取节点并重建堆//extract:312echo"extract:".$最大堆->提取()。PHP_EOL;//提取物:222echo"提取物:".$最大堆->提取()。PHP_EOL;//提取物:32echo"提取物:".$maxheap->extract().PHP_EOL;echo"判断是否为空堆:".PHP_EOL;//bool(false)var_dump($maxheap->isEmpty());//当堆长为0时,堆为空堆//当前堆长度:7echo“当前堆长度:”。$最大堆->计数()。PHP_EOL;很多时候要实现自定义推排序,单纯的数字大小比较不能满足我们对堆数据结构的要求。比如我们要实现基于复杂数组的堆排序。SplHeap类提供比较抽象方法。只要实现自己的compare方法,就可以对任何数据类型进行min-heap和max-heap排序。['name'=>'Bob',score=>99.2]**@parammixed$value1*@parammixed$value2**@returnint*/protectedfunctioncompare($value1,$value2){if($value1['分数']>$value2['分数']){返回1;}elseif($value1['score']<$value2['score']){return-1;}否则{返回0;$myheap=newMmaxHead();$myheap->insert(['name'=>"bob1","score"=>65]);$myheap->insert(['name'=>"bob2","score"=>34.3]);$myheap->insert(['name'=>"bob3","score"=>99.3]);$myheap->insert(['name'=>"bob4","score"=>23.4]);$myheap->insert(['name'=>"bob5","score"=>55]);$myheapap->insert(['name'=>"bob6","score"=>66]);//最高分是//array(2){//["name"]=>//string(4)"bob3"//["score"]=>//float(99.3)//}echo"最高分是".PHP_EOL;var_dump($myheap->top());echo"rankinginorder:".PHP_EOL;while(!$myheap->isEmpty()){var_dump($myheap->extract());}优先队列spl给我们提供了一个优先级队列SplPriorityQueueSplPriorityQueue是基于最大堆实现的,即优先级越大越早Dequeue。可以通过重写compare改成prioritysmallfirstout(最小堆),也可以通过集成重写compare实现自己的业务逻辑$objPQ=newSplPriorityQueue();$objPQ->insert('A',3);$objPQ->insert('B',6);$objPQ->insert('C',1);$objPQ->insert('D',2);//优先队列长度:4echo"优先队列length:".$objPQ->count().PHP_EOL;/***设置元素出队模式*SplPriorityQueue::EXTR_DATA只提取值*SplPriorityQueue::EXTR_PRIORITY只提取优先级*SplPriorityQueue::EXTR_BOTH提取数组包含值和优先级*///默认$objPQ->setExtractFlags(SplPriorityQueue::EXTR_DATA);//topextractionvalue:Becho"topextractionvalue:".$objPQ->top().PHP_EOL;$objPQ->setExtractFlags(SplPriorityQueue::EXTR_PRIORITY);//topextractionpriority:6echo"topextractionpriority:".$objPQ->top().PHP_EOL;$objPQ->setExtractFlags(SplPriorityQueue::EXTR_BOTH);//top返回数组包括值和优先级://array(2){//["data"]=>//字符串g(1)"B"//["priority"]=>//int(6)//}echo"top返回包含值和优先级的数组:".PHP_EOL;var_dump($objPQ->top());//遍历://BADC$objPQ->setExtractFlags(SplPriorityQueue::EXTR_DATA);while($objPQ->valid()){print_r($objPQ->current());$objPQ->next();}上一篇:双向链表、栈、队列下一篇:SPL数据结构3——SplFixedArray