scala中的快速子字符串

时间:2015-08-21 12:53:14

标签: string scala substring

根据Time complexity of Java's substring(),java的子字符串需要线性时间。 有更快的方式(可能在某些情况下)? 我可能会建议迭代器,但怀疑它也需要O(n)。

val s1: String  = s.iterator.drop(5).mkString

但迭代器上的几个操作比字符串上的相同操作要快,对吧?

2 个答案:

答案 0 :(得分:5)

如果您需要编辑非常长的字符串,请考虑使用名为Rope的数据结构。

Scalaz库有Cord类,它是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)。我从这里拿走了什么是:你不应该写低效的代码,但渐近的效率与现实世界的效率不一样。