时间复杂度我试图解决以下问题: 迭代和递归解决方案
我觉得我已经给了它很多的想法和尝试了很多东西。我设法解决它,并产生正确的价值,但问题是它不够高效。由于时间限制超过1秒,它完成了2次Kattis测试,并且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;
}
我的问题是,有没有一些办法,我可以减少这一个大量数据的时间复杂度?
你应该用动态规划 – Kelvin
获得基于knacksack-问题或子集和问题的算法(动态规划,分支定界;可能与启发式相结合)的启发。这个问题很可能是np-hard,这意味着在给定一个通用算法的情况下存在一些非常困难的(不可能解决的)实例。没有关于实例的一些假设,很难引导你到一个(经验上的)。 – sascha
迭代与递归....这可以给你几个百分点的加速,也许在一些罕见的情况下更多...不值得。更好的算法可以将指数时间改变为例如二次方 - 无限的胜利。 – maaartinus