(für mich) kniffliges speicherproblem
-
hallo ich sitze seit tagen an einer extrem kniffligen sache, die ich erst posten wollte, die aber zu umfangreich ist, um sie wirklich anschaulich zu erklären. also will ich zwei lösungsversuche benennen und danach fragen, ob und wie es möglich wäre, diese umzusetzen.
ich habe eine folge von n zahlen und für diese folge muss ich viele berechnungen anstellen:
erstens habe ich anfangs einen array mit 1,2,3,4,5
dann muss ich aber berechnungen anstellen für
1,2,3,4,5
1,2,3,4
1,2,3
1,2
1dafür lege ich immer einen entsprechend langes array an.
das ist noch nicht das problem, aber:
ich muss nochmals die selben berechnungen durchführen für
2,3,4,5
2,3,4
2,3
2
und für
3,4,5
3,4
4
für
4,5
4
und für
5und alle diese ergebnisse müssen gespeichert werden, da ich sie mehrmals brauche...
allerdings habe ich zwei möglichkeiten,
ich berechne nur 1,2,3,4,5 ; 1,2,3,4; 1,2,3; 1,2; 1; und summiere später bei bedarf auf, dann spare ich mir das berechnen und speichern für 2,3,4,5,....,5
dann muss ich aber noch auf jeden arrayeintrag zurückgreifen könnenoder
ich berechne alles und wandle jede lösung in einen string um (da ich danach nicht mehr damit rechnen muss) lege es in vektoren ab und rufe die lösungen nach bedarf ab.
in beiden fällen weiß ich nicht, wie ich all die lösungen abspeichere, dass es erstens nicht allzu aufwändig wird und zweitens leicht wiederfindbar....
ich hoffe man hat mein problem verstanden und kann mir tipps geben
vielen dank im voraus.
-
Ich würde ein Array anlgegen.
Und zwar das Startarray: { 1,2,3,4,5 }
Und bei Bedarf auf das benötigte Element zugreifen.Wäre nett wenn du mal ein bisschen Code zeigen könntest, bzw. die Aufgabenstellung.
Ich steh nehmlich auf knifflige Sachen!!!
-
also um es nochmal ganz einfach zu sagen:
ich muss entweder
1.)
bei der arraylänge n n verschiedene arrays erzeugen und die unbekannt vielen lösungen für die n arrays abspeichern.wie oben, aber mit aufaddieren und in string umwandeln.
da wäre es kein problem, die lösungen einfach so zu speichern:
speicher[0]=1..., 2..., 3,... 4,...
speicher[1}=12..., 23....
speicher[3]=123..., 234..., 345...
speicher[4]=1234..., 2345...
speicher[5]=12345...,das wäre mit einem mehrdimensionalen vector kein problem, jedoch ist da das problem, wie ich einzelne elemente wieder finde... (da würde der anfang schon reichen bis zum ende, also zb von 123 ... bis ein element vor 234
-
ok,ich bin etwas vorangekommen.
ich versuche, die zweite möglichkeit umzusetzen.
also gibt es jetzt etwas code:
int n; int *arr; cin >> n; std::stringstream str; vector<vector<string> > v ; do { v.push_back(vector<string>()); do { arr = new int[j+1]; do { do { funktion(arr,j+1); //funktion verändert array, was sie genau mach ist eig egal for (int i=0;i<j+1;i++) str << arr[i]; v[j].push_back(str.str()); str(""); }while(funktion!=fertig); for (int i=0;i<j+1;i++) arr[i]++; }while(arr[j+1] < j+1) j++; }while(j<n);so ungefähr will ich es machen.
also kann man sehen, wie und wo die elemente liegen.
was aber komplettes neuland für mich ist und worum ich um hilfe bitten würde ist:
im vector v[i][j] liegt dann in "zeile" i irgendwo das gesuchte element.
wie kann ich das finden?also beispielsweise
v[3]={ 123 132 312 213 345 543 534 }
und ich brauche die elemente 132 bis ein element vor 543ich habe wirklich überhaupt keine ahnung, daher frage ich und bitte ich um hilfe.
vielen dank im voraus!
-
Die Konvertierung in Strings ist sehr ineffizient.
Sind deine Funktionsergebnisse auch vom Typ int?
-
Kniffel schrieb:
Die Konvertierung in Strings ist sehr ineffizient.
Sind deine Funktionsergebnisse auch vom Typ int?ja, sind sie
also die konvertierung muss nicht unbedingt sein.ich muss die arrayeingräge nur verknüpfen und auf einen platz im vektor ablegen und ich muss diesen eintrag wiederfinden (aber durch den eintrag selbst nicht durch den index)
-
klaus-ludwig schrieb:
Kniffel schrieb:
Die Konvertierung in Strings ist sehr ineffizient.
Sind deine Funktionsergebnisse auch vom Typ int?ja, sind sie
also die konvertierung muss nicht unbedingt sein.ich muss die arrayeingräge nur verknüpfen und auf einen platz im vektor ablegen und ich muss diesen eintrag wiederfinden (aber durch den eintrag selbst nicht durch den index)
also kann es auch andere wege geben, welchen aber, weiß ich nicht...
-
Ja, vom Typ int. Ich habe deinen Quellcode noch nicht gesehen, als ich die Antwort geschrieben habe.
Wenn ich das richtig sehe, werden die Ergebnisse direkt in den Arrays gespeichert?
-
So könnte man die Elemente indizieren:
#include <stdio.h> #define N 5 int main() { int i, j=1, k=1; int arr[ ( N * ( N + 1 ) ) / 2 ]; for ( i = 0; i < ( N * ( N + 1 ) ) / 2; i++ ) { if ( j > N ) { k++; j = k; puts(""); } arr[i] = j; j++; printf("%d ", arr[i] ); } return 0; }
-
vielen dank.
nein, die es ist so:
array= ( 0 1 2 )
str << (012)
v[2].push_back(str.str)
also in etwa
v[0][0]=0
v[0][1]=1
v[1][0]=01
v[1][1]=10
v[2][0]=012
v[2][1]=123
uswund dann ein bestimmtes element suchen, ohne index, da die v verschieden lang sind und ich irgendwo in der mitte einen eintrag brauche...
-
also ich habe mal einen versuch gemacht:
vector<vector<string> > v ; vector<string>::iterator p; v.push_back(vector<string>()); //vector füllen mit irgendwas p = find(v[0].begin(),v[0].end(), 123);da kommt aber eine fehlermeldung betreffend die letzte zeile "no match for operator..."
im grunde habe ich das gleiche gemacht, wie auf einer hilfeseite, aber ob das mehrdimensional so klappt, weiß ich nicht
-
-
klaus-ludwig schrieb:
was ich vergessen habe:
mit...
funktioniert es auch nicht...sorry
-
klaus-ludwig schrieb:
p = find(v[0].begin(),v[0].end(), 123);Wozu die Umwandlung in Strings?
int arr[X]; for ( i=0; i<X; i++ ) { ... if ( arr[i] == 123 ) ...
-
Nimm einen vector für alle Ergebnisse. In diesem Vektor kommen die Ergebnisse nach Länge von groß nach klein sortiert rein. Für einen Eingabevektor { 1, 2, 3, 4 } sieht das result array so aus:
//Die Elemente der Länge 4 result[0] = berechne { 1, 2, 3, 4 } //Die Elemente der Länge 3 result[1] = berechne { 1, 2, 3 } result[2] = berechne { 2, 3, 4 } //Die Elemente der Länge 2 result[3] = berechne { 1, 2 } result[4] = berechne { 2, 3 } result[5] = berechne { 3, 4 } //Die Elemente der Länge 1 result[6] = berechne { 1 } result[7] = berechne { 2 } result[8] = berechne { 3 } result[9] = berechne { 4 }std::vector<int> input_vector; std::vector<int> results(input_vector.size() * (input_vector.size() + 1) / 2); //Ergibt das Ergebnis der Berechnung von index start_index bis //start_index + length -1 int & result_element(int start_index, int length) { int n = input_vector.size() - length; int base = n * (n+1) / 2; return results[base + start_index]; } // Befüllen des Ergebnisses for (int length = 1; length <= input_vector.size(); ++i) for (int start = 0; start + length <= input_vector.size(); ++start_index) result_element(start, length) = berechne(start, length);
-
ich hab hier alles nicht gelesen
nur als ich die problemstellung sah - dachte ich sofort an eine liste {stack waere umstaendlicher}
einfach ein liste anlegen {std::} und dort die zahlen reinpackenund dann in ein loop
while(numbers available) foreach number in list do anything with the number remove file from list end while
-
vielen vielen dank für die vorschläge
ihr habt mir sehr geholfen, danke!hat mit der liste geklappt und mit pontos vorschlag.