字符串压缩算法的时间复杂度

时间:2016-04-30 17:46:41

标签: string algorithm time-complexity

我试图通过破解关于压缩字符串的代码采访书来做一个练习:

  

使用计数实现一个方法来执行基本的字符串压缩   重复的人物。例如,字符串aabcccccaaa将成为   a2blc5a3。如果“压缩”字符串不会小于原始字符串   string,你的方法应该返回原始字符串。

作者提出的第一个主张如下:

public static String compressBad(String str) {
    int size = countCompression(str);
    if (size >= str.length()) {
        return str;
    }
    String mystr = "";
    char last = str.charAt(0);
    int count = 1;
    for (int i = 1; i < str.length(); i++) {
        if (str.charAt(i) == last) {
            count++;
        } else {
            mystr += last + "" + count;
            last = str.charAt(i);
            count = 1;
        }
    }
    return mystr + last + count;
}

关于算法的时间复杂度,她说:

  

运行时为0(p + k ^ 2),其中p是原始字符串的大小,k是字符序列的数量。例如,如果字符串是aabccdeeaa,则有六个字符序列。它很慢,因为字符串连接在0(n ^ 2)时间内运行

我有两个主要问题:

1)为什么时间复杂度为O(p + k ^ 2),它应该只有O(p)(其中p是字符串的大小)没有?因为我们只进行p次迭代而不是p + k ^ 2.

2)为什么字符串连接的时间复杂度为0(n ^ 2)??? 我认为如果我们有一个string3 = string1 + string2,那么我们有一个复杂的大小(string1)+ size(string2),因为我们必须创建两个字符串的副本,然后再将它们添加到一个新的字符串(创建一个字符串)是O(1))。那么,我们将增加一个不是乘法,不是吗?对于数组来说不是一回事(例如我们使用了char数组)?

你能澄清这些要点吗?我不明白我们如何计算复杂性...

1 个答案:

答案 0 :(得分:0)

字符串连接是O(n)但在这种情况下它连接K次。 每次找到序列时,都必须复制整个字符串+找到的内容。例如,如果原始字符串中有四个总序列 获得最终字符串的成本将是:

(k-3)+ //first sequence
(k-3)+(k-2) + //copying previous string and adding new sequence
((k-3)+(+k-2)+k(-1) + //copying previous string and adding new sequence
((k-3)+(k-2)+(k-1)+k) //copying previous string and adding new sequence

因此复杂性为O(p + K ^ 2)