Stringbuilder子序列方法的时间复杂度

时间:2019-05-14 14:02:41

标签: java time-complexity

自Java 7开始,String子字符串方法已将其大的O从O(1)更改为O(n)。

StringBuilder subSequence方法的时间复杂度是多少?

2 个答案:

答案 0 :(得分:1)

java-11-openjdk中,AbstractStringBuilder.subSequence呼叫substring ...

public CharSequence subSequence(int start, int end) {
    return substring(start, end);
}

...几乎与具有相同名称的String的方法完全相同...

public String substring(int start, int end) {
    checkRangeSIOOBE(start, end, count);
    if (isLatin1()) {
        return StringLatin1.newString(value, start, end - start);
    }
    return StringUTF16.newString(value, start, end - start);
}

...调用newString,这将(在两种情况下)都复制后备数组,所以它也是O(n)。

public static String newString(byte[] val, int index, int len) {
    return new String(Arrays.copyOfRange(val, index, index + len),
                      LATIN1);
}

答案 1 :(得分:0)

我不知道您在哪里找到此信息。从O(1)到O(n)作为子字符串?

StringBuilder.subSequence(int start, int end)的复杂度与String.substring(int start, int end)的大致相同。

StringBuilder.subSequence(int, int)实际上会调用AbstractStringBuilder.substring(int, int)并调用public String(char value[], int offset, int count)来创建结果。

String.substring(int start, int end)使用相同的构造函数。

所以所有方法都具有相同的实现。

工作在字符串构造器中完成。它使用System.arrayCopy将字符从一个缓冲区复制到另一个缓冲区。因此,它不会为每个单个字符进行赋值(这将使其变为O(n),其中n不是输入的长度,而是子字符串的长度),而是使用高性能的系统函数复制一个内存块,比O(n)好得多。