Класс SplHeap

(PHP 5 >= 5.3.0)

Введение

Класс SplHeap предоставляет основные функциональные возможности кучи.

Обзор классов

abstract SplHeap implements Iterator , Countable {
/* Методы */
__construct ( void )
abstract int compare ( mixed $value1 , mixed $value2 )
int count ( void )
mixed current ( void )
mixed extract ( void )
void insert ( mixed $value )
bool isEmpty ( void )
mixed key ( void )
void next ( void )
void recoverFromCorruption ( void )
void rewind ( void )
mixed top ( void )
bool valid ( void )
}

Содержание

  • SplHeap::compare — Сравнивает элементы, чтобы во время сортировки корректно разместить их в куче
  • SplHeap::__construct — Создает новую пустую кучу
  • SplHeap::count — Определяет количество элементов в куче
  • SplHeap::current — Возвращает текущий узел, на который указывает итератор
  • SplHeap::extract — Извлекает узел из кучи и пересортирует ее
  • SplHeap::insert — Вставляет элемент в кучу и пересортирует ее
  • SplHeap::isEmpty — Проверка, пуста ли куча
  • SplHeap::key — Возвращает индекс текущего узла
  • SplHeap::next — Переход к следующему узлу
  • SplHeap::recoverFromCorruption — Восстанавливает корректное состояние кучи
  • SplHeap::rewind — Перевод итератора на начало
  • SplHeap::top — Возвращает узел находящийся на вершине кучи
  • SplHeap::valid — Проверяет, содержит ли куча еще элементы

Коментарии

To have a good idea what you can do with SplHeap, I created a little example script that will show the rankings of Belgian soccer teams in the Jupiler League.

<?php
/**
 * A class that extends SplHeap for showing rankings in the Belgian
 * soccer tournament JupilerLeague
 */
class JupilerLeague extends SplHeap 
{
   
/**
     * We modify the abstract method compare so we can sort our
     * rankings using the values of a given array
     */
   
public function compare($array1$array2)
    {
       
$values1 array_values($array1);
       
$values2 array_values($array2);
        if (
$values1[0] === $values2[0]) return 0;
        return 
$values1[0] < $values2[0] ? -1;
    }
}

// Let's populate our heap here (data of 2009)
$heap = new JupilerLeague();
$heap->insert(array ('AA Gent' => 15));
$heap->insert(array ('Anderlecht' => 20));
$heap->insert(array ('Cercle Brugge' => 11));
$heap->insert(array ('Charleroi' => 12));
$heap->insert(array ('Club Brugge' => 21));
$heap->insert(array ('G. Beerschot' => 15));
$heap->insert(array ('Kortrijk' => 10));
$heap->insert(array ('KV Mechelen' => 18));
$heap->insert(array ('Lokeren' => 10));
$heap->insert(array ('Moeskroen' => 7));
$heap->insert(array ('Racing Genk' => 11));
$heap->insert(array ('Roeselare' => 6));
$heap->insert(array ('Standard' => 20));
$heap->insert(array ('STVV' => 17));
$heap->insert(array ('Westerlo' => 10));
$heap->insert(array ('Zulte Waregem' => 15));

// For displaying the ranking we move up to the first node
$heap->top();

// Then we iterate through each node for displaying the result
while ($heap->valid()) {
  list (
$team$score) = each ($heap->current());
  echo 
$team ': ' $score PHP_EOL;
 
$heap->next();
}
?>

This results in the following output:
Club Brugge: 21
Anderlecht: 20
Standard: 20
KV Mechelen: 18
STVV: 17
Zulte Waregem: 15
AA Gent: 15
G. Beerschot: 15
Charleroi: 12
Racing Genk: 11
Cercle Brugge: 11
Kortrijk: 10
Lokeren: 10
Westerlo: 10
Moeskroen: 7
Roeselare: 6

Hope this example paved the way for more complex implementations of SplHeap.
2009-10-07 02:44:31
http://php5.kiev.ua/manual/ru/class.splheap.html
While Michelangelo Van Dam example (http://br2.php.net/manual/en/class.splheap.php#93930) is a great demonstration of what can be done with SplHeap, this implementation is exactly what SplPriorityQueue does - based on SplMaxHeap. If you're planning to copy that snippet, go no further! There's a SPL class that does exactly what you want :)
2014-06-26 04:02:18
http://php5.kiev.ua/manual/ru/class.splheap.html
Автор:
If you wish to build a true tree based heap, you can do so as follows (implemented with SplMinHeap, but could be SplMaxHeap if you wish for the opposite order of items):

The stucture that we're trying to represent:

         1
         |
+-----+--+--+-----+
|     |     |     |
2     3     4     5
|     |           |
+   +-+-+         +
|   |   |         |
7   6   8         9
                  |
                +-+-+
                |   |
               10   11

<?php
$h 
= new SplMinHeap();

// [parent, child]
$h->insert([911]);
$h->insert([01]);
$h->insert([12]);
$h->insert([13]);
$h->insert([14]);
$h->insert([15]);
$h->insert([36]);
$h->insert([27]);
$h->insert([38]);
$h->insert([59]);
$h->insert([910]);

for (
$h->top(); $h->valid(); $h->next()) {
    list(
$parentId$myId) = $h->current();
    echo 
"$myId ($parentId)\n";
}
?>

As you iterate over the heap, the return data will be read as if you're reading a book; ie left to right, top to bottom. It will NOT follow the relationships.

So, the above code will output the following:

1 (0)
2 (1)
3 (1)
4 (1)
5 (1)
7 (2)
6 (3)
8 (3)
9 (5)
10 (9)
11 (9)
2016-06-08 15:15:23
http://php5.kiev.ua/manual/ru/class.splheap.html

    Поддержать сайт на родительском проекте КГБ