【发布时间】:2023-03-28 08:28:01
【问题描述】:
我试图了解从字符串数组中查找最长公共前缀的 D&C 方法的时间和空间复杂度是如何得出的。示例:字符串数组为 ["leet", "leetcode", "leeds","le"] 输出为 "le" 这是一个 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 = mn。时间复杂度为 T(n) = 2 T(n/2) + O(m)。因此时间复杂度为 O(S)。 空间复杂度:O(mlog(n))
我了解 T(n) = 2 T(n/2) + O(m) 的部分,但从那里他们如何将 m*n 导出为时间复杂度。对于空间复杂性,我认为我们正在考虑递归树的高度时间成本每个递归调用。
n 是数组中字符串的数量,m 是前缀的长度。
【问题讨论】:
-
该产品中的
m和n是什么? -
@Prune 感谢您的指出。我已经编辑了这个问题。 n 是数组中字符串的总数,m 是前缀的长度。在最好的情况下,m 是 minLength。
-
你可能在Computer Science上提问会更好。
-
除非您进行并行化,否则我认为与垂直扫描相比,分而治之绝对没有任何好处,垂直扫描更容易理解并且需要更少的空间。
-
@maraca 你是对的!这只是为了理解 D&C 范式及其复杂性分析。
标签: algorithm time-complexity divide-and-conquer space-complexity