eine Reihe von Zahlen arr und eine Reihe S, 4 verschiedene Zahlen in arr dieser Summe bis zu S.Bestimmung Big O: 4 verschiedene Zahlen in Array finden bis zu S Summieren
Schreiben Sie eine Funktion finden Gegeben das bekommt arr und S und gibt ein Array mit 4 Indizes solcher Zahlen in arr.
Die Lösung, die ich entwickelte, besteht darin, rekursiv Kombinationen von Indizes zu erstellen, während sichergestellt wird, dass keine Kombinationen mehr als einmal gezählt werden. Ich beschneiden auch den Suchbaum, indem sichergestellt wird die Größe der Lösungsmenge nicht mehr als 4.
#include <iostream>
#include <vector>
using namespace std;
bool find_sol(vector<int> &N, vector<int> &I, int S, int sum){
if (I.size() == 4)
if (S == sum)
return true;
else
return false;
for (int i = 0; i < N.size(); ++i){
if (I.empty() || I[I.size()-1] < i){
I.push_back(i);
if (find_sol(N,I,S,sum+N[i]))
return true;
else {
I.pop_back();
}
}
}
return false;
}
int main(){
int S = 23;
vector<int> numbers = {1,3,5,6,7,8,9};
vector<int> indices;
find_sol(numbers,indices,S,0);
// prints 0, 2, 5, 6
for (int i = 0; i < indices.size(); ++i)
cout << indices[i] <<" ";
cout<<endl;
return 0;
}
Wie kann ich die Laufzeit dieses Algorithmus bestimmen? Ich habe das Gefühl, es ist etwas wie O (n wähle 4), bin mir aber nicht sicher. Die Lösung sagt mir, die optimale Laufzeit ist O (n^2).
Sie möchten vielleicht um zu sehen, was Komplexität bedeutet. Es gibt kein 'O (4)'. – Olaf
@Olaf Ich meinte den Binomialkoeffizienten von nC4. – Kevin
O (nC4) ist O (n^4), also wird das nicht die Antwort sein. Das Problem kann in O (nS) Zeit gelöst werden. Ob das besser oder schlechter als O (n^2) ist, hängt davon ab, ob "S" größer oder kleiner als "n" ist. Weitere Informationen finden Sie unter [diese Frage] (https://stackoverflow.com/questions/4355955/subset-sum-algorithmus). – user3386109