我找到了这段代码来计算字符串的切割“字符串切割的动态编程练习” 这个代码可以帮助任何人找到它的时间复杂度:
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;
}
答案 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