【发布时间】:2017-01-25 20:08:15
【问题描述】:
我觉得我已经考虑了很多想法并尝试了很多东西。我设法解决了它,并产生了正确的值,但问题是它的时间效率不够高。它完成了 Kattis 测试中的 2 次,但由于超过了 1 秒的时间限制,第 3 次失败。恐怕我无法看到他们测试的输入是什么。
我从递归解决方案开始并完成了它。但后来我意识到它的时间效率不够高,所以我尝试改用迭代解决方案。
我从读取输入开始并将其添加到 ArrayList。然后我调用以下方法,目标为 1000。
public static int getCorrectWeight(List<Integer> platesArr, int target) {
/* Creates two lists, one for storing completed values after each iteration,
one for storing new values during iteration. */
List<Integer> vals = new ArrayList<>();
List<Integer> newVals = new ArrayList<>();
// Inserts 0 as a first value so that we can start the first iteration.
int best = 0;
vals.add(best);
for(int i=0; i < platesArr.size(); i++) {
for(int j=0; j < vals.size(); j++) {
int newVal = vals.get(j) + platesArr.get(i);
if (newVal <= target) {
newVals.add(newVal);
if (newVal > best) {
best = newVal;
}
} else if ((Math.abs(target-newVal) < Math.abs(target-best)) || (Math.abs(target-newVal) == Math.abs(target-best) && newVal > best)) {
best = newVal;
}
}
vals.addAll(newVals);
}
return best;
}
我的问题是,对于大量数据,有什么方法可以降低这个时间复杂度?
【问题讨论】:
-
你应该使用动态规划
-
从背包问题或基于子集和问题的算法(动态编程、分支定界;可能结合启发式算法)中获得灵感。这个问题很可能是 np-hard 问题,这意味着在给定通用算法的情况下存在一些非常困难(不可能解决)的实例。如果没有对实例的一些假设,就很难(根据经验)指导您进行禁食。
-
迭代与递归......这可以给你几个百分比的加速,在一些罕见的情况下可能更多......不值得做。更好的算法可能会将指数时间更改为例如二次 - 无限的胜利。
标签: java algorithm optimization iteration time-complexity