zoukankan      html  css  js  c++  java
  • 双端队列deque的初始化和扩容

    一、双端队列的结构

    deque的结构是由两个数组组成的,暂且把这两个数组称作是1号数组和2号数组(Array_1、Array_2)

    1号数组保存的是指向2号数组的指针,1号数组的初始大小为2,在2号数组满的时候进行2倍扩容,初始化1号数组中间位置的指针指向2号数组Array_1[size/2]=Array_2;

    2号数组保存的是deque的内容,2号数组有两个指针,first和last,我们打这两称作头指针和尾指针,deque的push_front()和push_back()就是对这两个指针进行操作

    first指针和last指针初始化的时候在2号数组的中间位置,*first=Array_2[max_size/2],*last=*(first+1);

    Array_2数组的大小max_size取决于deque保存的数据类型sizeof(T)的大小,如果sizeof(T)>4096     max_size=1;否则max_size=4096/sizeof(T) 

    初始化之后的结构

    /*
                            <--    first
            Array_1[0] |         |
            Array_1[1] | - - - - - - - - - - -              Array_2
                                   |
                                  last -->
            */

    二、deque的扩容

    首先deque是采取二倍扩容机制,并且是对1号数组Array_1进行扩容,扩容之后还是从数组中间位置开始使用,有以下几种情况需要对1号数组进行扩容

    假设1号数组的大小为size_1

    1、first指针移动到Array_2的头部位置,first指针所在的Array_2数组对应1号数组的下标i==0,last指针所在的Array_2对应的1号数组下标 j+1<size_1,这时候需要对Array_1进行2倍扩容

    /*                            <--    first
                                             |
            Array_1[0] | - - - - - - - - - - -              Array_2_1
            Array_1[1] | - - - - - - - - - - -              Array_2_0
                                   |
                                  last -->
            */

    2、last指针移动到Array_2的尾部位置,last指针所在的Array_2数组对应1号数组的下标i==size_1-1,first指针所在的Array_2对应的1号数组下标 j==0,这时候需要对Array_1进行2倍扩容

    /*                    
                                <--    first
                                     |
            Array_1[0] |             - - - - -                Array_2_1
            Array_1[1] | - - - - - - - - - - -              Array_2_0
                                             |
                                            last -->
            */

    当first指针或last指针指到Array_2数组的边界位置,可以通过整体向上或向下移动腾出空间,那么可以不需要进行扩容

    //整体向下移动一个位置,还是可以给first腾出一个位置的,所以可以不进行扩容
        /*                    
                  <--  first
                         |
            Array_1[0] | - - - - - - - - - - -                Array_2_2
            Array_1[1] | - - - - - - - - - - -                Array_2_1
            Array_1[2] | - - - - - - -                      Array_2_0                                 |
            Array_1[3]                 |
                                   last -->
            */
  • 相关阅读:
    if...else if...else和switch语句的注意点
    oracle如何用sql查看触发器?
    jfinal如何调用存储过程?
    struts2中s:iterator 标签的使用详解 及 OGNL用法
    Protobuf3 语法指南
    Golang的优雅重启
    从外部设置传入Go变量
    Golang服务器热重启、热升级、热更新(safe and graceful hot-restart/reload http server)详解
    Linux文件系统深度讨论【转】
    Go语言中的byte和rune区别、对比
  • 原文地址:https://www.cnblogs.com/-citywall123/p/13444853.html
Copyright © 2011-2022 走看看