SplHeap 类

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

介绍

SplHeap 类提供了堆的主要功能。

类概要

abstract class SplHeap implements Iterator, Countable {
/* 方法 */
protected compare(mixed $value1, mixed $value2): int
public count(): int
public current(): mixed
public extract(): mixed
public insert(mixed $value): true
public isCorrupted(): bool
public isEmpty(): bool
public key(): int
public next(): void
public rewind(): void
public top(): mixed
public valid(): bool
}

目录

添加备注

用户贡献备注 3 notes

Michelangelo van Dam
14 年前
为了更好地了解 SplHeap 的用途,我创建了一个简单的示例脚本,它将显示比利时足球联赛 Jupiler League 中球队的排名。

<?php
/**
* 扩展 SplHeap 的类,用于显示比利时
* 足球联赛 JupilerLeague 的排名
*/
class JupilerLeague extends SplHeap
{
/**
* 我们修改了抽象方法 compare,以便我们可以使用给定数组的值对
* 排名进行排序
*/
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 : 1;
}
}

// 让我们在这里填充堆 (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));

// 为显示排名,我们向上移动到第一个节点
$heap->top();

// 然后我们遍历每个节点以显示结果
while ($heap->valid()) {
list (
$team, $score) = each ($heap->current());
echo
$team . ': ' . $score . PHP_EOL;
$heap->next();
}
?>

这将产生以下输出
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

希望这个示例能为 SplHeap 的更复杂实现铺平道路。
igorsantos07 at gmail dot com
10 年前
虽然 Michelangelo Van Dam 的示例 (http://br2.php.net/manual/en/class.splheap.php#93930) 很好地展示了 SplHeap 的功能,但这种实现正是 SplPriorityQueue 所做的 - 基于 SplMaxHeap。如果您打算复制这段代码,那就别再做啦!有一个 SPL 类可以完全满足您的需求 :)
Anthony
8 年前
如果您想构建一个真正的基于树的堆,您可以按照以下步骤操作(使用 SplMinHeap 实现,但如果您希望以相反的顺序排列项目,也可以使用 SplMaxHeap)

我们试图表示的结构

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

<?php
$h
= new SplMinHeap();

// [父节点,子节点]
$h->insert([9, 11]);
$h->insert([0, 1]);
$h->insert([1, 2]);
$h->insert([1, 3]);
$h->insert([1, 4]);
$h->insert([1, 5]);
$h->insert([3, 6]);
$h->insert([2, 7]);
$h->insert([3, 8]);
$h->insert([5, 9]);
$h->insert([9, 10]);

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

当您遍历堆时,返回的数据将像阅读书籍一样被读取;即从左到右,从上到下。它不会遵循关系。

因此,上面的代码将输出以下内容

1 (0)
2 (1)
3 (1)
4 (1)
5 (1)
7 (2)
6 (3)
8 (3)
9 (5)
10 (9)
11 (9)
To Top