优先级队列

数据结构-队列小结

眉间皱痕 提交于 2020-01-31 09:28:14
数据结构之队列 对比学习法:通过对比A和B的不同和差异来学习A和B 前置知识 数组和链表的知识 1. 先进先出队列(FIFO QUEUE) 1.1 理论知识 只允许头出,尾进。像排队一样。 如果是先进后出.则是栈。 对数组和链表可以随机存取,对队列只能尾存头取,是随机存取的一个操作子集。所以,队列其实是数组和链表就可以实现 1.2 实现 基于数组实现: 数组头部移出,尾部插入,只需要一个数组和头尾两个指针即可实现。 效率: 头取效率 O(1) 尾存效率 O(1) 缺点: 假溢出: 数组长度有限,尾部不断添加,导致头部有大量空白的情况下,数组越界。 因此: 引入循环队列的概念。 基于链表实现: 链表本身就是队列的父集合,单向链表+头尾指针就可以实现队列,所以java中没有链表队列实现,直接链表就可以起到相同作用 效率: 头取效率 O(1) 尾存效率 O(1) 小结: 单向链表可以替代队列实现 数组实现有假溢出的问题。 2.循环队列 因为链表不存在容量问题,所以循环链表只针对数组实现 数组实现的先进先出链表存在假溢出问题,为了解决假溢出问题,提出循环链表概念。 1.头指针表示出队位置。 2.尾指针表示入队位置。 3.当尾指针达到数组最后的位置的时候,跳到数组开头的位置,头指针也相同处理。 缺点: 容量有限,和数组容量相同,如果队列同时容纳的人超过了数组长度,则首尾碰撞,出现异常。

347. 前 K 个高频元素

余生颓废 提交于 2020-01-31 04:14:27
方法很好想,要么暴力排序,归并,堆排都能满足O(nlogn)的要求。 我第一次想到的就是,用哈希统计一下数字,然后重载排一下序,顺序放入集合里就行。 这次用的是最小堆,主要学习一下PriorityQueue,是基于优先级堆的无界优先级queue Modifier and Type Method and Description boolean add(E e) 将指定的元素插入到此优先级队列中。 void clear() 从此优先级队列中删除所有元素。 Comparator comparator() 返回用于为了在这个队列中的元素,或比较 null 如果此队列根据所述排序 natural ordering 的元素。 boolean contains(Object o) 如果此队列包含指定的元素,则返回 true 。 Iterator iterator() 返回此队列中的元素的迭代器。 boolean offer(E e) 将指定的元素插入到此优先级队列中。 E peek() 检索但不删除此队列的头,如果此队列为空,则返回 null 。 E poll() 检索并删除此队列的头,如果此队列为空,则返回 null 。 boolean remove(Object o) 从该队列中删除指定元素的单个实例(如果存在)。 int size() 返回此集合中的元素数。 Object[]

YARN资源调度策略之Fair Scheduler

非 Y 不嫁゛ 提交于 2020-01-30 18:56:17
目的 这篇文章是对公平调度器(FairScheduler)的说明,它是hadoop的一个可插拔的调度器,目的是让应用程序在YARN上能够公平的共享巨大的集群资源。 介绍 公平调度是一种将资源分配给应用程序的方法,这样所有应用程序平均都能在一段时间内获得相同的资源份额。Hadoop NextGen能够调度多个资源类型。默认情况下,Fair调度器仅基于内存来进行公平性决策。利用Ghodsi等人提出的占主导地位的资源公平性概念,可以将其配置为同时使用内存和CPU进行调度。当只有一个应用程序运行时,该应用程序将使用整个群集资源。当其他应用被提交时,释放的资源被分配给新的应用,这样每个应用最终获得的资源量大致相同。与默认的Hadoop调度程序(它构造一个应用程序队列)不同,它允许小的应用程序在合理的时间内完成,而不会使耗时长的应用挨饿。这也是在多个用户之间共享集群的合理方法。最后,公平分享也可以与应用程序优先级一起工作-优先级被用作权重,以确定每个应用程序应获得的总资源的百分比。 调度程序将应用程序进一步组织到“队列”中,并在这些队列之间公平地共享资源。默认情况下,所有用户共享一个名为“default”的队列。如果应用程序在容器资源请求中明确列出队列,则请求将提交到该队列。还可以通过配置根据请求中包含的用户名分配队列。在每个队列中,调度策略用于在运行的应用程序之间共享资源

java线程池ThreadPoolExecutor

元气小坏坏 提交于 2020-01-29 03:38:47
使用线程池的好处: 创建/销毁线程伴随着系统开销,过于频繁的创建/销毁线程,会很大程度上影响处理效率 线程并发数量过多,抢占系统资源从而导致阻塞 对线程进行一些简单的管理 1、ThreadPoolExecutor的一个构造方法: public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler) { if (corePoolSize < 0 || maximumPoolSize <= 0 || maximumPoolSize < corePoolSize || keepAliveTime < 0) throw new IllegalArgumentException(); if (workQueue == null || threadFactory == null || handler == null) throw new NullPointerException(); this.corePoolSize = corePoolSize; this

YARN资源调度策略之Capacity Scheduler

情到浓时终转凉″ 提交于 2020-01-28 15:58:49
什么是capacity scheduler Capacity Scheduler调度器以队列为单位划分资源。简单通俗点来说,就是一个个队列有独立的资源,队列的结构和资源是可以进行配置的,如下图: default队列占30%资源,analyst和dev分别占40%和30%资源;类似的,analyst和dev各有两个子队列,子队列在父队列的基础上再分配资源。 队列以分层方式组织资源,设计了多层级别的资源限制条件以更好的让多用户共享一个Hadoop集群,比如队列资源限制、用户资源限制、用户应用程序数目限制。队列里的应用以FIFO方式调度,每个队列可设定一定比例的资源最低保证和使用上限,同时,每个用户也可以设定一定的资源使用上限以防止资源滥用。而当一个队列的资源有剩余时,可暂时将剩余资源共享给其他队列。 特性 Capacity调度器具有以下的几个特性: 层次化的队列设计,这种层次化的队列设计保证了子队列可以使用父队列设置的全部资源。这样通过层次化的管理,更容易合理分配和限制资源的使用。 容量保证,队列上都会设置一个资源的占比,这样可以保证每个队列都不会占用整个集群的资源。 安全,每个队列有严格的访问控制。用户只能向自己的队列里面提交任务,而且不能修改或者访问其他队列的任务。 弹性分配,空闲的资源可以被分配给任何队列。当多个队列出现争用的时候,则会按照比例进行平衡。 多租户租用

python多线程编程(6): 队列同步

二次信任 提交于 2020-01-28 11:42:02
前面介绍了 互斥锁 和 条件变量 解决线程间的同步问题,并 使用条件变量同步机制解决了生产者与消费者问题 。 让我们考虑更复杂的一种场景:产品是各不相同的。这时只记录一个数量就不够了,还需要记录每个产品的细节。很容易想到需要用一个容器将这些产品记录下来。 Python的Queue模块中提供了同步的、线程安全的队列类,包括FIFO(先入先出)队列Queue,LIFO(后入先出)队列LifoQueue,和优先级队列PriorityQueue。这些队列都实现了锁原语,能够在多线程中直接使用。可以使用队列来实现线程间的同步。 用FIFO队列实现上述生产者与消费者问题的代码如下: #encoding=utf-8import threadingimport timefrom Queue import Queueclass Producer(threading.Thread): def run(self): global queue count = 0 while True: for i in range(100): if queue.qsize() > 1000: pass else: count = count +1 msg = '生成产品'+str(count) queue.put(msg) print msg time.sleep(1)class Consumer(threading

线程池(java.util.concurrent.ThreadPoolExecutor)的使用

大城市里の小女人 提交于 2020-01-27 03:55:16
一、简介 线程池类为 java.util.concurrent.ThreadPoolExecutor,常用构造方法为: ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue workQueue, RejectedExecutionHandler handler) corePoolSize: 线程池维护线程的最少数量 maximumPoolSize:线程池维护线程的最大数量 keepAliveTime: 线程池维护线程所允许的空闲时间 unit: 线程池维护线程所允许的空闲时间的单位 workQueue: 线程池所使用的缓冲队列 handler: 线程池对拒绝任务的处理策略 一个任务通过 execute(Runnable)方法被添加到线程池,任务就是一个 Runnable类型的对象,任务的执行方法就是 Runnable类型对象的run()方法。 当一个任务通过execute(Runnable)方法欲添加到线程池时: l 如果此时线程池中的数量小于corePoolSize,即使线程池中的线程都处于空闲状态,也要创建新的线程来处理被添加的任务。 l 如果此时线程池中的数量等于 corePoolSize,但是缓冲队列

栈和队列

≯℡__Kan透↙ 提交于 2020-01-26 18:18:35
物理结构与逻辑结构 把物质层面的人体比作数据存储的物理结构,那么精神层面的人格则是数据存储的逻辑结构。逻辑结构是抽象的概念,它依赖于物理结构而存在。 下面我们来讲解两个常用数据结构:栈和队列。这两者都属于逻辑结构,它们的物理实现既可以利用数组,也可以利用链表来完成。 栈 假如有一个又细又长的圆筒,圆筒一端封闭,另一端开口。往圆筒里放入乒乓球,先放入的靠近圆筒底部,后放入的靠近圆筒入口。 那么,要想取出这些乒乓球,则只能按照和放入顺序相反的顺序来取,先取出后放入的,再取出先放入的,而不可能把最里面最先放入的乒乓球优先取出。 栈(stack)是一种线性数据结构,它就像一个上图所示的放入乒乓球的圆筒容器,栈中的元素只能先入后出(First In Last Out,简称FILO)。最早进入的元素存放的位置叫作栈底(bottom),最后进入的元素存放的位置叫作栈顶(top)。 栈这种数据结构既可以用数组来实现,也可以用链表来实现。 栈的数组实现如下。 栈的链表实现如下。 栈的基本操作: class Stack ( object ) : """用数组实现栈""" def __init__ ( self ) : self . __list = [ ] def push ( self , item ) : """添加一个新元素item到栈顶""" self . __list . append (

线程池 掌握治理线程的法宝

老子叫甜甜 提交于 2020-01-26 15:32:53
1.为什么需要线程池 在当今计算机的CPU计算速度非常快的情况下,为了能够充分利用CPU性能提高程序运行效率我们在程序中使用了线程。但是在高并发情况下会频繁的创建和销毁线程,这样就变相的阻碍了程序的执行速度,所以为了管理线程资源和减少线程创建以及销毁的性能消耗就引入了线程池。 2.什么场景下适合使用线程池 当服务器接收到大量任务时,如果使用线程池可以大量减少线程的创建与销毁次数,从而提升程序执行效率 在实际开发中,如果需要创建5个以上的线程,那么就可以使用线程池来管理 3.线程池参数介绍以及特点 https://user-gold-cdn.xitu.io/2020/1/12/16f9a146e43c9ba2?imageView2/0/w/1280/h/960/format/webp/ignore-error/1 3.1 corePoolSize和maxPoolSize corePoolSize:线程池在创建完时,里面并没有线程,只有当任务到来时再去创建线程。 maxPoolSize:线程池可能会在核心线程数的基础上额外增加一些线程,但是线程数量的上限是maxPoolSize。比如第一天执行的任务非常多,第二天执行的任务非常少,但是有了maxPoolSize参数,就可以增强任务处理的灵活性。 3.2 添加线程的规则 当线程数量小于corePoolSize即使线程没有在执行任务

多线程高并发这一篇就够了不用再去别家了

微笑、不失礼 提交于 2020-01-26 14:34:10
  高伸缩性的并发编程是一种艺术,是成为高级程序员的必备知识点之一,最近总结了一下相关方面的知识。    借鉴过得博客有的我也不知道原文作业是谁 https://blog.csdn.net/qq_34337272/article/details/81072874 https://www.cnblogs.com/dolphin0520/p/3932921.html 一、线程 什么是线程? 线程是进程中单一顺序的控制流。 什么是进程? 进程是程序运行的过程。 1、进程与线程的关系: 1)线程是进程的最小执行单元; 2)一个进程中至少存在一个线程; 3)线程决定进程的生命周期 —— 一个线程启动,进程就开始执行;所有线程执行结束,这个进程执行结束; 4)多个线程共享一个进程的内存空间、一组系统资源。 2、进程与线程的区别: 1)每个进程都有自己的独立的内存空间、一组系统资源,而线程共享所属进程的内存空间、一组系统资源; 进程是独立的,同一个进程的线程是有联系的。 2)进程之间通信开销较大,线程之间通信开销较小。 3、多线程 一个进程中可以同时存在多个线程; 同一个进程中的多个线程之间可以并发执行; 多线程的执行方式:抢占式; 抢占CPU资源,计算机由CPU执行程序,只有拥有CPU资源的程序,才会被执行。 CUP资源:CUP的控制权,这个控制权具有时间性,时间长度是随机的;这段时间非常短