stack dynamisch vergrößern
-
Das kommt auf den C++ Compiler (bzw. den Linker) an. Die gängisten Compiler besitzen dafür eine Option, um den Anfangsstack als auch den Maximalwert zu setzen (der Stack wird vom Betriebssystem dann dynamisch vergrößert).
Der Maximalwert beträgt meistens standardmäßig 1 MB (0x00100000).
-
Soweit ich weiß, gibt es einen dynamischen Stack nur unter den *nixen, unter Windows ist die Größe immer fest. Bei Visual-C++ kannst du dem Linker die Stackgröße mit /STACK:[Anzahl der Bytes] mitteilen...
Grüße,
Martin
-
achso ok.. danke schonmal im voraus
-
gib uns doch mal die wesentlichen Bestandteile des algos, vielleicht kann man den ja so umstricken, dass er iterativ verlaeuft oder anderweitig platzsparender ist.
-
äh.. danke für die info mein ich
-
hab mitlerweile einen anderen algorithmus im internet gefunden. Und die Rekursion war wirklich nicht zu lösen. Aber vielen dank für die Mühe
-
OT: *gruebel* gabs nichtmal irgendeinen Beweis, dass jede Rekusrion auch iterativ loesbar ist?
-
pumuckl schrieb:
OT: *gruebel* gabs nichtmal irgendeinen Beweis, dass jede Rekusrion auch iterativ loesbar ist?
Ja, die allgemeine Lösung läuft darauf hinaus, den Callstack der rekursiven Aufrufe in den Algorithmus zu integrieren

@Tom: Was war denn das für ein Algorithmus?
-
pumuckl schrieb:
OT: *gruebel* gabs nichtmal irgendeinen Beweis, dass jede Rekusrion auch iterativ loesbar ist?
Mag sein. Aber ich löse ehrlich gesagt rekursive Aufgaben besser rekursiv. Das geht Gehirnmäßig einfacher, als wenn man eine rekursive Aufgabe in iterativ umdenken muß.
Aber der Beweis würde mich schon interessieren, keine Frage.
-
was gibts da viel zu beweisen. bei jedem rekursiven funktionsaufruf werden lokale variablen und parameter auf den (call)stack gelegt. das macht man einfach selber, also (while)schleife und bei jedem durchgang die benötigten parameter auf einen eigenen stack.
-
Das war ein Algorithmus zur Berechnung einer convexen Hülle für eine Menge von Messwerten. Das Problem war folgender Code:
protected static void quicksort(int lo, int hi) { int i=lo, j=hi; Point q=p[(lo+hi)/2]; while (i<=j) { while (p[i].isLess(q)) i++; while (q.isLess(p[j])) j--; if (i<=j) exchange(i++, j--); } if (lo<j) quicksort(lo, j); if (i<hi) quicksort(i, hi); }Mir ist für diesen Fall leider keine Lösung mit einer Schleife eingefallen.
Und recursiver Code kommt nicht in Frage, weil die Anzahl der Messwerte nicht begrenzt ist. Können also auch viele Tausend sein.mfg Tom
-
Zum Glück ist Quicksort recht populär, da hat sich jemand schon Gedanken zu gemacht

//Quicksort iterativ (im Vergleich zur rekursiven Funktion ganz schön kompliziert) procedure sortieren(var aa:array of real;von,bis:integer); var p,i,j:integer; begin p:=bis; while p> 1 do Begin p:=p div 2; i:=von; repeat if aa[i+p]<aa[i] then BEgin tausche(aa[i],aa[i+p]); j:=i; while j-p>=von do BEGin if aa[j]<aa[j-p] then bEgin tausche(aa[j],aa[j-p]); j:=pred(j) eNd else j:=0; END; ENd; i:=succ(i) until i+p>bis End; end;Ist in Delphi und einfach von hier kopiert, vielleicht gehts ja.. Aber du musst wirklich viele Datensätze haben, ich hatte bei Quicksort noch nie einen Stack-Überlauf

-
Es geht jetzt nicht ernsthaft ums sortieren ...

-
Öhm, also ich hab jetzt eher an eine Baumstruktur gedacht, die ich durchlaufen muß oder so. Bei sowas kommt bei mir Rekursion höchstens zum Einsatz. Ach ja, zum Sortieren, benutze ich die Standardlib.

-
Nein Stop. So wie ich das sehe ist das nicht der quicksort zum auf- oder absteigenden sortieren von Zahlen. Dieser Code hier sortiert glaub irgendwie anders. Der Sortiert irgendwie die Werte relativ zu irgend einem anderen Wert.
-
TomTom85 schrieb:
Nein Stop. So wie ich das sehe ist das nicht der quicksort zum auf- oder absteigenden sortieren von Zahlen. Dieser Code hier sortiert glaub irgendwie anders. Der Sortiert irgendwie die Werte relativ zu irgend einem anderen Wert.
Stimmt, das ist einfach quicksort im Sinne von Point::isLess() - was sich im Grunde aufs gleiche rauskommt. Im Klartext: Wo normalerweise ein "if (a < b)" steht, steht hier ein "if a.isLess(b)" - vom Sinn her ists genau das selbe wie Zahlen sortieren.