【问题标题】:What is the Complexity of StringBuilder.ToString()StringBuilder.ToString() 的复杂性是什么
【发布时间】:2014-08-06 16:18:12
【问题描述】:

在 C# 中,StringBuilder.ToString() 的复杂度是多少?是 O(1)、O(N) 还是别的什么?

【问题讨论】:

标签: c# big-o stringbuilder


【解决方案1】:

不同的框架版本不同;在旧版本中StringBuilder 直接在string 上工作,因此.ToString() 没有额外费用:它只是直接将数据交给您(这可能意味着过大,但它可以工作);所以 O(1)。

在较新的框架版本中,它使用 char[] 后备缓冲区,所以现在当您 .ToString() 时,它可能需要复制 2 x Length 字节,使其成为 O(N)。

【讨论】:

  • 有趣。什么时候变了?哪些版本直接使用string
  • @MarcinJuraszek 我认为 3.5 vs 4.0,但我需要检查
  • 改变的原因是什么?
  • @MarcGravell 您误解了 SB 所做工作的复杂性。它只是一个大型缓冲区的包装器。实际上,它是一个 char 数组的链表,因为每个 SB 还具有对“前一个”字符串生成器的引用。基本上,当任何给定缓冲区空间不足时,它不会创建新缓冲区并复制现有内容(4.0 之前的方法),它会创建一个新缓冲区不复制任何内容,并且然后保留对“先前”缓冲区的引用。 ToString 遍历当前和所有以前的缓冲区,并将它们全部附加到一个巨大的缓冲区中。
  • @yazanpro 现在把它放在一个循环中,并考虑不必要的“footest”、“footesttest”和“footesttesttest”
猜你喜欢
  • 1970-01-01
  • 2012-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-28
相关资源
最近更新 更多