繁体   English   中英

Java StringBuilder.substring()方法的时间复杂度是多少? 如果它是线性的,是否有一个恒定的时间复杂度方法来获得子串?

[英]What is the time complexity of Java StringBuilder.substring() method? If it is linear, is there a constant time complexity method to get a substring?

在我看来,它应该是恒定的(O(1))时间复杂度。 但是我被告知在调用stringBuilder.substring()方法时必须实例化一个新的String对象。 (这不是静态方法)。 如果这是真的,我怎样才能在恒定的时间复杂度内获得子串?

您不可能在常量时间内从StringBuilder创建String并保持其不变性。 此外,从Java 7 Update 25开始,即使String#substring()也是线性时间,因为结构共享实际上比它避免的更麻烦:巨大字符串的子字符串保留了对巨大char数组的引用。

在我看来,它应该是恒定的(O(1))时间复杂度。

这是不可能的。 由于Java字符串是不可变的,而StringBuilder是可变的,因此生成String所有操作都必须复制。

如果这是真的,我怎样才能在恒定的时间复杂度内获得子串?

你不能。 如果没有副本,更改子字符串中的字符会改变String ,这是不允许的。

StringBuilder的子字符串实际上将字符从起始索引复制到结束索引,因此它尝试对子字符串长度的字符进行数组复制(即end index-startindex)。 这将是此操作的时间复杂度O(substringlength),因为循环从起始索引到结束索引,这是无法避免的。 使用子字符串char [],将实例化字符串对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM