• 队列


    队列

    队列其实就和排队类似,先排队的人先买票,后排队的人排队伍的最后,而且不允许插队

    其实队列和链表类似也是一种受限制的线性数据结构

    总结来说是就是:先进者先出

    队列操作

    入队 enqueue():放一个数据到队列的尾部

    出队 dequeue():从队列头部取出一个元素

    队列的两种实现

    顺序队列:用数组实现

    栈我们只需要一个指针就能实现,但是队列需要两个指针:一个是head指针,指向队头(用于出队),一个是tail指针,指向队尾(用于入栈)

    向一个空队列插入4个元素

    出队两个元素

    问题

    一般底层涉及到数组,都会有内存的问题

    1.如果tail到了7,head不为0,这个时候就需要进行数据搬移,把数据搬到顶端,然后更新head和tail指针。

    2.如果tail到7的时候,head为0,那么数据无法入队,只能出队

    时间复杂度

    出队是O(1),入队使用均摊时间复杂度为O(1)

    链式队列:用链表实现

    同样需要两个指针,一个指向头结点,一个指向尾结点

    循环队列

    我们知道,顺序队列还是涉及到了数据的搬运,为了解决这个问题设计出了循环队列,直接把数组头和尾相连,形成了一个环形。

    问题

    如何确定好队空和队满的判断条件

    n为数组长度

    可以这样来 (tail+1)%n=head

    阻塞队列

    阻塞队列其实就是在队列的基础上加了阻塞操作

    入队:如果队列已经满了,阻塞,当队列有空在插入

    出队:如果队列为空,出队阻塞,当队列有内容了在出队

    可以和并发队列实现简单的生产者-消费者模型

    并发队列

    线程安全的队列叫做并发队列

    实际应用

    无界队列

    基于链表的实现方式,可以实现一个支持无限排队的无界队列(unbounded queue),但是可能会导致排队的太多,处理的时间就会很长,同时也可能浪费大量计算机资源来维护排队。所以,针对响应时间比较敏感的系统,基于链表实现的无限排队线程池是不合适的。

    有界队列

    队列大小有限,所以线程池满的时候,请求的连接会直接被拒绝,这种方式对响应时间敏感的系统来说,就更加的合理。但是要在性能和资源中设置一个合适大小的队列是很讲究的。

    极客时间版权所有: https://time.geekbang.org/column/article/41330

  • 相关阅读:
    [CSP-S模拟测试]:答题(meet in the middle)
    __AFO
    BZOJ4332 JSOI2012 分零食 【倍增 + NTT】
    CF528D Fuzzy Search 【NTT】
    uoj【UNR #3】To Do Tree 【贪心】
    uoj233/BZOJ4654/洛谷P1721 [Noi2016]国王饮水记 【dp + 斜率优化】
    BZOJ2150 部落战争 【带上下界最小流】
    洛谷P4240 毒瘤之神的考验 【莫比乌斯反演 + 分块打表】
    BZOJ3235 [Ahoi2013]好方的蛇 【单调栈 + dp】
    51nod1236 序列求和 V3 【数学】
  • 原文地址:https://www.cnblogs.com/zx125/p/11701376.html
Copyright © 2020-2023  润新知