优先级队列

queue 之团队队列(摘)

前提是你 提交于 2020-03-21 02:48:29
有t个团队的人正在排一个长队。每次新来一个人时,如果他有队友在排队,那么这个新人会插队到最后一个队友的身后。如果没有任何一个队友排队,则他会排到长队的队尾。 输入每个团队中所有队员的编号,要求支持如下3种指令(前两种指令可以穿插进行) 对于每个DEQUEUE指令,输出出队人的编号。 Sample Input 2 3 101 102 103 3 201 202 203 ENQUEUE 101 ENQUEUE 201 ENQUEUE 102 ENQUEUE 202 ENQUEUE 103 ENQUEUE 203 DEQUEUE DEQUEUE DEQUEUE DEQUEUE DEQUEUE DEQUEUE STOP 2 5 259001 259002 259003 259004 259005 6 260001 260002 260003 260004 260005 260006 ENQUEUE 259001 ENQUEUE 260001 ENQUEUE 259002 ENQUEUE 259003 ENQUEUE 259004 ENQUEUE 259005 DEQUEUE DEQUEUE ENQUEUE 260002 ENQUEUE 260003 DEQUEUE DEQUEUE DEQUEUE DEQUEUE STOP 0 Sample Output Scenario #1 101

优先(级)队列

会有一股神秘感。 提交于 2020-03-21 02:47:14
优先队列    优先级队列 是队列的一种,不过它可以按照自定义的一种方式(数据的优先级)来对队列中的数据进行动态的排序。每次的push和pop操作,队列都会动态的调整,以达到我们预期的方式来存储。 优先队列是由堆来实现的。   重点:优先级队列,是要看优先级的,谁的优先级更高,谁就先得到权限。不分排队的顺序!如果优先队列中每个元素的优先级相同,则可任选其中一个。   优先队列的效率:时间复杂度为O(logn),其中n为队列中元素的个数。    堆实质上是满足如下性质的完全二叉树:   树中任一非叶结点的关键字均不大于(或不小于)其左右孩子(若存在)结点的关键字。 堆排序:   堆排序利用了大根堆(或小根堆)堆顶记录的关键字最大(或最小)这一特征,使得在当前无序区中选取最大(或最小)关键字的记录变得简单。 python中的优先队列   Python的 heapq模块 实现了一个适用于Python列表的最小堆排序算法。是一个最小堆,堆顶元素 a永远是最小的,Java中的优先队列类似. heapq模块提供了如下几个函数: heapq.heappush(heap, item) :把item添加到heap中(heap是一个列表) heapq.heappop(heap) : 把堆顶元素弹出,返回的就是堆顶(优先级最高的元素) heapq.heappushpop(heap, item)

并发工具类和线程池

…衆ロ難τιáo~ 提交于 2020-03-19 17:53:22
工具类 CountDownLatch 利用它可以实现类似计数器的功能。比如有一个任务A,它要等待其他4个任务执行完毕之后才能执行,此时就可以利用CountDownLatch来实现这种功能了。 package com.yjc.juc; import java.util.concurrent.CountDownLatch; public class CountDownLatchDemo { public static void main(String[] args) throws InterruptedException { System.out.println("主线程启动---->等待子线程执行完毕"); //代表等待两个线程执行完主线程才继续执行 CountDownLatch countDownLatch=new CountDownLatch(2); new Thread(() -> { System.out.println("第一个子线程" + Thread.currentThread().getName() + "正在执行"); countDownLatch.countDown(); System.out.println("第一个子线程" + Thread.currentThread().getName() + "执行完毕"); }).start(); new Thread(

Spring任务执行和调度task:scheduler与task:executor的配置

被刻印的时光 ゝ 提交于 2020-03-18 18:06:15
配置说明: 从Spring 3.0开始,有一个用于配置TaskExecutor和TaskScheduler实例的XML命名空间。它还提供了一种方便的方法来配置要使用触发器安排的任务。 任务调度器的配置详细参数说明: task:scheduler/@pool-size:调度线程池的大小,调度线程在被调度任务完成前不会空闲 task:scheduled/@cron:cron表达式,注意,若上次任务未完成,即使到了下一次调度时间,任务也不会重复调度 <task:scheduled-tasks scheduler="scheduler"> <task:scheduled ref="beanID" method="methodName" cron="CronExp" /> </task:scheduled-tasks> <task:scheduler id="scheduler" pool-size="10" /> 任务执行器配置详细参数说明: task:executor/@pool-size:可以指定执行线程池的初始大小、最大大小 task:executor/@queue-capacity:等待执行的任务队列的容量 task:executor/@rejection-policy:当等待队列爆了时的策略,分为丢弃、由任务执行器直接运行等方式 <task:executor id=

Linux TCP并发请求溺出 调优

懵懂的女人 提交于 2020-03-15 12:33:30
TCP并发请求溺出 调优:系统开启某个监听端口后,当多个TCP请求连接监听端后,会把多个请求交给backlog的默认监听队列由socket server一并处理,backlog有自己的队列长度默认128,当机器处理能力较慢且并发请求值较高时就要考虑对backlog队列进行调优。 注:backlog就是socket的监听队列,当一个请求尚未被处理或建立时,他会进入backlog。 注:socket server可以一次性处理backlog中的所有请求,处理后的请求不再位于监听队列中。当server处理请求较慢,以至于监听队列被填满后,新来的请求会被拒绝。 TCP内核参数修改 调优 修改文件:/etc/sysctl.conf 生效命令:sysctl -p /etc/sysctl.conf # 用于设置内核无法及时处理网络接口收到的数据包时允许发送到队列的最大数据包数目,默认为128。 net.core.netdev_max_backlog = 32768 # 用来限制监听(LISTEN)队列最大数据包的数量,超过这个数量就会导致链接超时或者触发重传机制 net.core.somaxconn= 32768# 表示SYN队列的长度,默认值为1024,此处加大队列长度为65535,可以容纳更多等待连接的网络连接数。net.ipv4.tcp_max_syn_backlog=65535 注

to meet you Java多线程与并发

家住魔仙堡 提交于 2020-03-14 18:46:59
2: hotspot中对象在内存的布局是分3部分 对象头 实例数据 对其填充 这里主要讲对象头:一般而言synchronized使用的锁对象是存储在对象头里的,对象头是由Mark Word和Class Metadata Address组成 mark word存储自身运行时数据,是实现轻量级锁和偏向锁的关键,默认存储对象的hasCode、分代年龄、锁类型、锁标志位等信息。 由于对象头的信息是与对象定义的数据没有关系的额外存储成本,所以考虑到jvm的空间效率,mark word 被设计出一个非固定的存储结构,以便存储更多有效的数据,它会根据对象本身的状态复用自己的存储空间(轻量级锁和偏向锁是java6后对synchronized优化后新增加的) Monitor:每个Java对象天生就自带了一把看不见的锁,它叫内部锁或者Monitor锁(监视器锁)。上图的重量级锁的指针指向的就是Monitor的起始地址。 每个对象都存在一个Monitor与之关联,对象与其Monitor之间的关系存在多种实现方式,如Monitor可以和对象一起创建销毁、或当线程获取对象锁时自动生成,当线程获取锁时Monitor处于锁定状态。 Monitor是虚拟机源码里面用C++实现的 源码解读:_WaitSet 和_EntryList就是之前学的等待池和锁池,_owner是指向持有Monitor对象的线程

python Queue模块使用

时光怂恿深爱的人放手 提交于 2020-03-12 06:01:50
Python中,队列是线程间最常用的交换数据的形式。Queue模块是提供队列操作的模块,虽然简单易用,但是不小心的话,还是会出现一些意外。 创建一个“队列”对象 import Queue q = Queue.Queue(maxsize = 10) Queue.Queue类即是一个队列的同步实现。队列长度可为无限或者有限。可通过Queue的构造函数的可选参数maxsize来设定队列长度。如果maxsize小于1就表示队列长度无限。 将一个值放入队列中 q.put(10) put(item[, block[, timeout]]) 将item放入队列中。 如果可选的参数block为True且timeout为空对象(默认的情况,阻塞调用,无超时)。 如果timeout是个正整数,阻塞调用进程最多timeout秒,如果一直无空空间可用,抛出Full异常(带超时的阻塞调用)。 如果block为False,如果有空闲空间可用将数据放入队列,否则立即抛出Full异常 其非阻塞版本为 put_nowait 等同于 put(item, False) 将一个值从队列中取出 q.get()   get([block[, timeout]]) 调用队列对象的get()方法从队头删除并返回一个项目。可选参数为block,默认为True。如果队列为空且block为True,get()就使调用线程暂停

queue队列是并发利器

断了今生、忘了曾经 提交于 2020-03-08 22:17:22
import queue ''' 此包中的常用方法(q = Queue.Queue()): q.qsize() 返回队列的大小 q.empty() 如果队列为空,返回True,反之False q.full() 如果队列满了,返回True,反之False q.full 与 maxsize 大小对应 q.get([block[, timeout]]) 获取队列,timeout等待时间 q.get_nowait() 相当q.get(False) 非阻塞 q.put(item) 写入队列,timeout等待时间 q.put_nowait(item) 相当q.put(item, False) q.task_done() 在完成一项工作之后,q.task_done() 函数向任务已经完成的队列发送一个信号 q.join() 实际上意味着等到队列为空,再执行别的操作 ''' qu = queue.Queue(5) #先进先出 qu.put("dxvxc1") qu.put("dxvxc2") qu.put("dxvxc3") qu.put("dxvxc2") qu.put("dxvxc3") print(qu.join()) print(qu.full()) # 如果队列满了,返回True,反之False print(qu.get()) print(qu.get())

操作系统中常见算法汇总

不问归期 提交于 2020-03-08 16:07:54
一、常见作业调度(高级调度)算法 1、先来先服务调度算法(FCFS):就是按照各个作业进入系统的自然次序来调度作业。这种调度算法的优点是实现简单,公平。其缺点是没有考虑到系统中各种资源的综合使用情况,往往使短作业的用户不满意,因为短作业等待处理的时间可能比实际运行时间长得多。 2、短作业优先调度算法(SPF): 就是优先调度并处理短作业,所谓短是指作业的运行时间短。而在作业未投入运行时,并不能知道它实际的运行时间的长短,因此需要用户在提交作业时同时提交作业运行时间的估计值。 3、最高响应比优先算法(HRN):FCFS可能造成短作业用户不满,SPF可能使得长作业用户不满,于是提出HRN,选择响应比最高的作业运行。响应比=1+作业等待时间/作业处理时间。 基本概念: 作业周转时间(Ti)=完成时间(Tei)-提交时间(Tsi) 作业平均周转时间(T)=周转时间/作业个数 作业带权周转时间(Wi)=周转时间/运行时间 响应比=(等待时间+运行时间)/运行时间 4.基于优先数调度算法(HPF):每一个作业规定一个表示该作业优先级别的整数,当需要将新的作业由输入井调入内存处理时,优先选择优先数最高的作业。 5.均衡调度算法,即多级队列调度算法。 二、常见进程调度(低级调度)算法 1、先进先出算法(FIFO):按照进程进入就绪队列的先后次序来选择。即每当进入进程调度

iOS中实现多线程的技术方案

老子叫甜甜 提交于 2020-03-08 10:02:59
pthread 实现多线程操作 代码实现: void * run(void *param) { for (NSInteger i = 0; i < 1000; i++) { NSLog(@"---buttonclick---%zd---%@", i, [NSThread currentThread]); } return NULL; } @implementation ViewController - (IBAction)clickButton:(id)sender { // 定义一个线程 pthread_t thread; // 创建一个线程 (参1)pthread_t *restrict:创建线程的指针,(参2)const pthread_attr_t *restrict:线程属性 (参3)void *(*)(void *):线程执行的函数的指针,(参4)void *restrict:null pthread_create(&thread, NULL, run, NULL); // 何时回收线程不需要你考虑 pthread_t thread2; pthread_create(&thread2, NULL, run, NULL); } NSThread实现多线程 一个 NSThread 对象就代表一条线程 创建线程的多种方式 第一种方式:先创建再启动线程 // 创建线程