Java 中队列和优先队列的使用

Java【优先级队列】详细图解 / 模拟实现 + 【PriorityQueue】常用方法介绍 优先级队列并不是像普通普通的队列那样永远遵从先进先出, 而是有优先级的, 出队时让优先级高的先出队上篇文章说过, 二叉树是一种逻辑结构, 物理结构上可以是顺序存储, 也可以是链式存储, 而堆就是在顺序存储的二叉树上做了调整PriorityQueue底层使用了堆这种数据结构堆的概念: 如果有一个关键码的集合K = {k0,k1, k2,…,kn-1},把它的所有元素按完全二叉树的顺序存储方式存储 在一个一维数组中,并满足:Ki 阅读详情

     

队列的使用(点击打开链接)

今天跟大家来看看如何在项目中使用队列。首先我们要知道使用队列的目的是什么?一般情况下,如果是一些及时消息的处理,并且处理时间很短的情况下是不需要使用队列的,直接阻塞式的方法调用就可以了。但是,如果在消息处理的时候特别费时间,这个时候如果有新的消息来了,就只能处于阻塞状态,造成用户等待。这个时候在项目中引入队列是十分有必要的。当我们接受到消息后,先把消息放到队列中,然后再用新的线程进行处理,这个时候就不会有消息的阻塞了。下面就跟大家介绍两种队列的使用,一种是基于内存的,一种是基于数据库的。

     首先,我们来看看基于内存的队列。在Java的并发包中已经提供了BlockingQueue的实现,比较常用的有ArrayBlockingQueue和LinkedBlockingQueue,前者是以数组的形式存储,后者是以Node节点的链表形式存储。至于数组和链表的区别这里就不多说了。

BlockingQueue 队列常用的操作方法:

      1.往队列中添加元素: add(), put(), offer()

      2.从队列中取出或者删除元素: remove() element()  peek()   poll()  take()

每个方法的说明如下:

      offer()方法往队列添加元素如果队列已满直接返回false,队列未满则直接插入并返回true;

      add()方法是对offer()方法的简单封装.如果队列已满,抛出异常new IllegalStateException("Queue full");

       put()方法往队列里插入元素,如果队列已经满,则会一直等待直到队列为空插入新元素,或者线程被中断抛出异常.

       remove()方法直接删除队头的元素:

       peek()方法直接取出队头的元素,并不删除.

       element()方法对peek方法进行简单封装,如果队头元素存在则取出并不删除,如果不存在抛出异常NoSuchElementException()

       poll()方法取出并删除队头的元素,当队列为空,返回null;

       take()方法取出并删除队头的元素,当队列为空,则会一直等待直到队列有新元素可以取出,或者线程被中断抛出异常

offer()方法一般跟poll()方法相对应, put()方法一般跟take()方法相对应.日常开发过程中offer()与poll()方法用的相对比较频繁.

下面用一个例子来看看是怎么使用的。

[java]  view plain  copy
  1. import java.util.concurrent.BlockingQueue;  
  2. import java.util.concurrent.Executors;  
  3. import java.util.concurrent.LinkedBlockingQueue;  
  4. import java.util.concurrent.ScheduledExecutorService;  
  5. import java.util.concurrent.TimeUnit;  
  6.   
  7. public class UserTask {  
  8.     //队列大小  
  9.     private final int QUEUE_LENGTH = 10000*10;  
  10.     //基于内存的阻塞队列  
  11.     private BlockingQueue<String> queue = new LinkedBlockingQueue<String>(QUEUE_LENGTH);  
  12.     //创建计划任务执行器  
  13.     private ScheduledExecutorService es = Executors.newScheduledThreadPool(1);  
  14.   
  15.     /** 
  16.      * 构造函数,执行execute方法 
  17.      */  
  18.     public UserTask() {  
  19.         execute();  
  20.     }  
  21.       
  22.     /** 
  23.      * 添加信息至队列中 
  24.      * @param content 
  25.      */  
  26.     public void addQueue(String content) {  
  27.         queue.add(content);  
  28.     }  
  29.       
  30.     /** 
  31.      * 初始化执行 
  32.      */  
  33.     public void execute() {  
  34.         //每一分钟执行一次  
  35.         es.scheduleWithFixedDelay(new Runnable(){  
  36.             public void run() {  
  37.                 try {  
  38.                     String content = queue.take();  
  39.                     //处理队列中的信息。。。。。  
  40.                     System.out.println(content);  
  41.                 } catch (InterruptedException e) {  
  42.                     e.printStackTrace();  
  43.                 }  
  44.             }  
  45.               
  46.         }, 0, 1, TimeUnit.MINUTES);  
  47.     }  
  48. }  
 
        以上呢,就是基于内存的队列的介绍,基于内存的队列,队列的大小依赖于JVM内存的大小,一般如果是内存占用不大且处理相对较为及时的都可以采用此种方法。如果你在队列处理的时候需要有失败重试机制,那么用此种队列就不是特别合适了。下面就说说基于数据库的队列。

       基于数据库的队列,很好理解,就是接收到消息之后,把消息存入数据库中,设置消费时间、重试次数等,再用新的线程从数据库中读取信息,进行处理。首先来看看数据库的设计。

字段
类型
说明
queue_id
bigint
队列ID,唯一标识
create_time
bigint
创建时间
type
int
业务类型
status
int
处理状态位 : 1:有效可处理(active) 3:临时被占用 (locked) 5:处理完毕 标记删除(deleted)
consume_status
int
消费状态:1:未消费  2:消费成功 3:消费失败,等待下次消费 4:作废
update_time
bigint
更新时间
locker
varchar
占用标签
last_consume_time
bigint
最后一次消费时间
next_consume_time
bigint
可消费开始时间
consume_count
int
消费次数
json_data
text
数据信息 json格式


代码示例如下:

[java]  view plain  copy
  1. /** 
  2.      * 批量获取 可以消费的消息 
  3.      * 先使用一个时间戳将被消费的消息锁定,然后再使用这个时间戳去查询锁定的数据。 
  4.      * @param count 
  5.      * @return 
  6.      */  
  7.     public List<Queue> findActiveQueueNew(int count) {  
  8.         //先去更新数据  
  9.         String locker = String.valueOf(System.currentTimeMillis())+random.nextInt(10000);  
  10.         int lockCount = 0;  
  11.         try {  
  12.                         //将status为1的更新为3,设置locker,先锁定消息  
  13.             lockCount = queueDAO.updateActiveQueue(PayConstants.QUEUE_STATUS_LOCKED,  
  14.                     PayConstants.QUEUE_STATUS_ACTIVE, count, locker);  
  15.         } catch (Exception e) {  
  16.             logger.error(  
  17.                     "QueueDomainRepository.findActiveQueueNew error occured!"  
  18.                             + e.getMessage(), e);  
  19.             throw new TuanRuntimeException(  
  20.                     PayConstants.SERVICE_DATABASE_FALIURE,  
  21.                     "QueueDomainRepository.findActiveQueue error occured!", e);  
  22.         }  
  23.           
  24.         //如果锁定的数量为0,则无需再去查询  
  25.         if(lockCount == 0){  
  26.             return null;  
  27.         }  
  28.                   
  29.         //休息一会在再询,防止数据已经被更改  
  30.         try {  
  31.             Thread.sleep(1);  
  32.         } catch (Exception e) {  
  33.             logger.error("QueueDomainRepository.findActiveQueue error sleep occured!"  
  34.                     + e.getMessage(), e);  
  35.         }  
  36.         List<Queue> activeList = null;  
  37.         try {  
  38.             activeList = queueDAO.getByLocker(locker);  
  39.         } catch (Exception e) {  
  40.             logger.error("QueueDomainRepository.findActiveQueue error occured!"  
  41.                     + e.getMessage(), e);  
  42.             throw new TuanRuntimeException(  
  43.                     PayConstants.SERVICE_DATABASE_FALIURE,  
  44.                     "QueueDomainRepository.findActiveQueue error occured!",e);  
  45.         }  
  46.         return activeList;  
  47.     }  

获取到消息之后,还需要再判断消息是否合法,如是否达到最大消费次数,消息是否已被成功消费,等,判断代码如下:

[java]  view plain  copy
  1. /** 
  2.      * 验证队列modle 的合法性 
  3.      *  
  4.      * @param model 
  5.      * @return boolean true,消息还可以消费。false,消息不允许消费。 
  6.      */  
  7.     public boolean validateQueue(final QueueModel model){  
  8.         int consumeCount = model.getConsumeCount();  
  9.         if (consumeCount >= PayConstants.QUEUE_MAX_CONSUME_COUNT) {  
  10.             //消费次数超过了最大次数  
  11.             return false;  
  12.         }  
  13.         int consumeStatus = model.getConsumeStatus();  
  14.         if(consumeStatus == PayConstants.QUEUE_STATUS_CONSUMER_SUCCESS){  
  15.             //消息已经被成功消费  
  16.             return false;  
  17.         }  
  18.         QueueStatusEnum queueStatusEnum  = model.getQueueStatusEnum();  
  19.         if(queueStatusEnum == null || queueStatusEnum != QueueStatusEnum.LOCKED){  
  20.             //消息状态不正确  
  21.             return false;  
  22.         }  
  23.         String jsonData = model.getJsonData();  
  24.         if(StringUtils.isEmpty(jsonData)){  
  25.             //消息体为空  
  26.             return false;  
  27.         }  
  28.         return true;  
  29.     }  

消息处理完毕之后,根据消费结果修改数据库中的状态。

[java]  view plain  copy
  1. public void consume(boolean isDelete, Long consumeMinTime,  
  2.             String tradeNo,int consumeCount) {  
  3.         QueueDO queueDO  = new QueueDO();  
  4.         if (!isDelete) {  
  5.             //已经到了做大消费次数,消息作废 不再处理  
  6.             if (consumeCount >= PayConstants.QUEUE_MAX_CONSUME_COUNT) {  
  7.                 //达到最大消费次数的也设置为消费成功  
  8.                                 queueDO.setConsumeStatus(PayConstants.QUEUE_STATUS_CONSUMER_SUCCESS);  
  9.                 queueDO.setStatus(PayConstants.QUEUE_STATUS_CANCEL);  
  10.             } else {  
  11.                 queueDO.setConsumeStatus(PayConstants.QUEUE_STATUS_CONSUMER_FAILED);      
  12.                 //设置为可用状态等待下次继续发送  
  13.                 queueDO.setStatus(PayConstants.QUEUE_STATUS_ACTIVE);  
  14.             }  
  15.         } else {  
  16.             //第三方消费成功  
  17.             queueDO.setConsumeStatus(PayConstants.QUEUE_STATUS_CONSUMER_SUCCESS);  
  18.             queueDO.setStatus(PayConstants.QUEUE_STATUS_DELETED);  
  19.         }  
  20.         queueDO.setNextConsumeTime(consumeMinTime == null ? QueueRuleUtil  
  21.                 .getNextConsumeTime(consumeCount) : consumeMinTime);  
  22.         if (StringUtils.isNotBlank(tradeNo)) {  
  23.             queueDO.setTradeNo(tradeNo);  
  24.         }  
  25.         long now = System.currentTimeMillis();  
  26.         queueDO.setUpdateTime(now);  
  27.         queueDO.setLastConsumeTime(now);  
  28.         queueDO.setConsumeCount(consumeCount);  
  29.         queueDO.setQueueID(id);  
  30.         setQueueDOUpdate(queueDO);  
  31.     }  
下次消费时间的计算如下:根据消费次数计算,每次消费存在递增的时间间隔。

[java]  view plain  copy
  1. /** 
  2.  * 队列消费 开始时间 控制 
  3.  */  
  4. public class QueueRuleUtil {  
  5.       
  6.     public static long getNextConsumeTime(int consumeCount) {  
  7.         return getNextConsumeTime(consumeCount, 0);  
  8.     }  
  9.   
  10.     public static long getNextConsumeSecond(int consumeCount) {  
  11.         return getNextConsumeTime(consumeCount, 0);  
  12.     }  
  13.       
  14.     public static long getNextConsumeTime(int cousumeCount, int addInteval) {  
  15.         int secends = getNextConsumeSecond(cousumeCount,addInteval);  
  16.         return System.currentTimeMillis()+secends*1000;  
  17.     }  
  18.       
  19.     public static int getNextConsumeSecond(int cousumeCount, int addInteval) {  
  20.         if (cousumeCount == 1) {  
  21.             return  addInteval + 10;  
  22.         } else if (cousumeCount == 2) {  
  23.             return  addInteval + 60;  
  24.         } else if (cousumeCount == 3) {  
  25.             return  addInteval + 60 * 5;  
  26.         } else if (cousumeCount == 4) {  
  27.             return  addInteval + 60 * 15;  
  28.         } else if (cousumeCount == 5) {  
  29.             return addInteval + 60 * 60;  
  30.         } else if (cousumeCount == 6){  
  31.             return addInteval + 60 * 60 *2;  
  32.         } else if(cousumeCount == 7){  
  33.             return addInteval + 60 * 60 *5;  
  34.         } else {  
  35.             return addInteval + 60 * 60 * 10;  
  36.         }  
  37.     }  

除此之外,对于消费完成,等待删除的消息,可以将消息直接删除或者是进行备份。最好不要在该表中保留太多需要删除的消息,以免影响数据库的查询效率。

我们在处理消息的时候,首先对消息进行了锁定,设置了locker,如果系统出现异常的时候,也会产生消息一直处于被锁定的状态,此时可能还需要定期去修复被锁定的消息。

[java]  view plain  copy
  1. /** 
  2.      * 批量获取 可以消费的消息 
  3.      *  
  4.      * @param count 
  5.      * @return 
  6.      */  
  7.     public void repairQueueByStatus(int status) {  
  8.         List<QueueDO> activeList = null;  
  9.         try {  
  10.             Map<String,Object> params = new HashMap<String,Object>();  
  11.             params.put("status", status);  
  12.             //下次消费时间在当前时间3小时以内的消息  
  13.                         params.put("next_consume_time", System.currentTimeMillis()+3*60*1000);  
  14.             activeList =  queueDAO.findQueueByParams(params);  
  15.         } catch (Exception e) {  
  16.             logger.error("QueueDomainRepository.repairQueueByStatus find error occured!"  
  17.                     + e.getMessage(), e);  
  18.             throw new TuanRuntimeException(  
  19.                     PayConstants.SERVICE_DATABASE_FALIURE,  
  20.                     "QueueDomainRepository.findQueueByStatus error occured!",e);  
  21.         }  
  22.         if (activeList == null || activeList.size() == 0) {  
  23.             return ;  
  24.         }  
  25.         for (QueueDO temp : activeList) {  
  26.             try {  
  27.                 //status=1,可被消费  
  28.                                 queueDAO.update(temp.getQueueID(), PayConstants.QUEUE_STATUS_ACTIVE);  
  29.             } catch (Exception e) {  
  30.                 logger.error("QueueDomainRepository.repairQueueByStatus  update error occured!"  
  31.                         + e.getMessage(), e);  
  32.                 throw new TuanRuntimeException(  
  33.                         PayConstants.SERVICE_DATABASE_FALIURE,  
  34.                         "QueueDomainRepository.repairQueueByStatus update error occured!",e);  
  35.             }  
  36.               
  37.         }  
  38.          }  

以上就是对两种队列的简单说明。在使用基于数据库的队列的时候,其中还使用到了事件处理机制,这部分的内容,就下次的时候再去介绍。



优先队列的使用(点击打开链接)

我们知道优先队列其实内部实现就是一个堆的数据结构,java默认的是一个小跟堆,每次取出最小的元素,因为堆的性质他可以做到O(logn)级别的插入和删除操作。

我们知道堆的性质是有: 
1.堆中某个结点的值总是不大于(或不小于)其父结点的值; 
2.堆总是一棵完全二叉树。

将根结点最大的堆叫做大根堆,根结点最小的堆叫做小根堆。常见的堆有二叉堆、斐波那契堆等

插入:向堆中插入一个新元素;在数组的最末尾插入新结点。然后自下而上调整子结点与父结点:比较当前结点与父结点,不满足堆性质则交换,使得当前子树满足二叉堆的性质。时间复杂度为 O(logn)。

弹出:删除堆顶元素,再把堆存储的最后那个结点填在根结点处。再从上而下调整父结点与它的子结点。时间复杂度为 O(logn)。

删除:使该元素与堆尾元素交换,调整堆容量,再由原堆尾元素的当前位置自顶向下调整。时间复杂度为 O(logn)。

如果经常需要合并两个堆的操作,那么使用二项堆、斜堆、左偏树等数据结构会更好。 
可并堆支持合并操作,使得合并后的堆也能保持堆的性质。左偏树是可并堆的一种,保证左子树的深度大于右子树的深度,再用右子树与另一个堆合并。 
因此,堆支持查询最值、插入、删除操作。

堆排序,通过堆维护最值,对最值逐个弹出,使得得到的序列有序。 
下面看下一般的堆我们都直接用优先队列实现如下


import java.io.BufferedInputStream;
import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.Scanner;

class Dog
{
    public int x;
}
public class Main
{
    Scanner cin = new Scanner(new BufferedInputStream(System.in));
    Queue<Integer> queue = new PriorityQueue<>();///优先队列默认的小根堆
    void solve()
    {
        queue.add(5);
        queue.add(3);
        queue.add(56);
        while(!queue.isEmpty())
        {
            System.out.println(queue.poll());///维护一个堆保证每次取出的都是最小的并出堆
        }
        Comparator<Integer> cmp;///可以new一个重载器;
        cmp = new Comparator<Integer>()
        {
            public int compare(Integer e1,Integer e2)
            {
                return e2 - e1;///重载优先级使其变为大根堆
            }
        };
        Queue<Integer> que = new PriorityQueue<>(cmp);///筛入一个重载器使其变为大跟堆
        que.add(5);
        que.add(6);
        que.add(7);
        que.add(1);
        que.add(11);
        System.out.println("*****");
        while(!que.isEmpty())
        {
            System.out.println(que.poll());///维护一个堆保证每次取出的都是最大的并出堆
        }
        Comparator<Dog> dogcmp;
        dogcmp = new Comparator<Dog>() {
            @Override
            public int compare(Dog o1, Dog o2) {
                return o1.x-o2.x;///重载优先级使其变为小根堆
            }
        };
        Queue<Dog> q = new PriorityQueue<Dog>(dogcmp);
        Dog g = new Dog();
        g.x = 1;
        Dog g1 = new Dog();
        g1.x = 100;
        Dog g2 = new Dog();
        g2.x = 50;
        Dog g3 = new Dog();
        g3.x = 11;
        q.add(g);
        q.add(g1);
        q.add(g2);
        q.add(g3);
        System.out.println("*****");
        while(!q.isEmpty())
        {
            System.out.println(q.poll().x);///维护一个堆保证每次取出的都是最小的并出堆
        }
    }
    public static void main(String[] args)
    {
        new Main().solve();
    }
}

Java 数据结构之队列(Queue)详解 但需要注意的是,由于数组的容量是固定的,当队列已满时,无法再添加新的元素,除非进行元素的出队操作。通过enqueue()方法将元素入队,dequeue()方法将元素出队,peek()方法返回队列头部元素,size()方法返回队列当前元素个数,isEmpty()方法和isFull()方法检查队列是否为空或已满。Deque接口还提供了一些其他方法,如size()用于返回双端队列中的元素个数,isEmpty()用于判断双端队列是否为空,clear()用于清空双端队列中的所有元素等。 阅读详情

相关推荐

避坑指南:CST粒子工作室Track Solver常见的5个参数设置错误

本文深入剖析了CST粒子工作室中Track Solver在电子枪仿真时常见的5个关键参数设置错误,包括空间电荷模型选择、发射源定义、材料边界处理、监视器配置及求解器稳定性设置。通过对比错误与正确做法,帮助用户避开陷阱,确保粒子追踪仿真的物理准确性与数值稳定性,从而获得更精准的电子枪仿真结果。

dapp9builder的博客 491

【Java】PriorityQueue--优先级队列

前面介绍过队列,队列是一种先进先出(FIFO)的数据结构,但有些情况下,操作的数据可能带有优先级,一般出队列时,可能需要优先级高的元素先出队列,该中场景下,使用队列显然不合适,比如:在手机上玩游戏的时候,如果有来电,那么系统应该优先处理打进来的电话. 在这种情况下,数据结构应该提供两个最基本的操作,一个是返回最高优先级对象,一个是添加新的对象。这种数据结构就是优先级队列(Priority Queue)。

weixin_73616913的博客 1万+

PWM控制技术+Simulink仿真详解

想要理解SVPWM控制技术,首先要了解PWM控制技术。 PWM控制技术就是对脉冲宽度进行调制的技术,通过对一系列脉冲宽度进行调制来等效获得所需要的波形(包括形状和幅值)。 PWM控制的基本原理:冲量(窄脉冲的面积)相等而形状不同的窄脉冲加在具有惯性的环节上时,其效果(输出响应波形)基本相同,即面积等效原理;用一系列幅值相等,宽度按一定规律变化的高频脉冲序列代替期望的输出波形,多用于逆变电路的控制; PWM信号生成的方法有:计算法、调制法、跟踪法,主要对调制法进行详解 ...

小师兄的学习记录 5万+

Java数据结构 之 PriorityQueue(优先队列)

当谈到数据结构时,很多人可能首先会想到列表(数组)、栈、队列等常见的数据结构。然而,在某些情况下,我们需要一种更高效的方式来处理数据,特别是在涉及到任务调度、事件处理、路径搜索等问题时。这就是优先队列(PriorityQueue)的用武之地。本文将简要介绍优先队列的概念,它的应用领域,以及通过示例演示如何使用它来解决实际问题。

吾家有猫名探花的博客 1万+

csp-j/s

CSP-J/S 是中国计算机学会(CCF)主办的 ‌‌(Certified Software Professional Junior/Senior),是信息学奥赛(NOI)体系的入门级选拔考试,也是国内最具权威性的青少年编程能力认证之一。

gxyxxrYYDS的博客 2032

泛微OA E9文档管理优化:临时文件清理与存储配置指南

本文深入解析了泛微OA E9系统性能下降的常见原因——临时文件堆积,并提供了完整的优化配置指南。文章详细介绍了临时文件的产生机制,并手把手指导管理员如何通过修改存储路径、调整保留时间、设置白名单等关键配置,有效清理与管理系统临时文件,从而释放存储空间,提升系统运行效率与稳定性。

tree8的博客 432

Java 优先队列(PriorityQueue)总结

PriorityQueue 实现的是 Queue 接口 ,可以使用 Queue 提供的方法,以及自带的方法。 1、PriorityQueue概述 Java PriorityQueue 实现了 Queue 接口,不允许放入 null 元素;其通过堆实现,具体说是 通过完全二叉树(complete binary tree)实现的小顶堆(任意一个非叶子节点的权值,都不 大于其左右子节点的权值),也就意味着可以通过数组来作为PriorityQueue 的底层实现, 数组初始大小为11;也可以用一棵完全二叉树表示。

qq_36511997的博客 2万+

Cadence Design Entry HDL 使用教程

Cadence Design Entry HDL 使用教程 前言 cadence Design Entry HDL是cadence内部集成的一款板级的EDA设计工具,早期叫 concept HDL。其为cadence最早的原配板级电路图绘制工具,只不过由于后来cadence收购了orcad然后就将旗下的capture CIS收入其中,由于后者使用起来上手简单,所以后者更为大家所熟知。虽然大家对...

uio159753的博客 4万+

数据结构之优先队列

1、优先队列的底层实现可以使用最大堆进行实现,由于优先队列本身就是一个队列,所以可以复用队列的接口。 2、首先,将定义好的Queue接口,创建好,可以让优先队列实现该接口之后,实现这些接口的方法。 1 package com.queue; 2 3 /** 4 * 5 */ 6 public interface Queue<E> { 7 8 /** ...

Biexiansheng的博客 617

ESP32语音交互实战:离线唤醒与DeepSeek大模型集成

本文详细介绍了如何将ESP32-S3开发板与天问ASRPRO语音模块结合,实现离线语音唤醒并集成DeepSeek大模型的智能交互系统。通过串口通信与API调用,系统可处理本地指令及复杂语义请求,适用于低成本、高隐私保护的AIoT语音交互场景。

rust6ferris的博客 872

22、硬件工程师笔试面试——电机(2025版本)

例如,B级绝缘的电机可以承受的最高温度为130℃,而H级绝缘的电机可以承受高达180℃的温度。同时,也要考虑电机的成本和控制系统的复杂性。电机的选择取决于其应用的具体要求,包括所需的功率、速度、扭矩、效率、成本和工作环境等。根据电动机保护配置原则,为电机配置适当的保护,如过负荷保护、缺相保护、逆相保护、接地漏电保护、堵转保护、相不平衡保护、短路保护、过电压保护、低电压保护、过热保护等。根据安培环路定理,电流和磁场的相互作用会在电机的转子上产生力,这些力作用于转子上,使其绕轴旋转,从而产生转矩。

XU157303764的博客 3541

java实现优先对列的入队出队取队首元素

public class PriorityQueue { private int[] array = new int[100]; //数组时队列本体 private int size = 0; //入队 public void offer (int x) { if(size >= array.length) { re...

ludulge的博客 750

SKUA-GOCAD入门教程-第七节 点的创建与编辑3

本文介绍了四种从井数据创建点集的方法

江洋大葱的博客 963

1438. 绝对差不超过限制的最长连续子数组(优先队列和滑动窗口 或 TreeMap方法)

绝对差不超过限制的最长连续子数组 给你一个整数数组 nums ,和一个表示限制的整数 limit,请你返回最长连续子数组的长度,该子数组中的任意两个元素之间的绝对差必须小于或者等于 limit 。如果不存在满足条件的子数组,则返回 0 。 示例 1: 输入:nums = [8,2,4,7], limit = 4 输出:2 解释:所有子数组如下: [8] 最大绝对差 |8-8| = 0 <= 4. [8,2] 最大绝对差 |8-2| = 6 > 4. [8,2,4] 最大绝对差 |8-2| =

booooo丶的博客 348

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

java队列

java队列

weixin_74882709的博客 337

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

[算法竞赛进阶指南] 超市 (贪心+并查集/优先队列)

题目 超市里有N件商品,每个商品都有利润pi和过期时间di,每天只能卖一件商品,过期商品(即当天di<=0)不能再卖。 求合理安排每天卖的商品的情况下,可以得到的最大收益是多少。 输入格式 输入包含多组测试用例。 每组测试用例,以输入整数N开始,接下里输入N对pi和di,分别代表第i件商品的利润和过期时间。 在输入中,数据之间可以自由穿插任意个空格或空行,输入至文件结尾时终止输入,保证数据正...

eternityer 494

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Java-数据结构(三)------队列

111

互联网叫兽 510

力扣LeetCode,前 K 个高频元素

1、优先队列的经典问题,在1000000个元素中选出前100名元素,题型模式如在N个元素中选出前M个元素。   在这里面的关键就是M远远小于N的,如果M是1,是很简单的,只需要遍历一遍,此时时间复杂度是O(n)级别的,但是此时要选出前M个元素,如果M不等于1的话,就有点麻烦了,此时也可以将100万个元素进行一下排序,对于100万个元素,使用归并排序还是快速排序,都可以在O(NlogN)的...

HiterCoder 173

Java队列详细解释

Java 的队列主要通过接口及其子接口和实现类来定义和使用。根据不同的特性和用途,队列可以分为以下几类:普通队列(FIFO 队列)双端队列(Deque)优先级队列(Priority Queue)阻塞队列(Blocking Queue)同步队列(Synchronous Queue)如下:普通队列在 Java 中,Queue是java.util包下的一个接口,继承自Collection接口。Queue定义了基本的队列操作方法,如添加、删除和查看元素。Queue。

2401_84692568的博客 3113

力扣刷题Day11

队列的相关应用题,优先队列的使用:滑动窗口最大值、前k个高频元素;栈的使用:简化linux系统中的文件路径

witch2026的博客 469

左倾堆 - 解析与实现

左倾堆

生活需要深度 645

代码随想录Day13|

定义一个单调队列来保存窗口最大值,设置该队列的push方法为,当push的元素大于单调队列中队首元素,则将队列中的其他元素全部弹出,然后将该元素入队,pop方法则该写为检查要pop的元素是否为元素最大值,如果是的话则pop否则不做处理。采用优先队列的结构来进行保存每个元素的出现顺序,然后再返回优先队列(大堆)的前k个元素。空间复杂度: O(n),时间复杂度 O(n)空间复杂度: ,时间复杂度。

qq_55471792的博客 297

算法训练营Day12

给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值。目前为止出现的第一道Hard。最开始想到的就是暴力解法,而且很容易能写出来作为Hard题,肯定不会这么容易就能通过。视频中的思路使用的单调栈。单调栈的特点是栈内的元素保持调性,可以是单调递增或者单调递减。严格来说的话应该用的是单调双端队列。

momolinshaomo的博客 1005

java从队头到队尾_java数据结构----队列,优先级队列

1.队列:和栈中的情况不同,队列中的数据项不总是从数组下标0开始,移除一个数据项后,队头指针会指向下标较高的数据项,其特点:先入先出2.图解3.队列的实现代码:3.1.Queue.java1 packagecom.cn.queue;2 /**3 * 数据结构之队列实现4 *@authorAdministrator5 *6 */7 public classQueue {8 private intm...

weixin_33461476的博客 495

合并k个已排序的链表——NC.51

题目描述 合并 k 个已排序的链表并将其作为一个已排序的链表返回。分析并描述其复杂度。 [{1,2,3},{4,5,6,7}] {1,2,3,4,5,6,7} 解决方法一: 遍历链表数组,两两合并链表。其中合并两个有序链表也是一个算法题,点击此处查看。 import java.util.*; /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode ne

学而不思则忘 496
上一篇: HDU 1847 Good Luck in CET-4 Everybody!(巴什博弈)
下一篇: HDU 1224 Free DIY Tour(最短路或DP)
cillyb
博客等级 码龄11年 225粉丝 497原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值