根据Time complexity of Java's substring(),java的子字符串需要线性时间。 有更快的方式(可能在某些情况下)? 我可能会建议迭代器,但怀疑它也需要O(n)。
val s1: String = s.iterator.drop(5).mkString
但迭代器上的几个操作比字符串上的相同操作要快,对吧?
答案 0 :(得分:5)
如果您需要编辑非常长的字符串,请考虑使用名为Rope的数据结构。
Cord
是一种有效的纯功能数据结构 存储和操作可能很长的String
。 与Rope[Char]
非常相似,但具有更好的常数因子和a 更简单的界面,因为它专门用于String
s。
答案 1 :(得分:1)
由于字符串是 - 根据linked question - 始终由唯一字符数组支持,substring
不能比O(n)快。您需要复制字符数据。
至于替代方案:至少会有一个操作是O(n)。在您的示例中,mkString
收集迭代器中的字符并从中构建字符串。
但是,我不会太担心。您使用高级语言的事实意味着(应该意味着)开发人员时间比您的特定任务的CPU时间更有价值。 substring
也是采用子字符串的规范方法,因此使用它会使您的程序更具可读性。
编辑:我也非常喜欢这句话(来自this answer):如果n不变大,O(n)就是O(1)。我从这里拿走了什么是:你不应该写低效的代码,但渐近的效率与现实世界的效率不一样。