博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
优先级队列-堆
阅读量:4573 次
发布时间:2019-06-08

本文共 852 字,大约阅读时间需要 2 分钟。


首先明确优先级队列的两个表象:

  1. 插入元素
  2. 删除最小元素

能够实现上述两个操作的数据结构-----优先级队列。

我们可以使用数组(有序或无序)、单链表、二叉查找树、堆等数据结构来实现。


为什么选择堆来实现呢?

主要是从时间复杂度来考虑

  1. 数组(有序):插入操作 O(n) 删除操作 O(1)
  2. 数组(无序):插入操作 O(1) 删除操作 O(n)
  3. 单链表:        插入操作 O(1)(往表头插) 删除操作 O(n)
  4. 二叉查找树: 插入操作 O(logn) 删除操作 O(logn)
  5. 堆 ---- 同二叉查找树 (但二叉查找树对于删除操作来说,因为总是删除左子树,会造成树的不平衡)

综上所述,选择最小堆来实现优先级队列


实现代码:

设数组A[0---n-1]满足堆性质

设Maxsize为队列的最大元素数

void siftup(int A[],int i,int x);

void siftdown(int A[],int i,int n);

1)插入操作:

/*pre:  A[0---n-1]满足堆性质post:插入元素t,使得A[0--n-1,n]同样满足堆性质*/void insert(int A[],int &n,int t){    if(n>=Maxsize)        return;    n++;    A[n-1] = t;    siftup(A,n-1,t);}

2) 删除操作

/*pre:  A[0---n-1]满足堆性质post:删除最小值*/int extractmin(int A[],int &n){    if(n<1)        return ERROR;    int temp = A[0];    swap(A[0],A[n-1]);    n--;    siftdown(A,0,n);    return temp;}

 

 

 

转载于:https://www.cnblogs.com/welsh-android-learning/p/3516370.html

你可能感兴趣的文章
python协程的使用
查看>>
Android GIS开发系列-- 入门季(4) GraphicsLayer的点击查询要素
查看>>
Python 基础 - 4.5 sys 模块
查看>>
解决scalac Error: bad option -make:transitive
查看>>
yarn 查看任务信息
查看>>
C#在SharePoint文档库下动态新增文件夹
查看>>
uva 10118
查看>>
Oracle基础学习三之数据操作及伪列
查看>>
【规范】javascript 变量命名规则
查看>>
Algorithms
查看>>
老李推荐:第14章6节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-装备ViewServer-启动ViewServer...
查看>>
《面对对象分析与设计》书摘
查看>>
VC2010MFC下的ArcEngine开发(一)
查看>>
Android Studio 1.0.2 设置内存大小
查看>>
捕获与异常
查看>>
数据适配 DataAdapter对象
查看>>
有序列表ol和定义列表dl,dt,dd
查看>>
联想小新Air 15 安装黑苹果macOS High Sierra 10.13.6过程
查看>>
公共POI导出Excel方法–java
查看>>
次短路——Dijkstra
查看>>