问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
你好,欢迎来到懂视!登录注册
当前位置: 首页 - 正文

优先级队列的实例

发布网友 发布时间:2022-05-11 03:09

我来回答

2个回答

热心网友 时间:2022-05-11 04:39

有限的元素集合,每个元素都有一个优先权
操作
Create ( ):创建一个空的优先队列
Size ( ):返回队列中的元素数目
Max ( ):返回具有最大优先权的元素
I n s e rt (x):将x插入队列
DeleteMax (x):从队列中删除具有最大优先权的元素,并将该元素返回至x
}
优先队列插入元素的复杂度都是O(lgn),删除元素的复杂度是O(1),所以很快。
另一种描述方法是采用有序线性表,当元素按递增次序排列,使用链表时则按递减次序排列,这两种描述方法的删除时间均为( 1 ),插入操作所需时间为(n).
例:
假设我们对机器服务进行收费.每个用户每次使用机器所付费用都是相同的,但每个
用户所需要服务时间都不同.为获得最大利润,假设只要有用户机器就不会空闲,我们可以把
等待使用该机器的用户组织成一个最小优先队列,优先权即为用户所需服务时间.当一个新的
用户需要使用机器时,将他/她的请求加入优先队列.一旦机器可用,则为需要最少服务时间
(即具有最高优先权)的用户提供服务.
如果每个用户所需时间相同,但用户愿意支付的费用不同,则可以用支付费用作为优先权,
一旦机器可用,所交费用最多的用户可最先得到服务,这时就要选择最大优先队列.
下面是数组实现的二叉堆,其中MAX_SIZE是数组的最大长度;ElementType是其中元素的类型;Priority(x: ElementType) 是一个函数,返回值是元素x的优先级,当然也可以用一个Priority数组来保存每个元素的优先级(在这个打字员问题中就应该用一个数组来保存每个元素的优先级,在这个问题中优先级就是从初始密码转换到该密码所需的操作的数目)。
type
PriorityQueue = record
contents: array [1..MAX_SIZE]of ElementType;
last : integer;
end;
{ 将一个优先队列变空 }
procere MakeNull(var A: PriorityQueue);
begin
A.last := 0;
end;
{ 向优先队列A中插入一个元素x }
procere Insert(x: ElementType; var A: PriorityQueue);
var
i: integer;
temp:ElementType;
begin
if A.last = MAX_SIZE then
Error('Priority Queue is full.')
else begin
A.last := A.last + 1;
A.contents[A.last] := x;
i := A.last;
while (i > 1) and ( Priority(A.contents) < Priority(A.contents[i div 2]) do
begin
temp := A.contents;
A.contents:= A.contents[i div 2];
A.contents[i div 2] := temp;
i := i div 2;
end; { end of while }
end; { end of else }
end; { end of Insert }
{ 删除优先队列对头的那个优先级最小的元素,并将其值返回 }
function DeleteMin(var A: PriorityQueue): ElementType;
var
minimun : ElementType;
i : integer;
begin
if A.last = 0 then
Error('Priority Queue is empty. ')
else begin
minimun := A.contents[1];
A.contents[1] := A.contents[A.last];
A.last := A.last - 1;
i := 1;
while i < (A.last div 2) do
begin
if (Priority(A.contents[2*i]) < Priority(A.contents[2*i+1])) or (2*i = A.last)
then j := 2*i;
else j := 2*i + 1;
{ j节点是i节点具有较高优先级的儿子,当i节点只有一个儿子的时候,j节点是i节点的唯一儿子 }
if Priority(A.contents) > Priority(A.contents[j]) then
begin
temp := A.contents;
A.contents:= A.contents[j];
A.contents[j] := temp;
i := j;
end
else begin { 不能再向下推了 }
DeleteMin := minimum;
exit;
end;
end; { end of while }
{ 这时已经到达叶结点 }
DeleteMin := minimum;
exit;
end; { end of else }
end; { end of DeleteMin }
//二叉堆就是优先队列,hehe(父节点大于子节点)
使用无序数组实现优先级队列(c++)
#include <iostream>
#include <vector>   class UnorderedArrayQuene  {  public:  UnorderedArrayQuene();  void Push(int value);  int DeleteMaxElement();  bool isEmpty();  protected:  bool less(int i, int j);  void exchange(int i, int j);   protected:  std::vector<int> m_Array;  int N; // number of elements  };   UnorderedArrayQuene::UnorderedArrayQuene()  :N(0)  {  }  void UnorderedArrayQuene::Push(int value)  {  m_Array.push_back(value);  N++;  }   bool UnorderedArrayQuene::less(int i, int j)   {  return m_Array[i]<m_Array[j];  }  void UnorderedArrayQuene::exchange(int i, int j)   {  int swap = m_Array[i];  m_Array[i] = m_Array[j];  m_Array[j] = swap;  }  int UnorderedArrayQuene::DeleteMaxElement()    {  int max = 0;  for (int i = 1; i < N; i++)  if (less(max, i)) max = i;  exchange(max, N-1);  return m_Array[--N];  }    bool UnorderedArrayQuene::isEmpty()  {  return N == 0;   }    int main()  {  UnorderedArrayQuene Q;  Q.Push(6);  Q.Push(9);  Q.Push(8);  Q.Push(2);    while(!Q.isEmpty())  {  std::cout<<Q.DeleteMaxElement()<<,;  }  system(pause);  return 0;  }

声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:11247931@qq.com
诗句,朗读节奏划分的诀窍 有哪位心理学大神详细解释下知觉行为控制。? 计划生育证明格式(推荐7篇) 玫红色英语缩写 江宁附近的老镇有哪些 快手是什么公司开发的? 香菇洋葱猪肉馅饺子 浪漫感人爱情誓言短句 爱的誓言经典语句精选82句 特别甜特别撩人的情话情人节浪漫爱情句子短句(80句) 我的IP地址怎么会自己变化? 新股申购起始配号为:33035069 配号个数9,这是什么意思?怎么理解呢 外墙涂料沾瓷砖上怎么清洗 去年考主管护师没过 今年能用去年的书么 3.08升等于多少毫升 1ooooo毫升是几升 每周五的中国好声音是直播吗 微信红包没领 我把聊天记录删除了 我在其他设备登录 能不能领到红包 昨天下午我做了一个梦 就是你家后面不是有个很高的山吗,我梦见哪里有一座寺庙 金碧辉煌 ,发出金色的光芒 请问梦见一座寺庙正在起代表什么 很大的样子...有人告诉我听是因为倒塌了然后需要重建 小米4升级开发版后怎么恢复出厂设置 空间主页上的字怎么加粗,加下划线 网站内部锚文本加粗加颜色好吗?@ 博客文章中的字体加粗加黑有什么好处? 特别粗体文字 有哪几种? 我国横跨五个时区统一采用北京所在的什么的时间称为标准 现在北京标准时间 为什么以北京时间为标准? 北京的时间是全中国的标准时间吗 用易语言怎样将源码编译成exe文件,我有源码,编译出来的是dll文件 别人做好的易语言编写的源码 我拿来怎么修改, 57岁出柜是什么意思 女同志57岁身高167厘米,体重70公斤胖吗 同志们第57题为什么不能用洛必达法则解? 同志的比率是多少? 求助,我是不是gay呢? 什么是同志?如是同志在中国应如何生活最好? 关于同性恋问题 (最佳答案再加20分) gay。找份感情很难,廉价否,不知道! 甘油、凡士林是什么? 找黑白花纹矢量图,求黑白花边矢量图 怎么做黑白格的矢量图 如何用photoshop把这个图片处理成黑白矢量图 怎么把相片处理成黑白矢量图 Illustrator 怎么把一个用图案填充的形状,转化成矢量图? 优先级队列是一种什么样的数据结构 Adobe illustrator转黑白矢量图之后,图块的颜色是“?”色(显示的是白色) coreldrawX4里面做的矢量图存成低版本的,用9打开后,彩色矢量图变成了黑白矢量图,急啊!!! 螺旋测微器,表盘式游标卡尺怎么使用?最好结合图像说明。 同一种老姜,生老姜和用柴碳烤熟的老姜有什么区别吗? 热水泡姜和煮姜区别
  • 焦点

最新推荐

猜你喜欢

热门推荐