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 -->
            */
  • 相关阅读:
    OC中nil、Nil、NULL、NSNull的区别
    SOJ 1050. Numbers & Letters
    SOJ 1009. Mersenne Composite N
    SOJ 1006. Team Rankings
    SOJ 1036. Crypto Columns
    SOJ 1151. 魔板
    SOJ 1007. To and Fro
    SOJ 1150.简单魔板
    SOJ 1051 Biker's Trip Odometer
    SOJ 1176 Two Ends
  • 原文地址:https://www.cnblogs.com/-citywall123/p/13444853.html
Copyright © 2011-2022 走看看