顺序表

形式

  • 基本顺序表

    • 元素存放空间大小相同

    • 存储的是元素的值
      顺序表

  • 元素外置顺序表

    • 解决元素存放空间大小不一致
    • 索引
    • 存储的是元素的地址
      顺序表

公式Ln = L0 + n*c

  • Ln第n个元素首地址
  • n是偏移量 c是固定长度
  • L0 初始位置
  • 从1开始,则Ln=L1 + (n-1) * c , CPU会多进行一次减法运算

结构

  • 一体式结构

    • 表头和数据区,连续
    • 表头:容量,已存储个数
    • 数据区:元素值
      顺序表
  • 分离式结构

    • 表头和数据区,分离
    • 表头:容量,已存储个数,存储区地址
    • 数据区:可以在内存中连续空闲位置
      顺序表
  • 存储区替换

    • 一体式若存储空间不够,需整体搬迁,整个对象替换
    • 分离式存储空间不够,只需重新生成数据区,顺序表对象不变

这个就可以解释python列表,用append,insert等新增元素,但整体的列表对象id不变

  • 存储区扩充策略

    • 线性扩充,每次扩充固定长度

      • 节省空间,但是扩充操作频繁,操作次数多
    • 加倍扩充

      • :减少了扩充操作的执行次数,但可能会浪费空间资源。以空间换时间,推荐的方式

        • python列表存储,达到阈值,变为1倍,防止过度浪费
  • 增加元素

    • 末尾插入O(1)

      • python列表append
    • 非保序O(1)

    • 保序,插入后保持原有顺序O(n)

      • Python列表Insert
    • 可以看出append比insert效率高

  • 删除元素

    • 末尾删除O(1)
    • 非保序O(1)
    • 保序O(n)

Python列表

  • 采用分离式结构,元素外置的形式
  • 存储区扩充,前期加倍,达到阈值,改为加1倍
  • append效率比insert高