Klasse PriorityQueue (als Heap)
Die Prioritätenliste ist hier als Heap implementiert. Dadurch benötigen sowohl insert als auch extract nur O(log(n)) Schritte.
Beim Aufruf des Konstruktors wird mit dem Parameter updown = 1 oder updown = -1 festgelegt, ob mit extract das Paar mit dem höchsten oder mit dem niedrigsten Zahlenwert zurückgegeben werden soll.
<?php
class PriorityQueue
{
private $a;
private $updown;
public function PriorityQueue($updown=1)
{
$this->a=array();
$this->updown=$updown;
}
public function insert($p, $x=null)
{
$this->a[]=array($p, $x);
$this->upheap();
}
public function extract()
{
$this->exchange($this->root(), $this->lastLeaf());
$z=array_pop($this->a);
$this->downheap();
return $z;
}
public function extractVal()
{
$z=$this->extract();
return $z[0];
}
public function extractObj()
{
$z=$this->extract();
return $z[1];
}
private function upheap()
{
$v=$this->lastLeaf();
while (!$this->isRoot($v))
{
$u=$this->pred($v);
if ($this->p($u)>=$this->p($v))
return;
$this->exchange($u, $v);
$v=$u;
}
}
private function downheap()
{
$v=$this->root();
while (!$this->isLeaf($v))
{
$w=$this->succ($v);
if ($this->exists($w+1))
if ($this->p($w+1)>$this->p($w))
$w++;
if ($this->p($v)>=$this->p($w))
return;
$this->exchange($v, $w);
$v=$w;
}
}
private function p($v)
{
return $this->updown*$this->a[$v][0];
}
private function exchange($i, $j)
{
$h=$this->a[$i];
$this->a[$i]=$this->a[$j];
$this->a[$j]=$h;
}
private function root()
{
return 0;
}
private function lastLeaf()
{
return $this->size()-1;
}
private function pred($v)
{
return floor(($v-1)/2);
}
private function succ($v)
{
return $v*2+1;
}
private function isRoot($v)
{
return $v==0;
}
private function isLeaf($v)
{
return $v>=floor($this->size()/2);
}
private function exists($v)
{
return $v<$this->size();
}
public function isEmpty()
{
return $this->size()==0;
}
public function size()
{
return count($this->a);
}
}
?>
[up]
H.W. Lang mail@hwlang.de Impressum Datenschutz
Created: 06.02.2009 Updated: 19.02.2023
Diese Webseiten sind während meiner Lehrtätigkeit an der Hochschule Flensburg entstanden