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

顺序表(动态数组)实现详解:从原理到接口设计(面试视角)

目录一、整体认知二、数据结构设计面试要点三、生命周期管理1. 初始化2. 销毁四、扩容机制核心深度理解面试高频1. 为什么用 realloc2. 为什么按 2 倍扩容3. 为什么用 tmp五、插入操作1. 尾插最优操作2. 头插3. 指定位置插入代码问题面试加分点六、删除操作1. 尾删2. 头删3. 指定位置删除七、时间复杂度总结八、常见面试问题1. 顺序表 vs 链表2. 为什么顺序表要扩容3. 扩容为什么不用 1九、可以继续优化的点进阶十、一句话总结面试结尾一、整体认知顺序表可以说是高级数组通过接口设计可对数组实现增删查改等操作。是重要的数据结构只是现在让我们一起感受顺序表的魅力吧核心特征底层是一段连续内存数组支持随机访问O(1)插入/删除需要挪动数据O(n)通过realloc实现动态扩容二、数据结构设计typedef int SLDateType; typedef struct SqeList { SLDateType* arr; // 指向动态数组 int size; // 当前有效元素个数 int capacity; // 当前容量 } SL;面试要点size≠capacitysize已使用空间capacity总可用空间arr NULL是初始化态三、生命周期管理1. 初始化void SLInit(SL* ps) { ps-arr NULL; ps-size ps-capacity 0; }关键点不直接分配空间懒加载思想第一次插入时再扩容2. 销毁void SLDestroy(SL* ps) { if (ps-arr) { free(ps-arr); } ps-arr NULL; ps-size ps-capacity 0; }面试关注点释放堆空间避免内存泄漏指针置空防止野指针状态重置可复用四、扩容机制核心void SLCheckCapacity(SL* ps) { if (ps-capacity ps-size) { int newcapacity ps-capacity 0 ? 4 : 2 * ps-capacity; SLDateType* tmp (SLDateType*)realloc(ps-arr, newcapacity * sizeof(SLDateType)); if (tmp NULL) { perror(realloc fail!); exit(1); } ps-arr tmp; ps-capacity newcapacity; } }深度理解面试高频1. 为什么用realloc自动处理原地扩容可能或搬迁到新地址避免手动malloc memcpy2. 为什么按 2 倍扩容保证均摊时间复杂度 O(1)避免频繁扩容3. 为什么用tmpSLDateType* tmp realloc(...)防止 realloc 失败导致原指针丢失内存泄漏五、插入操作1. 尾插最优操作void SLPushBack(SL* ps, SLDateType x) { assert(ps); SLCheckCapacity(ps); ps-arr[ps-size] x; }复杂度均摊 O(1)2. 头插void SLPushHead(SL* ps, SLDateType x) { assert(ps); SLCheckCapacity(ps); for (int i ps-size; i 0; i--) { ps-arr[i] ps-arr[i - 1]; } ps-arr[0] x; ps-size; }关键点必须从后往前移动避免覆盖时间复杂度 O(n)3. 指定位置插入void SLInsert(SL* ps, int pos, SLDateType x) { assert(ps-arr); assert(pos ps-size - 1 pos 0); SLCheckCapacity(ps); for (int i ps-size; i pos; i--) { ps-arr[i] ps-arr[i - 1]; } ps-arr[pos] x; ps-size; }代码问题面试加分点assert(pos ps-size - 1 ps 0);❌ 错误ps 0没意义指针比较插入位置应该允许pos size✅ 正确写法assert(pos 0 pos ps-size);六、删除操作1. 尾删void SLPopBack(SL* ps) { assert(ps); assert(ps-size); ps-size--; }本质逻辑删除不释放空间2. 头删void SLPopHead(SL* ps) { assert(ps); assert(ps-size); for (int i 1; i ps-size; i) { ps-arr[i - 1] ps-arr[i]; } --ps-size; }3. 指定位置删除void SLErase(SL* ps, int pos) { assert(ps-arr); assert(pos ps-size - 1 pos 0); for (int i pos; i ps-size - 1; i) { ps-arr[i] ps-arr[i 1]; } --ps-size; }七、时间复杂度总结操作时间复杂度尾插O(1)均摊头插O(n)任意插入O(n)尾删O(1)头删O(n)任意删除O(n)随机访问O(1)八、常见面试问题1. 顺序表 vs 链表维度顺序表链表内存连续离散访问O(1)O(n)插入删除O(n)O(1)已知位置cache友好高低2. 为什么顺序表要扩容数组大小固定插入时可能溢出必须动态扩展3. 扩容为什么不用 1如果每次 1插入 n 次 → realloc n 次时间复杂度退化为O(n²)九、可以继续优化的点进阶支持缩容shrink增加查找接口封装为泛型void*增加迭代器设计C方向十、一句话总结面试结尾顺序表本质是一个基于动态扩容策略的连续内存结构通过“空间换时间”实现高效访问但在插入删除上存在整体搬移的性能代价。如果你下一步想进阶我建议你做两件事把这个结构改写成C 的 vector带构造/析构/拷贝对比实现一个单链表把两者的适用场景彻底打透这两步做完你的数据结构基础就已经达到面试可用级别了。

相关文章:

顺序表(动态数组)实现详解:从原理到接口设计(面试视角)

目录 一、整体认知 二、数据结构设计 面试要点 三、生命周期管理 1. 初始化 2. 销毁 四、扩容机制(核心) 深度理解(面试高频) 1. 为什么用 realloc? 2. 为什么按 2 倍扩容? 3. 为什么用 tmp? 五…...

Bash-Oneliner终极指南:10个Terminal Tricks让效率倍增的完整教程

Bash-Oneliner终极指南:10个Terminal Tricks让效率倍增的完整教程 【免费下载链接】Bash-Oneliner A collection of handy Bash One-Liners and terminal tricks for data processing and Linux system maintenance. 项目地址: https://gitcode.com/GitHub_Trendi…...

Python指南python-guide深度:安全编码与漏洞防范终极指南

Python指南python-guide深度:安全编码与漏洞防范终极指南 【免费下载链接】python-guide Python best practices guidebook, written for humans. 项目地址: https://gitcode.com/gh_mirrors/py/python-guide Python作为一种强大且灵活的编程语言&#xff0…...

Vue3 + Element-UI项目里,手把手教你搞定TinyMCE 6本地化部署(告别API-Key和云服务报错)

Vue3 Element-UI项目实战:TinyMCE 6完整本地化集成指南 在后台管理系统开发中,富文本编辑器是不可或缺的核心组件。当Vue3遇上Element-UI,再结合TinyMCE 6的强大编辑能力,本应成就完美的技术组合。但现实往往充满挑战——云服务依…...

7个AFFiNE代码审查最佳实践:提升协作效率与代码质量的完整指南

7个AFFiNE代码审查最佳实践:提升协作效率与代码质量的完整指南 【免费下载链接】AFFiNE There can be more than Notion and Miro. AFFiNE(pronounced [ə‘fain]) is a next-gen knowledge base that brings planning, sorting and creating all together. Privacy…...

别再为Unity WebGL部署头疼了!一份Tomcat/Nginx通用的服务器配置清单

Unity WebGL部署全攻略:Tomcat与Nginx服务器配置精要 当Unity开发者完成WebGL版本的构建后,真正的挑战往往才开始——如何让这些文件在服务器上正常运行。不同于本地开发环境,生产服务器的配置差异可能导致各种意料之外的问题,从资…...

5分钟快速上手AFFiNE Webhook:让你的工作流自动响应一切变化

5分钟快速上手AFFiNE Webhook:让你的工作流自动响应一切变化 【免费下载链接】AFFiNE There can be more than Notion and Miro. AFFiNE(pronounced [ə‘fain]) is a next-gen knowledge base that brings planning, sorting and creating all together. Privacy f…...

你有没有想过,为什么很多公司宁愿招个空降领导,也不愿提拔老员工上位?

你有没有想过,为什么很多公司宁愿招个空降领导,也不愿提拔老员工上位?这事儿你想想西游记就懂了,西天取经那可是灵山的头号重点项目,如来手底下罗汉菩萨一大堆,跟着他修行了几千年的老员工一抓一大把&#…...

终极指南:从源码到桌面的Alacritty Windows安装包分发技术解析

终极指南:从源码到桌面的Alacritty Windows安装包分发技术解析 【免费下载链接】alacritty A cross-platform, OpenGL terminal emulator. 项目地址: https://gitcode.com/GitHub_Trending/al/alacritty Alacritty作为一款跨平台的OpenGL终端模拟器&#xff…...

3分钟上手!用aws-cli玩转Redshift数据仓库管理

3分钟上手!用aws-cli玩转Redshift数据仓库管理 【免费下载链接】aws-cli Universal Command Line Interface for Amazon Web Services 项目地址: https://gitcode.com/GitHub_Trending/aw/aws-cli AWS CLI(Amazon Web Services Command Line Inte…...

局域网介质访问控制方式

介质 传输介质(网线、无线信号)访问控制 多台设备(如电脑、路由等)如何有序地使用同一根线/同一片空间来发数据,避免碰撞和混乱。一下均已电脑作比。一、CSMA/CD(带冲突检测的载波侦听多路访问&#xff0…...

[Windows] Removable Access Tool V1.4(USB加锁工具)

[Windows] Removable Access Tool V1.4(USB加锁工具) 链接:https://pan.xunlei.com/s/VOqu9s3IoZt0xJ5nDWoq8nkdA1?pwddf9j# Removable Access Tool(简称 Ratool) 是一款免费、便携、免安装的 Windows 系统工具&…...

告别数据丢失风险:Dokploy数据库备份管理优化全指南

告别数据丢失风险:Dokploy数据库备份管理优化全指南 【免费下载链接】dokploy Open Source Alternative to Vercel, Netlify and Heroku. 项目地址: https://gitcode.com/GitHub_Trending/do/dokploy Dokploy作为开源的Vercel、Netlify和Heroku替代方案&…...

SpringBoot+Vue家校互联管理系统源码+论文

代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹 分享万套开题报告任务书答辩PPT模板 作者完整代码目录供你选择: 《SpringBoot网站项目》1800套 《SSM网站项目》1500套 《小程序项目》1600套 《APP项目》1500套 《Python网站项目》…...

芯片安全启动全解析:从eFuse到Secure Boot

芯片eFuse深度解析+安全启动(Secure Boot)原理+代码级实现详解 前言 在嵌入式、SOC芯片设计、物联网安全领域,eFuse 和 Secure Boot 是绕不开的核心技术。eFuse作为芯片级一次性可编程存储器,是硬件安全的根信任载体;Secure Boot则是基于eFuse构建的启动链验证体系,从根…...

DRAM RowHammer攻击防御:流算法与硬件优化实践

1. DRAM RowHammer攻击的本质与威胁演变现代DRAM芯片的物理特性决定了其存储单元在密集访问下会出现电荷干扰现象。RowHammer攻击正是利用这一物理弱点,通过高频次访问特定内存行(称为"攻击行"),导致相邻行(…...

深度学习在迈克尔逊干涉仪微位移测量中的应用与优化

1. 项目概述:深度学习赋能迈克尔逊干涉仪微位移测量在精密测量领域,迈克尔逊干涉仪作为19世纪末发明的经典光学仪器,凭借其结构简单、灵敏度高等优势,在引力波探测、材料科学等领域发挥着不可替代的作用。其核心原理是通过测量两束…...

给 Claude Code 装一块秒表:每轮 + 累计耗时自动反馈

JeecgBoot AI专题研究 | 一段指令装完,每轮 累计耗时直接打在屏幕上痛点 用 Claude Code 久了会发现一件事:它干完活不告诉你花了多久。昨晚让它在 JeecgBoot 低代码里跑自动搭建 OA 审批 Skills(设计表单、绘制流程、挂接表单流程、配置菜单…...

从MATLAB到FPGA:手把手将卷积编译码算法移植到硬件(Vivado 2023.1实战)

从MATLAB到FPGA:卷积编译码算法的硬件移植实战指南 在数字通信系统设计中,卷积编码和维特比译码作为经典的前向纠错技术,其硬件实现效率直接影响着整个系统的性能。本文将带您深入探索从MATLAB算法验证到FPGA硬件实现的完整移植路径&#xff…...

别再猜了!海康威视MV_CC_DEVICE_INFO结构体里MAC地址的完整解析指南

海康威视工业相机MAC地址解析与实战应用指南 当你在调试海康威视工业相机时,是否曾对着SDK中的MV_CC_DEVICE_INFO结构体发愣?特别是那两个神秘的nMacAddrHigh和nMacAddrLow字段,它们与相机标签上的MAC地址究竟有何关联?本文将带你…...

解决Dokploy在Alpine Linux上的5大兼容性难题:从容器启动失败到系统依赖冲突的完美方案

解决Dokploy在Alpine Linux上的5大兼容性难题:从容器启动失败到系统依赖冲突的完美方案 【免费下载链接】dokploy Open Source Alternative to Vercel, Netlify and Heroku. 项目地址: https://gitcode.com/GitHub_Trending/do/dokploy Dokploy作为开源的Ver…...

5个企业级Bruno API测试实战案例:从开发到协作的完整指南

5个企业级Bruno API测试实战案例:从开发到协作的完整指南 【免费下载链接】bruno Opensource IDE For Exploring and Testing APIs (lightweight alternative to Postman/Insomnia) 项目地址: https://gitcode.com/GitHub_Trending/br/bruno Bruno是一款开源…...

2025大模型风向标:五大趋势解读,落地与安全才是王道!

2025年大模型产业将呈现五大趋势:一是“Agentic”AI从Demo走向规模化生产,成为可编排的数字员工;二是推理能力转向“测试时计算”与“可验证推理”,更注重搜索和验证;三是推理与多模态全面融合,语音、图像、…...

微积分极限概念解析与工程应用实战

1. 极限概念的本质理解微积分的大门往往从"极限"这个看似简单却深藏玄机的概念开启。记得我初学极限时,教授在黑板上画了个不断逼近却永不触及的曲线,那一刻突然明白了数学描述动态过程的魔力。极限不仅是计算工具,更是用静态符号刻…...

AI Agent火爆内幕:从“大脑“到“手脚“,揭秘AI真正落地的秘密!

本文深入剖析AI Agent的核心概念与运作机制,阐述其与大模型的关系,并详细解读Agent的关键特性,如推理、行动、工具使用等。文章还探讨了Agent的工程实现,包括指令、工具描述、上下文管理、会话状态等要素,以及多Agent协…...

量子噪声如何优化量子神经网络性能

1. 量子噪声与量子神经网络的正则化效应量子神经网络(QNN)作为量子机器学习的前沿模型,其训练过程与传统神经网络有着本质区别。在NISQ(含噪声中等规模量子)时代,量子噪声被视为阻碍QNN性能的主要因素。然而最新研究发现,特定类型的量子噪声反…...

Model Context Protocol:机器学习模型全生命周期管理的关键协议

1. 项目概述在机器学习模型开发领域,Model Context Protocol(模型上下文协议)正逐渐成为连接模型训练、部署与监控的关键桥梁。这个协议本质上是一套标准化的数据结构和通信规范,它允许开发者在模型生命周期的各个阶段传递和保留关…...

AI应用的可观测性工程:用Tracing和Logging看清LLM黑盒

“我的RAG系统回答了一个错误答案,但我不知道为什么。” “Agent跑了2分钟什么都没完成,我不知道它在做什么。” “用了新版本Prompt,感觉质量变了,但我说不清楚哪里变了。” 这些是AI工程师最常见的困境,根本原因是缺…...

量子计算并行化:编译器与硬件协同设计实践

1. 量子计算中的并行化革命:从理论到实践 量子计算正在经历一场从实验室原型向实用化系统转变的关键时期。作为一名长期跟踪量子计算硬件发展的工程师,我亲眼目睹了量子处理器规模从几个量子比特扩展到数百个量子比特的历程。在这个过程中,一…...

AI 入门 30 天挑战 - Day 18 费曼学习法版 - 图像分割基础

🌟 完整项目和代码 本教程是 AI 入门 30 天挑战 系列的一部分! 💻 GitHub 仓库: https://github.com/Lee985-cmd/AI-30-Day-Challenge📖 CSDN 专栏: https://blog.csdn.net/m0_67081842?typeblog⭐ 欢迎 Star 支持!…...