時間複雜度我試圖解決以下問題: 迭代和遞歸解決方案
我覺得我已經給了它很多的想法和嘗試了很多東西。我設法解決它,併產生正確的價值,但問題是它不夠高效。由於時間限制超過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