priorityqueue(优先级队列的实例)

2025-03-08 17:50:02 0

priorityqueue(优先级队列的实例)

本文目录

优先级队列的实例

有限的元素集合,每个元素都有一个优先权操作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数组来保存每个元素的优先级(在这个打字员问题中就应该用一个数组来保存每个元素的优先级,在这个问题中优先级就是从初始密码转换到该密码所需的操作的数目)。typePriorityQueue = recordcontents: array ;  }    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;  }

如何使用queue

Queue接口与List、Set同一级别,都是继承了Collection接口。LinkedList实现了Queue接 口。Queue接口窄化了对LinkedList的方法的访问权限(即在方法中的参数类型如果是Queue时,就完全只能访问Queue接口所定义的方法 了,而不能直接访问 LinkedList的非Queue的方法),以使得只有恰当的方法才可以使用。BlockingQueue 继承了Queue接口。 队列是一种数据结构.它有两个基本操作:在队列尾部加人一个元素,和从队列头部移除一个元素就是说,队列以一种先进先出的方式管理数据,如果你试图向一个 已经满了的阻塞队列中添加一个元素或者是从一个空的阻塞队列中移除一个元索,将导致线程阻塞.在多线程进行合作时,阻塞队列是很有用的工具。工作者线程可 以定期地把中间结果存到阻塞队列中而其他工作者线线程把中间结果取出并在将来修改它们。队列会自动平衡负载。如果第一个线程集运行得比第二个慢,则第二个 线程集在等待结果时就会阻塞。如果第一个线程集运行得快,那么它将等待第二个线程集赶上来。下表显示了jdk1.5中的阻塞队列的操作: add 增加一个元索 如果队列已满,则抛出一个IIIegaISlabEepeplian异常remove 移除并返回队列头部的元素 如果队列为空,则抛出一个NoSuchElementException异常element 返回队列头部的元素 如果队列为空,则抛出一个NoSuchElementException异常offer 添加一个元素并返回true 如果队列已满,则返回falsepoll 移除并返问队列头部的元素 如果队列为空,则返回nullpeek 返回队列头部的元素 如果队列为空,则返回nullput 添加一个元素 如果队列满,则阻塞take 移除并返回队列头部的元素 如果队列为空,则阻塞 remove、element、offer 、poll、peek 其实是属于Queue接口。 阻塞队列的操作可以根据它们的响应方式分为以下三类:aad、removee和element操作在你试图为一个已满的队列增加元素或从空队列取得元素时 抛出异常。当然,在多线程程序中,队列在任何时间都可能变成满的或空的,所以你可能想使用offer、poll、peek方法。这些方法在无法完成任务时 只是给出一个出错示而不会抛出异常。 注意:poll和peek方法出错进返回null。因此,向队列中插入null值是不合法的。 还有带超时的offer和poll方法变种,例如,下面的调用:boolean success = q.offer(x,100,TimeUnit.MILLISECONDS);尝试在100毫秒内向队列尾部插入一个元素。如果成功,立即返回true;否则,当到达超时进,返回false。同样地,调用:Object head = q.poll(100, TimeUnit.MILLISECONDS);如果在100毫秒内成功地移除了队列头元素,则立即返回头元素;否则在到达超时时,返回null。 最后,我们有阻塞操作put和take。put方法在队列满时阻塞,take方法在队列空时阻塞。 java.ulil.concurrent包提供了阻塞队列的4个变种。默认情况下,LinkedBlockingQueue的容量是没有上限的(说的不准确,在不指定时容量为Integer.MAX_VALUE,不要然的话在put时怎么会受阻呢),但是也可以选择指定其最大容量,它是基于链表的队列,此队列按 FIFO(先进先出)排序元素。ArrayBlockingQueue在构造时需要指定容量, 并可以选择是否需要公平性,如果公平参数被设置true,等待时间最长的线程会优先得到处理(其实就是通过将ReentrantLock设置为true来 达到这种公平性的:即等待时间最长的线程会先操作)。通常,公平性会使你在性能上付出代价,只有在的确非常需要的时候再使用它。它是基于数组的阻塞循环队 列,此队列按 FIFO(先进先出)原则对元素进行排序。PriorityBlockingQueue是一个带优先级的 队列,而不是先进先出队列。元素按优先级顺序被移除,该队列也没有上限(看了一下源码,PriorityBlockingQueue是对 PriorityQueue的再次包装,是基于堆数据结构的,而PriorityQueue是没有容量限制的,与ArrayList一样,所以在优先阻塞 队列上put时是不会受阻的。虽然此队列逻辑上是无界的,但是由于资源被耗尽,所以试图执行添加操作可能会导致 OutOfMemoryError),但是如果队列为空,那么取元素的操作take就会阻塞,所以它的检索操作take是受阻的。另外,往入该队列中的元 素要具有比较能力。最后,DelayQueue(基于PriorityQueue来实现的)是一个存放Delayed 元素的无界阻塞队列,只有在延迟期满时才能从中提取元素。该队列的头部是延迟期满后保存时间最长的 Delayed 元素。如果延迟都还没有期满,则队列没有头部,并且poll将返回null。当一个元素的 getDelay(TimeUnit.NANOSECONDS) 方法返回一个小于或等于零的值时,则出现期满,poll就以移除这个元素了。此队列不允许使用 null 元素。 下面是延迟接口:Java代码public interface Delayed extends Comparable《Delayed》 { long getDelay(TimeUnit unit); } 放入DelayQueue的元素还将要实现compareTo方法,DelayQueue使用这个来为元素排序。 下面的实例展示了如何使用阻塞队列来控制线程集。程序在一个目录及它的所有子目录下搜索所有文件,打印出包含指定关键字的文件列表。从下面实例可以看出,使用阻塞队列两个显著的好处就是:多线程操作共同的队列时不需要额外的同步,另外就是队列会自动平衡负载,即那边(生产与消费两边)处理快了就会被阻塞掉,从而减少两边的处理速度差距。下面是具体实现:Java代码public class BlockingQueueTest { public static void main(String args) { Scanner in = new Scanner(System.in); System.out.print(“Enter base directory (e.g. /usr/local/jdk5.0/src): “); String directory = in.nextLine(); System.out.print(“Enter keyword (e.g. volatile): “); String keyword = in.nextLine(); final int FILE_QUEUE_SIZE = 10;// 阻塞队列大小 final int SEARCH_THREADS = 100;// 关键字搜索线程个数 // 基于ArrayBlockingQueue的阻塞队列 BlockingQueue《File》 queue = new ArrayBlockingQueue《File》( FILE_QUEUE_SIZE); //只启动一个线程来搜索目录 FileEnumerationTask enumerator = new FileEnumerationTask(queue, new File(directory)); new Thread(enumerator).start(); //启动100个线程用来在文件中搜索指定的关键字 for (int i = 1; i 《= SEARCH_THREADS; i++) new Thread(new SearchTask(queue, keyword)).start(); } } class FileEnumerationTask implements Runnable { //哑元文件对象,放在阻塞队列最后,用来标示文件已被遍历完 public static File DUMMY = new File(““); private BlockingQueue《File》 queue; private File startingDirectory; public FileEnumerationTask(BlockingQueue《File》 queue, File startingDirectory) { this.queue = queue; this.startingDirectory = startingDirectory; } public void run() { try { enumerate(startingDirectory); queue.put(DUMMY);//执行到这里说明指定的目录下文件已被遍历完 } catch (InterruptedException e) { } } // 将指定目录下的所有文件以File对象的形式放入阻塞队列中 public void enumerate(File directory) throws InterruptedException { File files = directory.listFiles(); for (File file : files) { if (file.isDirectory()) enumerate(file); else //将元素放入队尾,如果队列满,则阻塞 queue.put(file); } } } class SearchTask implements Runnable { private BlockingQueue《File》 queue; private String keyword; public SearchTask(BlockingQueue《File》 queue, String keyword) { this.queue = queue; this.keyword = keyword; } public void run() { try { boolean done = false; while (!done) { //取出队首元素,如果队列为空,则阻塞 File file = queue.take(); if (file == FileEnumerationTask.DUMMY) { //取出来后重新放入,好让其他线程读到它时也很快的结束 queue.put(file); done = true; } else search(file); } } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { } } public void search(File file) throws IOException { Scanner in = new Scanner(new FileInputStream(file)); int lineNumber = 0; while (in.hasNextLine()) { lineNumber++; String line = in.nextLine(); if (line.contains(keyword)) System.out.printf(“%s:%d:%s%n“, file.getPath(), lineNumber, line); } in.close(); } }

PriorityQueue使用求助

从大到小:priority_queue: 默认9 6 5 3 2由小到大:priority_queue《int, vector《int》, greater《int》 》2 3 5 6 9;由大到小:struct node{ friend bool operator《 (node n1, node n2) { return n1.priority 《 n2.priority; } int priority; int value;};9 6 5 3 2priority_queue《int》 que;que.push();que.top();que.pop();); printf(“采用默认优先关系:\n(priority_queue《int》que;)\n“); printf(“Queue 0:\n“); while(!que.empty()) { printf(“%3d“,que.top()); que.pop(); } puts(““); puts(““); printf(“采用结构体自定义优先级方式一:\n(priority_queue《int,vector《int》,cmp》que;)\n“); printf(“Queue 1:\n“); while(!que1.empty()) { printf(“%3d“,que1.top()); que1.pop(); } puts(““); printf(“Queue 2:\n“); while(!que2.empty()) { printf(“%3d“,que2.top()); que2.pop(); } puts(““); puts(““); printf(“采用头文件\“functional\“内定义优先级:\n(priority_queue《int, vector《int》,greater《int》/less《int》 》que;)\n“); printf(“Queue 3:\n“); while(!que3.empty()) { printf(“%3d“,que3.top()); que3.pop(); } puts(““); printf(“Queue 4 :\n“); while(!que4.empty()) { printf(“%3d“,que4.top()); que4.pop(); } puts(““); puts(““); printf(“采用结构体自定义优先级方式二:\n(priority_queue《number》que)\n“); printf(“Queue 5:\n“); while(!que5.empty()) { printf(“%3d“,que5.top()); que5.pop(); } puts(““); printf(“Queue 6:\n“); while(!que6.empty()) { printf(“%3d“,que6.top()); que6.pop(); } system(“pause“); return 0; }

priorityqueue(优先级队列的实例)

本文编辑:admin
队列实例 ,priorityqueue

本文相关文章:


messagequeue(什么是消息队列)

messagequeue(什么是消息队列)

本文目录什么是消息队列android messagequeue 什么时候生成的什么是消息队列MSMQ. 这是微软的产品里唯一被认为有价值的东西。对我的客户来说,如果MSMQ能证明可以应对这种任务,他们将选择使用它。关键是这个东西并不复杂,除

2025年2月24日 13:10

数据结构中队列的特点是什么?什么是队列

数据结构中队列的特点是什么?什么是队列

本文目录数据结构中队列的特点是什么什么是队列队列什么意思队列训练的目的和意义C语言中,队列是什么意思,有什么用途中国人民解放军队列条令的介绍数据结构中队列的特点是什么数据结构中,队列的特点是先进先出。队列是一种特殊的线性表,特殊之处在于它只

2025年2月11日 15:30

更多文章:


六种常见函数的定义域是什么?函数的定义域怎么表示

六种常见函数的定义域是什么?函数的定义域怎么表示

本文目录六种常见函数的定义域是什么函数的定义域怎么表示求函数定义域方法函数的定义域是什么求函数定义域的例题及步骤关于已知定义域,求另一个定义域,我总是搞不清求例题解释高中文科数学求解函数定义域,解析式的例题及解析急!!求函数值域定义域的训练

2025年2月18日 11:50

OR是什么意思?求:以i为开头的英文单词,3Q啦

OR是什么意思?求:以i为开头的英文单词,3Q啦

本文目录OR是什么意思求:以i为开头的英文单词,3Q啦求解怎么写 management report, 大学第一个assessment,根据一个case study写一个篇幅2000的reportC++ constructors not a

2025年3月5日 05:10

阿根廷足球为什么越来越差?阿根廷是个怎样的国家

阿根廷足球为什么越来越差?阿根廷是个怎样的国家

本文目录阿根廷足球为什么越来越差阿根廷是个怎样的国家阿根廷与中国时差几个小时阿根廷时间跟中国时间相差多少阿根廷和中国时间会差多少阿根廷的时间和北京时间相差几小时阿根廷在哪,它的时间跟美国一样吗阿根廷足球为什么越来越差阿根廷队在全世界有一批忠

2025年2月27日 20:30

passing remark(make a passing remark 是什么意思passing如何解释)

passing remark(make a passing remark 是什么意思passing如何解释)

本文目录make a passing remark 是什么意思passing如何解释外贸Pass with Remark什么意思make a passing remark 是什么意思passing如何解释意思:顺便说一句;顺口溜passin

2025年3月1日 16:10

poly bridge(poly bridge怎么操作)

poly bridge(poly bridge怎么操作)

本文目录poly bridge怎么操作Poly Bridge怎么造桥 新手指南+全关卡玩法技巧图解poly bridge液压杆的“1”和“2”什么意思poly bridge怎么设置中文POLY BRIDGE分辨率太低,导致调不回来怎么办Po

2025年2月11日 17:40

underlying什么意思(underlying是什么意思)

underlying什么意思(underlying是什么意思)

本文目录underlying是什么意思Underlying 是什么意思啊Underlying 是什么意思嘛什么是UnderlyingUnderlying是什么意思Underlying 是什么意思underlying是什么意思underlyi

2025年3月1日 08:10

asp是什么软件工具(ASP是什么工具软件,难学吗)

asp是什么软件工具(ASP是什么工具软件,难学吗)

本文目录ASP是什么工具软件,难学吗请问asp高手,asp到底是什么ASP是什么工具软件,难学吗asp是一种技术。 asp以vbscript为默认的角本语言,但是我们可以使用(有些需要额外添加)jscript、perl。。。等等相当丰富的其

2025年4月5日 10:00

android项目(近期Android端启动的Firefox Preview项目有啥新区别)

android项目(近期Android端启动的Firefox Preview项目有啥新区别)

本文目录近期Android端启动的Firefox Preview项目有啥新区别可在PC上运行Android 10的AndEX 10项目,新版中带来了哪些变化Razer众筹成功的OUYA安卓游戏机项目,现在发展得怎么样如何导入一个androi

2025年2月14日 02:50

Div有什么属性?different怎么读

Div有什么属性?different怎么读

本文目录Div有什么属性different怎么读css设置div整体居中Div有什么属性Div的一些基本属性left 相对于窗口左边的位置 top 相对于窗口上边的位置 width DIV tag 的宽度。所有在 DIV 里的文字或html

2025年2月16日 13:30

excelhome论坛之家(谁有excel论坛网址)

excelhome论坛之家(谁有excel论坛网址)

本文目录谁有excel论坛网址怎么进入excel home论坛哪有很好的学Excel的论坛excel论坛之家如何注册账号Excel 的最好的论坛是哪个 谁有excel论坛网址最为精彩和经典的是那面这个EXCEL论坛,在这里可以成为高手的。h

2025年2月22日 21:10

duck不必(duck不必下一句)

duck不必(duck不必下一句)

本文目录duck不必下一句女生对你说duck不必一天,一只鸭子对一只小鸡表白,鸭子:我喜欢你,小鸡:你duck不必,鸭子:没想到你深藏blueduck不必是什么意思duck不必是什么梗啥意思duck不必的意思duck不必和book思议是什么

2025年3月8日 10:20

centos教程(centos7安装教程)

centos教程(centos7安装教程)

本文目录centos7安装教程怎样安装Centos系统如何网络安装系统centos 7腾讯云centos如何搭建centos怎么安装中文centos 6.6系统字符化安装详细的图文教程win7 64下安装centos7时怎么手动分区教程,求

2025年3月19日 02:00

字节跳动公司怎么样(字节跳动和阿里巴巴,哪个公司福利待遇更好有没有在职的说说)

字节跳动公司怎么样(字节跳动和阿里巴巴,哪个公司福利待遇更好有没有在职的说说)

本文目录字节跳动和阿里巴巴,哪个公司福利待遇更好有没有在职的说说字节跳动上海公司工作怎么样为什么字节跳动发展那么成功济南字节跳动公司怎么样在字节跳动工作的感受如何字节跳动能长久干下去嘛字节跳动和阿里巴巴,哪个公司福利待遇更好有没有在职的说说

2025年2月10日 00:20

java9下载(想要java软件安装包,有哪位朋友有吗)

java9下载(想要java软件安装包,有哪位朋友有吗)

本文目录想要java软件安装包,有哪位朋友有吗java9怎样设置环境变量Java在哪下载想要java软件安装包,有哪位朋友有吗软件介绍java se development kit 9 64位,简称为java9 64位,是由oracle公司

2025年3月13日 06:50

立即关机命令shutdown(win10关机命令shutdown)

立即关机命令shutdown(win10关机命令shutdown)

本文目录win10关机命令shutdownshutdown的瞬间关机命令Windows 的立即关机命令式是什么win10关机命令shutdown步骤一、键盘按键(WIN+R)打开运行窗口;或者点击左下角图标搜索“运行”步骤二、在运行窗口中粘

2025年2月21日 21:10

troubled(troubled, disturbed, confused, puzzled的选择问题)

troubled(troubled, disturbed, confused, puzzled的选择问题)

本文目录troubled, disturbed, confused, puzzled的选择问题trouble怎么用troubled, disturbed, confused, puzzled的选择问题这是根据意思来的,troubled是遇到

2025年3月21日 07:20

办公室excel表格自学(Excel初学者如何才能快速掌握工作薄的使用方法)

办公室excel表格自学(Excel初学者如何才能快速掌握工作薄的使用方法)

本文目录Excel初学者如何才能快速掌握工作薄的使用方法EXCEL学习的顺序是什么自学Excel、PPT、word先学哪个如何学习excel函数Excel初学者如何才能快速掌握工作薄的使用方法诚邀!要掌握Excel工作簿的使用,首先要明确工

2025年3月15日 19:50

webrtc 视频会议(哪个公司可以用webrtc实现视频通话)

webrtc 视频会议(哪个公司可以用webrtc实现视频通话)

本文目录哪个公司可以用webrtc实现视频通话ios webrtc显示本地流android集成WebRTC,怎么实现音视频通话功能哪个公司可以用webrtc实现视频通话zego即构科技可以用webrtc实现视频通话啊,他们支持webrtc接

2025年3月29日 07:50

VC++怎么入门?怎样学vc++

VC++怎么入门?怎样学vc++

本文目录VC++怎么入门怎样学vc++如何使用vcVC++怎么入门按照楼上兄弟的说法!可能学了n年还没开始学 VC 吧!在你的心中VC就是那么难的吗!怎么说我也是学VC的,虽然不敢说很厉害,但是自觉对VC还是挺有心得的。学VC最主要的首先要

2025年2月13日 01:30

如何制作微信小程序(看到微信小程序制作大赛小程序要怎么做呢)

如何制作微信小程序(看到微信小程序制作大赛小程序要怎么做呢)

本文目录看到微信小程序制作大赛小程序要怎么做呢小程序店铺怎么制作商家怎样用微信小程序开店怎么做微信开店的小程序微信小程序怎么做店铺怎么开小程序店铺我想制作微信小程序卖货,怎么操作求指教微信小程序如何开店铺微信开店详细流程怎么才能在微信小程序

2025年3月1日 11:50

近期文章

本站热文

harbor,port,pier的区别?谁能解释“harbour“(港口)与“pier“(码头)的区别
2025-02-22 17:40:03 浏览:18
ibatis foreach(ibatis 批量update操作)
2025-02-10 23:40:06 浏览:7
endless rain(endless rain表达什么情感)
2025-02-14 06:00:02 浏览:6
标签列表

热门搜索