[Experiment]HeapComparison

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 4

[ADN.

cn][Library]Experiment 三种堆基于 Dijkstra 算法的对比试验 Amber

三种堆(BinaryHeap, FibHeap, PairHeap)


基于 Dijkstra算法的对比试验
Amber
[ADN.cn]

1. 目的

本文目的在于比较三种高级堆结构的实际效率。从而得到对数据结构的一些感性认识,
为实际应用积累经验。它们分别是:
二叉堆(Binary Heap)
Fibonacci 堆(Fibonacci Heap)
配对堆(Pair Heap)

2. 测试方法

采用标准的 Dijkstra 算法,用到优先队列(堆)的 Insert, DeleteMin, DecreaseKey 方法。


这里是 Dijkstra 的伪代码:

具体实现的图结构存储采用邻接表。

3. 理论比较

这里列出 3 种三种堆二叉堆(Binary Heap),Fibonacci 堆(Fibonacci Heap),配对堆(Pair


Heap)的涉及操作的理论复杂度。关于数据结构具体的实现,请参考相关文献。

Insert DeleleMin DecreaseKey

Pairheap O (1) ? O (1)

FibHeap O (1) O (log n) O (1)

BinaryHeap O (log n) O (log n) O (log n)

第 1 页 共 4 页
[ADN.cn][Library]Experiment 三种堆基于 Dijkstra 算法的对比试验 Amber

其中?是由于 Pairheap 的 DeleteMin 的复杂度分析是没有解决的问题。均摊的复杂度可能

小于 O (log n ) 。

由此,可以发现 Fibonacci 堆的复杂度最低,而且稳定。但配对堆(Pair Heap)除了


DeleteMin 操作无法确定外,其他操作也不输于 Fibonacci 堆。

4. 数据生成

z 数据规模:点数 n = 10 6 ,边数 m = 10n 。

这样的数据规模,大概占用 160M 内存。对于现有计算机,这种规模恰好适合区别

O ((n + m) log n) 至 O ( n log n + m ) 的复杂度。即容易区别出 O ( m) 与 O ( m log n) 。

对于这样的数据,用文件存不下,所以一次生成后,再分别用各个堆来计算。这样省去
了输入输出的时间。
z 数据生成:
采用稀疏图的生成函数,先随机一个生成树( n − 1 条边),再随机边插入剩下的 m − n + 1 条
边。

5. 测试细节

z 计时
采用在 Windows 单元中的 GetTickCount()计算时间差,精度到达毫秒级别,但有一
定误差。
z 测试环境
编译器:Delphi 6.0 based on Dcc32 v14.0
系统环境:Windows XP SP2
CPU: Centrino M, 1.8G
内存:512M DDR2

6. 测试结果

用表格表示如下:

PairHeap FibHeap BinaryHeap


TestNum Answer
(ms) (ms) (ms)
1 126747 5172 6375 6797
2 123479 5360 6531 6969
3 77075 375 453 469
4 133001 3032 3750 4187
5 95798 953 1296 1516

第 2 页 共 4 页
[ADN.cn][Library]Experiment 三种堆基于 Dijkstra 算法的对比试验 Amber

6 75176 407 485 515


7 132306 4797 5890 6344
8 133514 6125 7532 7984
9 137174 5141 6281 6781
10 92181 1109 1468 1704

用图表表示如下:

10

0 2000 4000 6000 8000 10000

7. 代码长度

Heaps Lines
FibonacciHeap.pas 279
PairHeap.pas 194
BinaryHeap.pas 150

8. 实际比较结论

这些足以说明配对堆(Pair Heap)很牛。较 Fibonacci 堆来说,时间,空间,编程,思维


复杂度都低,更具实战性。

第 3 页 共 4 页
[ADN.cn][Library]Experiment 三种堆基于 Dijkstra 算法的对比试验 Amber

由于试验中规模很大,二叉堆(Binary Heap)也不是特别逊色。所以大部分比赛中用二
叉堆就可以了。
Fibonacci 堆的常数很大。可能均摊的复杂度有时可能会小于 Pairheap,但却被巨大的常数
掩盖了。

9. 参考文献

[1] Mark Allen Weiss. Data Structures and Algorithm Analysis in C++. 1996.
[2] Thomas H. Cormen, Charles E. Leiseison, Ronald L. Rivest and Clifford Stein.
Introduction to Algorithm, Second Edition. MIT Press and McGraw-Hill, 2001.

10. 源程序

Base.pas 基本数据定义

GraphGen.pas 数据生成器

Dijkstra.dpr 主算法

BinaryHeap.pas 二叉堆

FibonacciHeap.pas Fib 堆

PairHeap.pas 配对堆

第 4 页 共 4 页

You might also like