Anzahl der Durchläufe einer Funktion errechnen

Mujahiddin

Top Contributor
Hallo, liebes Forum!
Es ist mehr ein Problem der Informatik und Algorithmik als ein javaspezifisches.
Es geht um folgende Funktion:
Java:
	public static void f(int[] a, int n) { //0
		if (n < 0) { //1
			g(); //2
			return; //3
		} //4
		int j = 0; //5
		while (j < a[n]) { //6
			h(); //7
			f(a, n - 1); //8
			++j; //9
		} //10
	} //11
Die erste Aufgabe besteht darin, eine Methode zu schreiben, die die Anzahl der Aufrufe von g() in Abhängigkeit von a und n zurückzugeben. Die zweite darin, das gleiche mit h() zu errechnen und zurückzugeben. Die Methoden wurden wie folgt implementiert und sind auch fehlerfrei:
Java:
	public static long countG(int a[], int n) {
		/* TODO a) */
		if(n>=a.length)return-2;
		long gCount = 1;
		for(int i=0; i<=n; i++){
			gCount *= a[i];
			if(gCount < 0)
				return -1;
		}
		return gCount;
	}

	public static long countH(int a[], int n) {
		/* TODO b) */
		if(n>=a.length)return-2;
		long hCount = 0;
		for(int i=0; i<=n; i++){
			hCount = hCount * a[i] + a[i];
			if(hCount < 0)
				return -1;
		}
		return hCount;
	}
Hier ist zu beachten, dass die Aufwände der Berechnungen nie größer als O(n) sein dürfen.
Die letzte Aufgabe verlangt, dass man errechnet, wie oft jede einzelne Zeile der Funktion f() durchgelaufen wird. Allerdings besteht das Problem darin, dass die Funktion, mit der man das errechnen darf, nur die Werte 'gCount' und 'hCount' als Parameter nimmt.
Zeile 0, 4, 10 und 11 bekommen die Zahl 0.
Zeile 1 wird immer aufgerufen, wenn auch h() aufgerufen wird und einmal beim ersten Durchlauf, also: hCount + 1
Zeilen 2 und 3 = gCount;
Zeile 5 = hCount - gCount +1;
Zeile 7 = Zeile 8 = Zeile 9 = hCount;

Die Frage ist jetzt, wie oft Zeile 6 aufgerufen wird (wie oft der Vergleich durchgeführt wird). Ich habe keinen Schimmer, wie ich das errechnen soll. Ich weiß nicht mal, ob das nur anhand von hCount und gCount möglich ist. Weiß irgendjemand weiter?
 

Marco13

Top Contributor
Auch wenn das NICHT das Ziel dieser Aufgabe ist: Im Zweifelsfall (falls niemand hier bereit ist, das durchzudenken) kann man dort einfach einen Zähler einbauen, und es dann mal laufen lassen, und schauen, ob man mit "reverse engineering" auf eine Lösung kommt :D
 

Mujahiddin

Top Contributor
Wo einen Zähler einbauen?
Also es sei noch anzumerken, dass weder die Funktionsnamen noch die Parameter verändert werden dürfen. Ich habe eine Funktion, die mithilfe des Arrays a und der Zahl n den genauen Wert liefert für die Anzahl der Vergleiche:
Java:
	private static long countW(long g, long h, int a[], int n){
		long w[] = new long[n+1];
		w[0] = -1 * a[0] + 1;
		for(int i=1; i<=n; i++)
			w[i] = w[i-1] * (a[i]) + 1;
		return w[n] + g + h;
	}
Ich bin mir nicht ganz sicher, was du mit Reverse Engineering meinst, aber für mich klingt das so, als würde man von der Methode 'countLines (long gCount, long hCount)' auf die Variable der Klasse Main zugreifen? Ist das überhaupt in Java möglich?
Also üblicherweise werden Arrays vom Typen {1, 2, 3, 4, 5} übergeben, und die Zahl n soll die Länge des Arrays beschreiben, aber es muss gewährleistet sein, dass die Funktionen mit allen möglichen Eingaben den richtigen Wert liefern. countG und countH sind insofern fehlerfrei, genauso wie die Funktion countW, die keine Verwendung finden darf. Allerdings bin ich nach langem Überlegen/Ausprobieren darauf gekommen, dass die Anzahl der Vergleiche eine gewisse Verbindung mit hCount und gCount hat. Und zwar:
(h+g)(1+p) / p = w
mit p = 5.1766335522
Ich fand heraus, dass ich somit auf die Zahl w (die Anzahl der Vergleiche in while) ziemlich oft mit hoher Genauigkeit komme. Leider wurde meine Illusion zertrümmert, als ich für das Array statt {1, 2, 3, 4, 5} Arrays wie {6, 12, 3} nahm. Beim ersten Array hatte ich eine 99% Genauigkeit, beim 2. Array lag die Rechnung um 500 daneben.
Ich nehme wirklich jede Lösung! :D
 

Mujahiddin

Top Contributor
Seltsam, ich kann meinen Eintrag nicht editieren:
Also, ich hab mir den letzten Post durchgelesen und gemerkt, dass Unklarheiten auftauchen können.
Die Methode aus dem letzten Post countW darf ich NICHT benutzen. Von der main-Methode (die ich nicht verändern darf - sonst gibt es 0 Punkte) wird auf die Methode countLines (long gCount, long hCount) zugegriffen und ich muss in der Methode countLines einen Weg finden, die Anzahl der Vergleiche in der while-Schleife zu errechnen.
Die Methode countW habe ich gepostet, weil Marco13 irgendwas von Reverse Engineering gesprochen hat.
Was ich sagen will: Wenn ich irgendwo die Liste der countG-Aufrufe (oder alternativ countH-Aufrufe) seit dem Start des Programms inklusive der übergebenen Parameter hätte und darauf zugreifen könnte, allerdings nur innerhalb der Funktion countLines, dann hätte ich eine suboptimale Lösung!
 

Mujahiddin

Top Contributor
ICH HAB DIE LÖSUNG GEFUNDEN!!!!!!!
NACH STUNDENLANGEM HERUMPROBIEREN HABE ICH ES HERAUSGEFUNDEN!
DIE LÖSUNG LAG MIR DIREKT VOR DER NASE UND ICH BIN STUNDENLANG FALSCH AN DIE SACHE RAN!
Ich bin überaus froh, so unglaublich froh, dass ich es mit diesem Forum teilen kann, denn diese Lösung bedeutet mir im Moment verdammt viel.
Mein Lösungsweg war folgendermaßen:
Wie gesagt, ich habe lange nach dem Falschen gesucht. Ich war der Meinung, dass die Abbildung von 'g, h' auf w nicht unbedingt eindeutig sein muss. Deshalb habe ich eine Funktion gebastelt, die alle möglichen Arrays in die Funktion countG() und countH() eingibt und überprüft, ob bei irgendzwei (kann man das so sagen?) Arrays g==g und h==h aber w!=w ist. Ich hab das Programm etwa 1 Stunde laufen lassen und er kam nach 1 Millionen verschiedenen Arrays auf nichts.
Dann hab ich mir mal die Daten genauer angeguckt und bin auf Folgendes gestoßen:
gCount liefert immer den Wert 0, wenn irgendein Element des Arrays 0 ist. Und da hat es Klick gemacht!
Kurz ausprobiert und bemerkt: Bei allen Arrays, bei denen ein Element 0 hat, ist g = 0. Somit muss ich nur noch die Beziehung zwischen h und w ausrechnen, und diese war leichter als gedacht:
w = h +1
(Übrigens sei an dieser Stelle angemerkt, dass mit w nicht die Anzahl der Vergleiche gemeint ist. Das w aus 'countW' nahm ja auch einen anderen Wert an, nur wurde am Ende w + h + g zurückgegeben, was die Anzahl der Vergleiche ist. Also w + h + g = #while (wenn man das so schreiben kann).)
Also, w = h + 1 wenn g = 0.
Das bedeutet, dass die gesamte Formel lauten muss:
a * g + h + 1 = w
Jetzt muss man einfach nur nach a auflösen:
a = (w-h-1)/g
Jetzt setzt man einige Zahlen ein und kommt auf a = -2
Daraus folgt:
w = -2g + h + 1
also
#while = w + g + h
lines[6] = w + g + h
QUOD ERAD DEMONSTRANDUM!
Ich bin so froh! :)
 

Marco13

Top Contributor
Na dann Glückwunsch :D

Deshalb habe ich eine Funktion gebastelt, die alle möglichen Arrays in die Funktion countG() und countH() eingibt und überprüft, ob bei irgendzwei (kann man das so sagen?) Arrays g==g und h==h aber w!=w ist. Ich hab das Programm etwa 1 Stunde laufen lassen und er kam nach 1 Millionen verschiedenen Arrays auf nichts.
Dann hab ich mir mal die Daten genauer angeguckt ...

Grob sowas meinte ich mit "reverse engineering". Wenn man irgendeine absurd-kompliziert geschriebene Funktion f(n) hat, und die dann für verschiedene n ausprobiert, und da dann 0, 1, 1, 2, 3, 5, 8, 13 rauskommt, wird es wohl die Fibonacci-Folge sein (und manchmal hilft's The On-Line Encyclopedia of Integer Sequences (OEIS) zu befagen). Natürlich ist es in diesem Fall nicht so leicht, es ging nur um das Prinzip, aus dem beobachteten Rückschlüsse darauf zu ziehen, was das denn sein könnte...
 

Mujahiddin

Top Contributor
Damit habe ich auch gCount gelöst.
Ich habe bemerkt, als ich die Funktion mit aufsteigenden Arrays gefüttert habe, dass n! rauskommt.
Bei hCount war es ähnlich, allerdings habe ich da ein wenig länger gebraucht:
1,4,15,64,325 ...
Hätte ich die Seite vorher, hätte sie mir sofort die Lösung verraten, aber alleine kommt man da auch ziemlich schnell rauf:
15 = (4+1)*3
64 = (15+1)*4
325 = (64+1)*5
usw.
Wenn man das jetzt in eine Formel packt, sieht das so aus:
...a5(a4(a3(a2(a1(a0+1)+1)+1)+1)+1...
Java:
long hCount = a[0];
for(int i=1; i<=n; i++)
	hCount = (hCount + 1) * a[i];
Mit dem w war's auf diese Weise aber nicht möglich. :D
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
BeginnerJava Anzahl der 5 % - Zuwächse ausgeben Allgemeine Java-Themen 6
M Wie übergebe ich den Zähler für die Anzahl Rekursionsschritte korrekt? Allgemeine Java-Themen 2
S BlockingQueue mit dynamischer Anpassung der Anzahl von Producer und Consumer Threads Allgemeine Java-Themen 1
S Iterable<?> anzahl der Element Allgemeine Java-Themen 14
M Java- Bild gewissen Anzahl von Sekunden anzeigen?! Allgemeine Java-Themen 4
F Best Practice Große Anzahl an Objekten speichern und lesen Allgemeine Java-Themen 19
M Relative Anzahl an verschachtelten Forschleifen Allgemeine Java-Themen 8
The Pi Anzahl der Gewichtscheiben berechnen Allgemeine Java-Themen 11
P Threads Parallelisierte DB-Abfragen mit variabler Anzahl an Threads Allgemeine Java-Themen 4
Soloeco BubbleSort Anzahl der Vertauschungen Allgemeine Java-Themen 9
J Anzahl geöffneter Plugins Allgemeine Java-Themen 3
A Anzahl an Threads Systemweit Allgemeine Java-Themen 2
J Anzahl von Möglichkeiten zur Verteilung von Kugeln in Behälter Allgemeine Java-Themen 3
P Erste Schritte Dynamische Anzahl von verschachtelten Schleifen Allgemeine Java-Themen 5
E ArrayList Anzahl der gleichen Elemente Allgemeine Java-Themen 4
R Int werte vergleichen und Anzahl Paare ausgeben Allgemeine Java-Themen 4
L Ermitteln der Anzahl an Lösungen von quatratischen Gleichungen (Sieb von Atkin) Allgemeine Java-Themen 1
L Anzahl der Tage eines Monats Allgemeine Java-Themen 3
P Auf die Anzahl der Joins achten beim WS design Allgemeine Java-Themen 1
J Anzahl der Zeichen bei Eingabe begrenzen Allgemeine Java-Themen 5
S Zur Laufzeit Klasse mit einer anzahl von X Objekten erstellen Allgemeine Java-Themen 5
M Eingabe von Arrays geht über gewünschte Anzahl hinaus Allgemeine Java-Themen 2
G Liste anzahl der gleichen Objekte Allgemeine Java-Themen 6
P Anzahl vo Einträgen in verschiedenen Sets Allgemeine Java-Themen 3
R Anzahl der gerade gedrückten Tasten Allgemeine Java-Themen 6
J ermitteln der Anzahl der Monate Allgemeine Java-Themen 7
G Anzahl Primzahlen im Intervall Allgemeine Java-Themen 3
X Textdatei auf gewünschte Anzahl der Zeilen kürzen Allgemeine Java-Themen 2
M Anzahl Farbwerte (RGB) im Array speichern - Problem Allgemeine Java-Themen 13
N variable Anzahl von Objektinstanzen zur Laufzeit erstellen Allgemeine Java-Themen 4
D unbekannte Anzahl checkboxes Allgemeine Java-Themen 2
TiME-SPLiNTER Unbekannte Anzahl serialisierter Objekte lesen Allgemeine Java-Themen 2
Iron Monkey Anzahl der Monate ermitteln Allgemeine Java-Themen 17
neonfly Anzahl Zeichen pro Zeile auf der Konsole Allgemeine Java-Themen 8
R ArrayList -- Maximale Anzahl an Elementen Allgemeine Java-Themen 2
O Große Anzahl Bilder laden Allgemeine Java-Themen 7
S Array: Anzahl Elemente mit best. Wert zählen Allgemeine Java-Themen 4
V Java-Objekt. wie groß maximal ? anzahl der einträge Allgemeine Java-Themen 4
M Aus Anzahl Tagen Datum ermitteln Allgemeine Java-Themen 8
M JTable: Anzahl Zeichen bei Eingabe Allgemeine Java-Themen 2
T Anzahl Tage zwischen zwei Daten - Stunde fehlt? Allgemeine Java-Themen 2
S Anzahl der Stunden in Excel Datei schreiben Allgemeine Java-Themen 2
G Anzahl an Tagen auf Datum addieren Allgemeine Java-Themen 4
MQue Anzahl der Ziffern Allgemeine Java-Themen 13
G Anzahl Tage in Datum umwandeln Allgemeine Java-Themen 13
MQue Anzahl der Kommastellen Allgemeine Java-Themen 6
L Anzahl Tage zwischen zwei Kalenderdaten Allgemeine Java-Themen 5
F Anzahl der nachkommastellen bestimmen nur wie? Allgemeine Java-Themen 10
M Aktualisieren eines Chatprofils (Anzahl Minuten) Allgemeine Java-Themen 4
G Variable Anzahl JTextfleder Allgemeine Java-Themen 3
S Bandbreite/Anzahl Pakete messen Allgemeine Java-Themen 3
V String formatiert ausgeben ( gleiche Anzahl von Ziffern ) Allgemeine Java-Themen 5
padde479 Anzahl Methodenaufrufe Allgemeine Java-Themen 7
J Matrix mit unterschiedlicher Anzahl von Spalten pro Zeile? Allgemeine Java-Themen 4
F Datum mit anzahl tagen berechnen Allgemeine Java-Themen 3
W PrepareStatement und Anzahl der Datensätze Allgemeine Java-Themen 2
rambozola anzahl zeichen in konsole eclipse begrenzt? Allgemeine Java-Themen 5
G anzahl "verwendeter" elemente eines arrays ermitte Allgemeine Java-Themen 2
M Anzahl der Threads pro Programm? Allgemeine Java-Themen 3
R java.lang.String maximale Anzahl der Zeichen Allgemeine Java-Themen 7
V Anzahl der Zeilen in einem File Allgemeine Java-Themen 3
K anzahl laufender Threads Allgemeine Java-Themen 3
O Text aus einer Textdatei rausholen, der zwischen zwei Schlüsselworten steht Allgemeine Java-Themen 4
V Umgang mit fehlenden Daten in einer Java-Datenanalyseanwendung Allgemeine Java-Themen 5
M Methodenübersicht einer Klasse einsehen Allgemeine Java-Themen 14
T JNA, Aufruf der Funktionen einer dll Allgemeine Java-Themen 5
I Vom Monolith zu Services in einer Webseite Allgemeine Java-Themen 1
W Variable Initialisierung mit dem Ergebnis einer Regex Allgemeine Java-Themen 1
O Werte einer Generic LinkedList zusammenrechenen Allgemeine Java-Themen 14
C Sortieren und Selektieren einer ArrayList<Point3D> Allgemeine Java-Themen 6
A Einzelne Objekte und Unterobjekte einer ArrayList ausgeben Allgemeine Java-Themen 53
TheSepp Wie kann man Leerzeichen aus einer Array liste entfernen? Allgemeine Java-Themen 10
B Ein Objekt einer Klasse mehreren anderen Klassen zur Verfügung stellen? Allgemeine Java-Themen 6
M Optimierung einer Methode (byte-Geraffel) Allgemeine Java-Themen 2
I Wie kann ich den Wert aus einer If abfrage ausgeben Allgemeine Java-Themen 23
S HTML einer Webseite 1:1 so bekommen wie es auch der Browser anzeigt? Allgemeine Java-Themen 14
melaniemueller Einzelne Zeile aus einer txt Datei in einem String speichern Allgemeine Java-Themen 12
L Java überprüfen lassen, ob sich ein gegebener Pfad / das Programm an sich auf einer CD oder Festplatte befindet Allgemeine Java-Themen 14
J (Geplante) Änderungen an einer Datei vorübergehend speichern und anwenden? Allgemeine Java-Themen 12
ME2002 Fragen aus einer Java Klausur Allgemeine Java-Themen 67
_user_q Obfuscate einer .jar-Datei mit ProGuard? Allgemeine Java-Themen 2
_user_q Verknüpfung einer .jar-Datei (liegt z. B. auf dem Desktop) im Autostart-Ordner erstellen? Allgemeine Java-Themen 20
C Parsen einer sich updatenden Html mithilfe von jsoup Allgemeine Java-Themen 4
E Eine Methode einer extendeten Klasse deakitivieren Allgemeine Java-Themen 12
H Performance einer Monte-Carlo-Simulation verbessern Allgemeine Java-Themen 6
LimDul Kam eine java.net.URL zu einer HashMap und ging als DNS Anfrage wieder heraus Allgemeine Java-Themen 18
E Variablen Nach Übergabe einer Variable den Constructor aufrufen Allgemeine Java-Themen 16
Zeppi NullPointerException in einer if-Abfrage Allgemeine Java-Themen 6
D Abbruch einer ViewScoped Bean in Arbeit Allgemeine Java-Themen 2
Lukas2904 Schleife mit ansteuerung einer Klasse Allgemeine Java-Themen 5
d.lumpi Aus Einer Klasse auf ein Objekt einer anderen Klasse Zugreifen Allgemeine Java-Themen 1
Lukas2904 Wie kann man cps (ClicksPerSecond) in einer GUI anzeigen lassen? Allgemeine Java-Themen 4
O Produziert das Tool "jpackage" (ab JDK 14) .exe Dateien, die auf einer Zielumgebung ohne JRE lauffähig sind ?` Allgemeine Java-Themen 7
R Lambda Expression in einer Methode execute() aufrufen (execute() ist eine Methode aus dem funktionalen Interface Command) Allgemeine Java-Themen 5
Drachenbauer wie kann ich alle instanzen einer Klasse durchsehen, ohne, dass diese in einer Liste erzeugt wurden? Allgemeine Java-Themen 11
N BlueJ Implementation einer Analoguhr Allgemeine Java-Themen 0
O Formatierte String ausgabe bei vier Variablen in einer Zeile Allgemeine Java-Themen 1
N Speicherort einer Datei im Explorer ändern Allgemeine Java-Themen 8
O Datentypen Wie kann ich den Typ einer ArrayList abfragen ? Allgemeine Java-Themen 7
O Leerzeichen und Umlaute im Pfad einer Java Applikation machen Probleme Allgemeine Java-Themen 13

Ähnliche Java Themen

Neue Themen


Oben