【数据结构知识分享】顺序表详解

一、存储结构

  • 物理相邻性

    若元素 ab 逻辑相邻,则它们在内存中的地址也连续(如 &a[i+1] = &a[i] + sizeof(ElemType))。

  • 内存布局x
    基地址 + 索引 × 元素大小,通过首地址直接计算任意位置地址。


二、实现方式

类型 实现方式 特点
静态分配 使用定长数组 容量固定,编译时确定大小(int data[100];
动态分配 指针 + malloc/realloc 运行时可扩容(需手动管理内存)
cs 复制代码
// 动态顺序表示例(C语言)
typedef struct {
    int *data;      // 动态数组指针
    int length;     // 当前长度
    int capacity;   // 总容量
} SeqList;

// 初始化
void InitSeqList(SeqList *L, int size) {
    L->data = (int*)malloc(size * sizeof(int));
    L->length = 0;
    L->capacity = size;
}

三、核心特点

  1. 随机访问

    • 通过下标直接访问元素,时间复杂度 O(1)

    • 计算地址:Loc(a_i) = base_address + i × sizeof(ElemType)

  2. 存储密度高

    • 仅存储元素本身,无额外指针开销(对比链表)
  3. 容量拓展不便

    • 静态分配:无法扩容,溢出导致崩溃

    • 动态分配realloc 扩容需复制全部元素,时间复杂度 O(n)

  4. 插入/删除效率低

    • 在位置 i 插入需后移所有后续元素(平均移动 n/2 次)

    • 删除操作需前移元素(平均移动 (n-1)/2 次)

    • 时间复杂度:O(n)


四、操作复杂度分析

操作 时间复杂度 说明
按索引访问 O(1) 直接计算地址
头部插入/删除 O(n) 需移动所有元素
尾部插入/删除 O(1) 无需移动元素(空间充足时)
指定位置插入删除 O(n) 平均移动半数元素
扩容(动态) O(n) 复制旧数据到新空间

五、适用场景

  1. 读多写少:高频随机访问(如二分查找)

  2. 元素数量稳定:避免频繁扩容

  3. 注重存储效率:对内存占用敏感的场景


六、代码示例(插入操作)

cs 复制代码
// 在顺序表位置 i 插入元素 e
bool Insert(SeqList *L, int i, int e) {
    if (i < 1 || i > L->length + 1) // 校验位置合法性
        return false;
    if (L->length >= L->capacity) {  // 动态扩容
        int new_cap = L->capacity * 2;
        int *new_data = (int*)realloc(L->data, new_cap * sizeof(int));
        if (!new_data) return false; // 扩容失败
        L->data = new_data;
        L->capacity = new_cap;
    }
    for (int j = L->length; j >= i; j--) // 后移元素
        L->data[j] = L->data[j-1];
    L->data[i-1] = e;
    L->length++;
    return true;
}

七、经典问题

  1. 逆置顺序表

    双指针法(头尾交换),时间复杂度 O(n)

  2. 合并有序表

    归并思想(需额外空间),时间复杂度 O(m+n)

  3. 删除重复值

    • 快慢指针法,时间复杂度 O(n)

八、顺序表 vs 链表

特性 顺序表 链表
访问方式 随机访问 顺序访问
插入/删除效率 O(n) O(1)(已知位置)
存储开销 仅数据 数据 + 指针
内存连续性 连续 碎片化

九、总结

  • 优势:随机访问极快、存储紧凑

  • 劣势:动态扩容成本高、插入删除效率低

  • 设计启示

    • 优先选择顺序表:需高频访问元素,元素数量可预估

    • 选择链表:需频繁插入删除,数据规模变化大

下一期预告:顺序表的基本操作的实现

相关推荐
多打代码22 分钟前
2025.09.05 用队列实现栈 & 有效的括号 & 删除字符串中的所有相邻重复项
python·算法
悠哉悠哉愿意37 分钟前
【数学建模学习笔记】机器学习分类:KNN分类
学习·机器学习·数学建模
四谎真好看43 分钟前
Java 学习笔记(进阶篇2)
java·笔记·学习
程序猿炎义1 小时前
【NVIDIA AIQ】自定义函数实践
人工智能·python·学习
小陈phd1 小时前
高级RAG策略学习(四)——上下文窗口增强检索RAG
人工智能·学习·langchain
j_xxx404_2 小时前
数据结构:栈和队列力扣算法题
c语言·数据结构·算法·leetcode·链表
南莺莺2 小时前
假设一个算术表达式中包含圆括号、方括号和花括号3种类型的括号,编写一个算法来判别,表达式中的括号是否配对,以字符“\0“作为算术表达式的结束符
c语言·数据结构·算法·
THMAIL2 小时前
深度学习从入门到精通 - 神经网络核心原理:从生物神经元到数学模型蜕变
人工智能·python·深度学习·神经网络·算法·机器学习·逻辑回归
野犬寒鸦2 小时前
力扣hot100:旋转图像(48)(详细图解以及核心思路剖析)
java·数据结构·后端·算法·leetcode
墨染点香2 小时前
LeetCode 刷题【61. 旋转链表】
算法·leetcode·职场和发展