栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

在类似StringBuilder的C模块中增加多少缓冲区?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

在类似StringBuilder的C模块中增加多少缓冲区?

在C#中,用于增长StringBuilder使用的内部缓冲区的策略已随时间而改变。

解决此问题有三种基本策略,它们具有不同的性能特征。

第一个基本策略是:

  • 制作字符数组
  • 当您的空间不足时,请为常数k创建一个包含k个其他字符的新数组。
  • 将旧阵列复制到新阵列,然后孤立旧阵列。

该策略存在许多问题,最明显的问题是,如果要构建的字符串非常大,则及时变为O(n
2)。假设k是一千个字符,最后一个字符串是一百万个字符。您最终将字符串重新分配为1000、2000、3000、4000 …,因此复制了1000 +
2000 + 3000 + 4000 + … + 999000个字符,总共复制了5000亿个字符!

该策略具有很好的属性,即“浪费”的内存量由k限制。

实际上,由于该n平方问题,很少使用此策略。

第二个基本策略是

  • 制作一个数组
  • 当您的空间不足时,请为常数k创建一个多k%个字符的新数组。
  • 将旧阵列复制到新阵列,然后孤立旧阵列。

k%通常是100%;如果是,则将其称为“装满时加倍”策略。

该策略具有很好的特性,即其 摊销 成本为O(n)。再次假设最后一个字符串是一百万个字符,并且您从一千开始。您以1000、2000、4000、8000
…复制,最终复制1000 + 2000 + 4000 + 8000 … + 512000个字符,总共复制了大约一百万个字符;好多了。

该策略具有以下特性: 无论您选择什么百分比 ,摊销成本都是线性的

这种策略有很多缺点, 有时复制操作会非常昂贵 ,并且 您可能在未使用的内存中浪费最终字符串长度的k%

第三种策略是创建一个数组的链表,每个数组的大小为k。当现有数组溢出时,将分配一个新数组并将其附加到列表的末尾。

该策略具有很好的特性:没有操作特别昂贵,总浪费的内存由k限制,您不需要能够定期在堆中定位大块。不利的一面是,最终将事物转换为字符串可能会很昂贵,因为链接列表中的数组可能位置不佳。

.NET框架中的字符串生成器过去曾使用过双重填充策略。现在,它使用了阻止链接列表策略。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/509214.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号