【问题标题】:Longest Common Prefix - Divide and Conquer approach complexity analysis最长公共前缀 - 分而治之方法复杂性分析
【发布时间】: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 是前缀的长度。

【问题讨论】:

  • 该产品中的mn 是什么?
  • @Prune 感谢您的指出。我已经编辑了这个问题。 n 是数组中字符串的总数,m 是前缀的长度。在最好的情况下,m 是 minLength。
  • 可能Computer Science上提问会更好。
  • 除非您进行并行化,否则我认为与垂直扫描相比,分而治之绝对没有任何好处,垂直扫描更容易理解并且需要更少的空间。
  • @maraca 你是对的!这只是为了理解 D&C 范式及其复杂性分析。

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


【解决方案1】:

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

此外,每个 merge 都会执行一次 O(m) 操作,总共有 2*n-1 个操作。 2*n-1O(n)O(m) * O(n)O(mn)

够清楚了吗?

【讨论】:

  • 谢谢!这很有意义,但我们如何计算 2*n-1?
  • n 字符串已处理,然后(n-1) 合并。
猜你喜欢
  • 2021-10-18
  • 2013-05-28
  • 1970-01-01
  • 2013-04-14
  • 2021-11-27
  • 2021-09-11
  • 1970-01-01
  • 2022-11-22
  • 2019-10-05
相关资源
最近更新 更多