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

【低成本扩容】动态扩容实战指南

面对扩容操作时,下面这种操作是否也会迷惑你?下面来为大家解惑~

size_t newcapacity = 2*_capacity > (_size + len)?2*_capacity:(_size+len);
//len为即将插入的字符串有效字符个数//_size为当前字符串有效字符个数//_capacity为当前容量大小//newcapacity为扩容后容量大小

一、为什么需要动态扩容?

静态数组(如 C 语言的int arr[10])的容量是固定的,一旦存储的元素数量超过容量,就会发生溢出。而动态数组(如 C++ 的vector、Java 的ArrayList)需要支持灵活添加元素,因此必须在容量不足时自动扩容。

但扩容的过程是 "昂贵" 的:

  • 需要申请一块更大的内存空间
  • 把原有元素复制到新空间
  • 释放旧空间的内存

如果每次添加元素都只扩容 1 个单位,会导致频繁扩容(添加 n 个元素可能需要 n 次扩容),时间复杂度会退化到O(n²)(每次复制元素的成本累积)。

二、为什么选择 "翻倍扩容"(2 * _capacity)?

这是一种避免频繁扩容的优化策略:

  • 每次扩容时直接将容量翻倍,能保证后续多次添加元素都不需要再次扩容
  • 从数学上可以证明,这种策略能让单次添加元素的平均时间复杂度降为O(1)( amortized O(1))

例如:

  • 初始容量为 1,添加 1 个元素后扩容到 2
  • 再添加 1 个元素(总 2 个),下次添加时扩容到 4
  • 再添加 2 个元素(总 4 个),下次添加时扩容到 8
  • 以此类推,每扩容一次,能支持的新增元素数量也翻倍

这种 "批量扩容" 的思路,用少量的空间冗余换取了时间效率的极大提升。

三、为什么还要考虑 "_size + len"?

当一次性添加大量元素(len很大)时,如果固执地用 "翻倍扩容" 可能导致空间浪费

  • 假设当前容量_capacity=100,已存储_size=50个元素
  • 现在要一次性添加len=200个元素,此时_size + len = 250
  • 如果按翻倍扩容(2*100=200),容量仍然不够,还需要再次扩容
  • 因此直接扩容到_size + len(250),既满足需求又避免不必要的空间浪费

这是一种 "按需扩容" 的补充策略,防止在批量添加元素时出现 "扩容不足" 或 "过度扩容" 的问题。

四、代码本质

  • 小规模添加元素时,用 "翻倍扩容" 减少扩容次数,优化时间效率。
  • 大规模添加元素时,用 "按需扩容" 确保刚好够用,优化空间效率。
http://www.xdnf.cn/news/18058.html

相关文章:

  • 选择式与生成式超启发算法总结
  • 《设计模式》代理模式
  • 基于Python的电影评论数据分析系统 Python+Django+Vue.js
  • 【运维心得】三步10分钟拆装笔记本键盘
  • Langfuse2.60.3:独立数据库+docker部署及环境变量详细说明
  • 数据清洗处理
  • 【数据结构】深入理解单链表与通讯录项目实现
  • 【洛谷刷题】用C语言和C++做一些入门题,练习洛谷IDE模式:分支机构(一)
  • 典型 RAG实现:NFRA智能问答系统实战的总结与反思
  • 数据结构:迭代方法(Iteration)实现树的遍历
  • ubuntu更新chrome版本
  • 平滑方法(smoothing)
  • 零知开源——基于STM32F407VET6的TCS230颜色识别器设计与实现
  • 两个简单的设计模式的例子
  • 【轨物方案】预防性运维:轨物科技用AI+机器人重塑光伏电站价值链
  • JavaScript 核心语法与实战笔记:从基础到面试高频题
  • NLP:Transformer模型构建
  • 驱动开发系列63 - 配置 nvidia 的 open-gpu-kernel-modules 调试环境
  • ES操作手册
  • 在本地部署Qwen大语言模型全过程总结
  • Linux -- 线程概念与控制
  • 【DDIA】第三部分:衍生数据
  • AI优质信息源汇总:含X账号,Newsletter,播客,App
  • python中的reduce函数
  • 2025戴尔科技峰会:破局者的力量与智慧
  • [ CSS 前端 ] 网页内容的修饰
  • 低资源语言翻译:数据增强与跨语言迁移学习策略
  • 蛋白质设计新高度,RFdiffusion 实现从零设计高亲和力蛋白质
  • Redis核心应用场景及代码案例
  • wordpress忘记密码怎么办