当前位置: 首页 > web >正文

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

一、存储结构

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

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


二、实现方式

类型实现方式特点
静态分配使用定长数组容量固定,编译时确定大小(int data[100];
动态分配指针 + malloc/realloc运行时可扩容(需手动管理内存)
// 动态顺序表示例(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. 注重存储效率:对内存占用敏感的场景


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

// 在顺序表位置 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)(已知位置)
存储开销仅数据数据 + 指针
内存连续性连续碎片化

九、总结

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

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

  • 设计启示

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

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

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

http://www.xdnf.cn/news/10916.html

相关文章:

  • 《中国城市统计年鉴》面板数据(1985-2024)
  • 如何安装huaweicloud-sdk-core-3.1.142.jar到本地仓库?
  • 板凳-------Mysql cookbook学习 (九--3)
  • AtCoder Beginner Contest 408(ABCDE)
  • Ⅲ-2.计算机二级选择题(三大结构之选择结构)
  • BeeWorks:私有化即时通讯,筑牢企业信息安全防线
  • 运维视角下的广告系统之理解广告索引级联
  • python实现基于声音识别的腕带式打鼾干预装置设计与实现
  • browser-use Agent 日志链路分析
  • CET6 仔细阅读 24年12月第一套-C1 大脑这一块
  • 【开发心得】筑梦上海:项目风云录(18)
  • 金蝶云星空对接旺店通案例分享
  • 使用 Golang `testing/quick` 包进行高效随机测试的实战指南
  • 第五章 5.Subnetting (CCNA)
  • 基于c++面向对象的设计(下)
  • FreeRTOS,其基本概念、定义、性质、定理
  • 【运维】统信UOS操作系统aarch64自制OpenSSH 9.6p1 rpm包(含ssh-copy-id命令)修复漏洞
  • 构建检索增强生成(RAG)应用:第二部分
  • agent mode 代理模式,整体要求,系统要求, 系统指令
  • 多模态大语言模型arxiv论文略读(104)
  • “轻量应用服务器” vs. “云服务器CVM”:小白入门腾讯云,哪款“云机”更适合你?(场景、配置、价格对比解析)
  • “声网AI多语种翻译官:跨境导游的生存革命“
  • 【前端AI实践】简说AI大模型:AI大模型的基本概念和使用
  • Dockerfile使用与最佳实践
  • 【Connected Paper使用以及如何多次使用教程分享】
  • Redisson单机模式
  • 无向图的点、边双连通分量
  • KINGCMS被入侵
  • 【软件工程】软件工程学概述复习资料
  • 详解开漏输出和推挽输出