×

priorityqueue 队列 实例

priorityqueue(优先级队列的实例)

admin admin 发表于2023-08-20 20:16:53 浏览52 评论0

抢沙发发表评论

本文目录

优先级队列的实例

有限的元素集合,每个元素都有一个优先权操作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;  }

java priorityqueue 哪些方法

1.下表显示了jdk1.5中的阻塞队列的操作:add 增加一个元索 如果队列已满,则抛出一个IIIegaISlabEepeplian异常remove 移除并返回队列头部的元素 如果队列为空,则抛出一个NoSuchElementException异常element 返回队列头部的元素 如果队列为空,则抛出一个NoSuchElementException异常offer 添加一个元素并返回true 如果队列已满,则返回falsepoll 移除并返问队列头部的元素 如果队列为空,则返回nullpeek 返回队列头部的元素 如果队列为空,则返回nullput 添加一个元素 如果队列满,则阻塞take 移除并返回队列头部的元素 如果队列为空,则阻塞remove、element、offer 、poll、peek 其实是属于Queue接口。 2.阻塞队列的操作可以根据它们的响应方式分为以下三类:aad、removee和element操作在你试图为一个已满的队列增加元素或从空队列取得元素时 抛出异常。当然,在多线程程序中,队列在任何时间都可能变成满的或空的,所以你可能想使用offer、poll、peek方法。这些方法在无法完成任务时 只是给出一个出错示而不会抛出异常。注意:poll和peek方法出错进返回null。因此,向队列中插入null值是不合法的。3.还有带超时的offer和poll方法变种,例如,下面的调用:boolean success = q.offer(x,100,TimeUnit.MILLISECONDS);尝试在100毫秒内向队列尾部插入一个元素。如果成功,立即返回true;否则,当到达超时进,返回false。同样地,调用:Object head = q.poll(100, TimeUnit.MILLISECONDS);如果在100毫秒内成功地移除了队列头元素,则立即返回头元素;否则在到达超时时,返回null。4.最后,我们有阻塞操作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是受阻的。另外,往入该队列中的元 素要具有比较能力。