簡體   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