zoukankan      html  css  js  c++  java
  • 初初见你,编程海洋里你独自美丽(肆)

    线性表的顺序存储结构

    一、线性表有两种物理结构:顺序存储结构与链式存储结构

    二、线性表的顺序存储结构,指的是用一段地址连续的存储单元一次存储线性表的数据元素。

    说白了,线性表的顺序存储结构,就是线性表的数据元素的内存地址是连续的。可以用占座来比喻一下,就是占了一块地方的几个位置。多数的计算机语言中,一维数组的底层实现即是线性表的顺序存储结构。
    由于地址是连续的,所以第一个数据元素的地址就是比较重要的了。

    三、线性表的顺序存储的结构代码:

    #define MAXSIZE 20             /* 存储空间初始分配量 */
    typedef int ElemType;           /* ElemType类型根据实际情况而定,这里设定为int */
    typedef struct 
    {
      ElemType data[MAXSIZE];     /* 数据存储数据元素,最大值为MAXSIZE */
      int length;                                /* 线性表当前长度 */ 
    }SqlList
    

    四、顺序存储结构的三个属性:

    (1) 存储空间的起始位置
    (2) 线性表的最大存储容量
    (3) 线性表的当前长度

    五、数组的长度与线性表长度的区别

    (1)数组的长度是存放线性表的存储空间的长度

    用占位来比喻就是最开始来的人占用位置的个数。

    (2)线性表的长度是指线性表中数据元素的个数

    随着线性表插入和删除操作的进行,这个量是变化的。
    用占位的例子来比喻的话就是实际来的人的个数。

    (3)在任意时刻,线性表的长度应该小于等于数组的长度。

    正如你占了10个位置,结果来了11个人,肯定是坐不下的。(此处不考虑特殊情况,不抬杠)

    六、顺序结构地址计算方法

    存储器中的每个存储单元都有自己的编号,这个编号称为地址。假设第一个元素的地址为LOC(a1),每个数据元素占用c个存储单元,那么可以得到如下两个公式:

    通过上面的公式,可以随时计算出线性表任意位置的地址,需要的时间几乎是相同的。根据前面学习的算法知识可知,获取元素(查询)的时间性能为O[1]。

    七、顺序存储结构的插入与删除

    由于地址是连续的,所以要插入元素,则需要插入位置之后的每个元素均后移才能实现。同样的道理,删除元素则删除后,删除的数据元素后面的均需要向前移动。

    插入算法的实现:

    1、如果插入位置不合理,抛出异常
    2、如果线性表长度不足,抛出异常或动态增加容量
    3、从最后一个元素开始向前遍历到第i个元素,分别将他们移动一个位置
    4、将要插入元素填入位置i处
    5、表长加1

    代码实现如下:
    /* 初始条件:顺序线性表L已存在,1<= i <=ListLength(L) */
    /* 操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1 */
    Status ListInsert(SqlList *L,int i,ElemType e)
    {
      int k;
      if(L->length==MAXSIZE) /*顺序线性表已满*/
        return ERROR;
      if(i<1||i>L->length+1) /* 当i不在范围内 */
        return ERROR;
      if(i<=L->length) /*若插入数据位置不在表尾*/
      {
        for(k=L->length;k>i-1;k--) /* 将要插入位置后的数据元素后移一位 */
          L->data[k+1]=Ldata[k];
      }
      L->data[i-1]=e;  /* 将新元素插入*/
      L->length++;
      return OK;
    }
    

    删除元素的思路与插入类似。

    下面我们来分析一下时间复杂度(以插入为例):

    先来看最好的情况,如果要插入到最后一个元素,此时时间复杂度为O[1],因为不需要移动元素,就如同排队时直接排在最后一样
    最坏的情况呢,如果要插入到第一个位置,此时的时间复杂度为O[n]
    平均情况呢,需要移动次数为(n-1)/2,所以时间复杂度还是O[n]。

    综上所述,线性表的顺序存储结构,在读数据时,不管在那个位置,时间复杂度都是O[1];而在插入或删除数据时,时间复杂度都是O[n]。这就说明,顺序结构适合元素个数不太多,更多的是查询的应用。

    八、线性表顺序存储结构的优缺点

    优点:

    (1)无需为表中元素之间的逻辑关系而增加额外的存储空间
    (2)可以快速的存取表中任意位置的元素

    缺点:

    (1)插入和删除操作需要移动大量元素
    (2)当线性表长度变化较大时,难以确定存储空间的容量
    (3)造成存储空间的碎片

    当前介绍了线性表的顺序存储结构一些基本概念以及具体的实现方式。通过对底层实现的理解,介绍了查询,修改,增加,删除元素的时间复杂度,简单地分析了一下线性表的顺序存储结构的优缺点。后面几篇,我会进一步介绍线性表的链式存储结构,以及单链表,静态链表等知识。大家可以关注我的微信公众号,方便利用零碎时间互相交流。共勉!

    更有早行人

    路漫漫其修远兮,吾将上下而求索。。。

  • 相关阅读:
    python BUGGGGGGGGGG
    Golang channel底层原理及 select 和range 操作channel用法
    Go reflect包用法和理解
    Golang 之sync包应用
    Golang 之 sync.Pool揭秘
    深入理解字节码文件
    java中的回调,监听器,观察者
    范式
    BIO,NIO,AIO总结(二)
    anaconda命令行运行过程中出现的错误
  • 原文地址:https://www.cnblogs.com/caozz/p/linear_list.html
Copyright © 2011-2022 走看看