zoukankan      html  css  js  c++  java
  • 队列

    队列

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

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

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

    队列操作

    入队 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

  • 相关阅读:
    HTML <form> 标签的 method 属性(20161028)
    PHP数据访问增删查(20161028)
    PHP数据访问基础知识(20161028)
    java代理机制
    java 模拟实现消费者和生产者问题
    Single Number II
    从1到1000中随机取出900个不重复的随机数
    取苹果方式总数
    Net-SNMP(V3协议)安装配置笔记(CentOS 5.2)(转)
    单例模式
  • 原文地址:https://www.cnblogs.com/zx125/p/11701376.html
Copyright © 2011-2022 走看看