2021-05-24 二项堆的实现和分析(含可视化Qt)

本文详细介绍了二项堆的数据结构实现,包括MakeHeap、Find-Min、Union、Insert、Extract-Min和DecreaseKey/Delete操作,重点讨论了这些操作的时间复杂度,通过贪心策略推导和实验验证。比较了二项堆与其他数据结构如数组、链表、堆、左高树、红黑树和哈希表。此外,还涵盖了界面可视化和实验设计,以及不同数据结构之间的性能对比。
摘要由CSDN通过智能技术生成

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)组成的,其中一棵树是另一棵树根的最左孩子。
在这里插入图片描述

二项树具有如下的性质:

  1. 对于树Bk,该树含有2k个节点;

  2. 树的高度是k;

  3. 在深度为i中含有 节点,其中i = 0, 1,2 … , k;

二项堆H是具备如下性质的二项树的集合

  1. H中的每个二项树遵循最小堆性质;

  2. 对于任意的整数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. 第1行:初始化元素数n,操作个数m

  2. 第2~n+1行:n个元素的大小

  3. 接下来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=2Bk1

5.二项堆中的任意两颗树的度数(即树中的节点个数&#x

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sentry-X

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值