最长的共同前缀 - 分而治之的方法复杂性分析

时间:2018-03-22 18:43:03

标签: algorithm time-complexity divide-and-conquer space-complexity

我试图理解D& C方法如何从字符串数组中找到最长公共前缀的时间和空间复杂度。示例:字符串数组是[" leet"," leetcode"," leeds"," le"],输出将为& #34;文件"它是一个leetcode问题14

代码:

public String longestCommonPrefix(String[] strs) {
    if (strs == null || strs.length == 0) return "";    
        return longestCommonPrefix(strs, 0 , strs.length - 1);
}

private String longestCommonPrefix(String[] strs, int l, int r) {
    if (l == r) {
        return strs[l];
    }
    else {
        int mid = (l + r)/2;
        String lcpLeft =   longestCommonPrefix(strs, l , mid);
        String lcpRight =  longestCommonPrefix(strs, mid + 1,r);
        return commonPrefix(lcpLeft, lcpRight);
   }
}

String commonPrefix(String left,String right) {
    int min = Math.min(left.length(), right.length());       
    for (int i = 0; i < min; i++) {
        if ( left.charAt(i) != right.charAt(i) )
            return left.substring(0, i);
    }
    return left.substring(0, min);
}

在其网站上说明的复杂性分析 时间复杂度:O(S),其中S是数组中所有字符的数量,S = m n。时间复杂度是T(n)= 2T(n / 2)+ O(m)。因此,时间复杂度为O(S)。 空间复杂度:O(m log(n))

我理解T(n)= 2 T(n / 2)+ O(m)的部分,但从那里他们如何得出m * n作为时间复杂度。对于空间复杂性,我认为我们正在考虑每次递归调用所花费的递归树时间的高度。

n是数组中的字符串数,m是前缀的长度。

1 个答案:

答案 0 :(得分:1)

m * n复杂性来自 O(m)术语。它被复制(执行)n次:在每次迭代中,你将列表分成两半(按字符串数量n),向下挖掘直到你的基本案例每次执行一次n个字符串。每个都执行 O(m)操作。

此外,每个合并执行 O(m)操作,总共2*n-1次。 2*n-1 O(n) O(m) * O(n) O(mn)

这是否足够清楚?