[英]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.