我试图理解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是前缀的长度。
答案 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)。
这是否足够清楚?