如何找到程序的时间复杂度?

时间:2018-11-30 10:21:00

标签: java algorithm time-complexity

我找到了这段代码来计算字符串的切割“字符串切割的动态编程练习” 这个代码可以帮助任何人找到它的时间复杂度:

public static int findMinCutCost2(int[] m, int n) {
    if (m.length == 0)
        return 0;
    if (m.length == 1)
        return n;
    float half = n / 2f;
    int bestIndex = 0;
    for (int i = 1; i < m.length; i++) {
        if (Math.abs(half - m[bestIndex]) > Math.abs(half - m[i])) {
            bestIndex = i;
        }
    }
    int cl = 0, cr = 0;
    if (bestIndex > 0) {
        int[] ml = Arrays.copyOfRange(m, 0, bestIndex);
        int nl = m[bestIndex];
        cl = findMinCutCost2(ml, nl);
    }
    if (bestIndex < m.length - 1) {
        int[] mr = Arrays.copyOfRange(m, bestIndex + 1, m.length);
        int nr = n - m[bestIndex];
        for (int j = 0; j < mr.length; j++) {
            mr[j] = mr[j] - m[bestIndex];
        }
        cr = findMinCutCost2(mr, nr);
    }
    return n + cl + cr;
}

1 个答案:

答案 0 :(得分:1)

总复杂度为 O(nlog(n)) 。原因:因为实际上您是将每个数组分为两个部分,每个部分有 n次迭代。 最多有 log(n )个级别,并且每个级别上都有 n个循环。因此总复杂度为 O(nlog(n))

  

为简单起见,假设数组总是分成两半。如果不   甚至一半,它将处理第一部分(m.length-bestIndex)和第二部分   部分(最佳索引长度),总数组大小为-> n。

          n              -> n loop
         / \
        /   \
       n/2   n/2         -->n/2 + n/2 loop
      / \    ...
     /   \
   n/4   n/4