文章目录
list
- 项目目录
- 项目描述
- 基本功能实现
- 数据生成器测试
- 时间复杂度理论推导
- 时间复杂度实验验证
- 如何设计实验
- 如何获取数据
- 如何绘制图像
- 和其他数据结构类型的比较
- 和普通数组的比较 v e c t o r vector vector
- 和链表list的比较 l i s t list list
- 和和普通堆的比较 p r i o r i t y _ q u e u e priority\_queue priority_queue
- 和左高树的比较
- 和红黑树的比较 m a p map map and $set $
- 和哈希的比较 h a s h hash hash
- 界面的制作
list
二项堆项目目录
二项堆命令行版(主要包含相关效率分析实验)
│ list.txt //项目目录
│ binaryHeap.h
| binaryHeap.cpp
│ list.txt //项目目录
│ vislization.cpp
| main.cpp //主函数文件
│ in.txt
│ graph.dot
│ graph.jpg
二项堆Qt版本(可视化操作)
| binaryheap.cpp
| binaryheap.h
| binaryHeap.pro
| binaryHeap.pro.user
| list.txt
| main.cpp
| mainwindow.cpp
| mainwindow.h
| mainwindow.ui
| visualization.cpp
| visualization.h
项目描述
二项堆的实现和分析
问题描述:
认识二项树、二项堆数据结构,并能应用该结构解决实际问题。
二项堆是二项树的集合,二项树是一种递归定义的有序树。它的递归定义如下:
(1) 二项树B0只有一个结点;
(2) 二项树Bk由两棵二项树B(k-1)组成的,其中一棵树是另一棵树根的最左孩子。
二项树具有如下的性质:
-
对于树Bk,该树含有2k个节点;
-
树的高度是k;
-
在深度为i中含有 节点,其中i = 0, 1,2 … , k;
二项堆H是具备如下性质的二项树的集合:
-
H中的每个二项树遵循最小堆性质;
-
对于任意的整数k的话,H中最多有一个二项树的根的度数是k;
基本要求:
① 设计二项堆ADT,其上的基本操作包括:
Make Heap ():初始化一个空堆;
Find-Min():返回一个指向最小关键字元素的指针
Union(H):与堆H进行合并,合并后的结果保存在当前堆,H变为空
Insert(x):插入元素x
Extract-Min():从堆中删除最小关键字元素,并返回指向删除元素的指针。
Decrease Key (x,k):将元素x的关键字赋予新值k;
Delete(x):从堆中删除元素x;
② 实现二项堆ADT,包括实现二项堆的存储结构以及其上的基本操作,并分析基本操作的时间复杂性。
③ 实现二项堆ADT的基本操作展示。
数据生成器
数据操作格式
第1行:初始化元素数n,操作个数m
第2~n+1行:n个元素的大小
接下来m行:<op,value1,value2=NULL> 格式
op:操作类型
value1,value2:大小
<insert,value>
添加
<erase,value>
删除元素
<erasemin>
删除最小
<update,old,new>
更新元素
特别注意:操作中删除操作和插入操作的数量关系
关于理论分析
时间复杂度的推导
应用贪心思想
二项堆各种操作的时间复杂度如下所示:
操作名称 | 操作时间复杂度 |
---|---|
合并 | O ( l o g n ) O(logn) O(logn) |
插入 | O ( l o g n ) O(logn) O(logn) |
删除 | O ( l o g n ) O(logn) O(logn) |
删除最小 | O ( l o g n ) O(logn) O(logn) |
减小元素大小 | O ( l o g n ) O(logn) O(logn) |
增大元素大小 | O ( l o g n ) O(logn) O(logn) |
查找最小 | O ( l o g n ) O(logn) O(logn) |
具体推导如下所示:
根据二项堆的定义可知,二项堆满足一下两条性质
1. 每棵二项树都满足最小堆性质。即,父节点的关键字 <= 它的孩子的关键字。
2. 不能有两棵或以上的二项树具有相同的度数(包括度数为0)。换句话说,具有度数k的二项树有0个或1个。
3. 二项堆是二项树的集合,且二项树B0只含有一个点(零图)
4. 二项树的递归定义:
B k = 2 B k − 1 B_k=2B_{k-1} Bk=2Bk−1
5.二项堆中的任意两颗树的度数(即树中的节点个数&#x