在字符串中插入的效率

Posted

技术标签:

【中文标题】在字符串中插入的效率【英文标题】:Efficiency of insert in string 【发布时间】:2012-01-09 07:36:31 【问题描述】:

我正在尝试为比 long long 更大的非常大的整数编写这个自定义加法类。我正在研究的一种方法是将整数保留为字符串,然后将字符转换为其 int 组件,然后添加每个“列”。我正在考虑的另一种方法是将字符串拆分为多个字符串,每个字符串的大小为 long long,然后使用字符串流将其转换为 long long 添加然后重新组合。

尽管我遇到了这样一个事实,即加法最容易反向完成以允许数字的结转。在这种情况下,我想知道字符串的插入方法的效率。似乎因为字符串是一个字符数组,所以所有字符都必须移到一个上。所以它会有所不同,但似乎效率是 O(n),其中 n 是字符串中的字符数。

这是正确的,还是只是幼稚的解释?

编辑:我现在已经回答了我的问题,但我想知道一个更有效的相关主题,将字符串插入流中然后提取到 int 中。还是做 10^n*char1+10^n-1*char2...等?

【问题讨论】:

不要将其保存在对显示有效的格式中,将其保存在对操作有效的格式中。当你想显示它时,你只想将它转换为字符串。 不要重新发明***。已经有一些库可以为您实现大整数,效率更高,并且已经过测试! 是的,我下载了 gmp 库,我只是不知道如何让它工作。另外,我认为做这样的事情将帮助我更多地了解比特、效率和其他东西。如果你们不这么认为,我很乐意继续提出任何其他建议。 @amit 对生产代码的好建议,但他可能只是为了好玩。 @emschorsch 考虑使用std::deque——它确实在 O(1) 的前后插入/删除。此外,以二进制形式存储多精度整数(对每个块使用完整整数)效率更高,并且使用相同的算法。 【参考方案1】:

据我所知,你是对的。 String 的 C++ 实现将在 O(n) 时间内执行插入操作。它将字符串视为字符数组。

对于您的数字实现,为什么不将数字存储为整数数组并转换为字符串仅用于输出?

【讨论】:

【参考方案2】:

std::string 的所有实际实现可能都是正确的。在这种情况下,您可能想要反向存储数字(尽管这在其他方面可能很笨拙),或者使用类似std::deque<char> 的东西。更好的是,使用std::deque<unsigned long long>,这将减少所涉及的操作数量。

当然,在实际使用中,您通常希望使用现有的库而不是滚动自己的库。

【讨论】:

那么出队只是列表的标准库实现吗? @emschorsch:没有。 deque 为随机访问元素和在任一端插入/删除提供恒定复杂度(列表在任何地方都具有恒定复杂度插入/删除,但对元素的线性复杂度随机访问)。

以上是关于在字符串中插入的效率的主要内容,如果未能解决你的问题,请参考以下文章

Vim插入模式实用技巧

mysql非空字段不允许插入空字符串怎么处理?

怎样使用list 得到redis中的map类型数据

MySQL数据库中的字段类型varchar和char的主要区别是什么?哪种字段的查找效率要高,为什么?

redis 列表list操作命令

sqlite数据库写入数据慢,有啥办法吗