Hallo,
ich brauche mal wieder eure Hilfe. Es geht um die Berechnung der Laufzeitkomplexität (O-Notation). Ich möchte damit Algorithmen vergleichen.
Meine erste Frage bezieht sich darauf, wie man die Komplexität eines Algorithmus berechnet, der von zwei Parametern abhängig ist. Hier mal ein Beispiel:
Wie man sieht, hängt die Anzahl der Aufrufe von "m" und "n" ab. Die Methode doSth() würde ja m*n-Mal aufgerufen. In welcher Komplexitätsklasse würde sich denn der Algorithmus befinden? Es hängt ja maßgeblich von der Größe von m ab. Ist m <= n, dann müsste die Komplexität quadratisch sein. Im Fall von m > n ist sie kubisch. Was nimmt man denn allg. für die Komplexität dieses Algorithmus an?
Meine zweite Frage betrifft ein weiteres Beispiel. Den Ablauf gebe ich in Pseudocode an:
Es gibt ein "spielfeld", das aus m Feldern besteht. Außerdem gibt es n Spieler. Für jeden Spieler werden zufällig Felder gewählt, die er im "spielfeld" belegen soll (Anzahl zufällig). Des Weiteren gibt es eine "zustandsListe", die an bestimmten Stellen im Algorithmus den Zustand des Spielfelds speichert.
Zu Beginn sind alle Spieler aktiv. Der Algorithmus wird solange ausgeführt, bis kein Spieler mehr deaktiviert wurde (erste while-Schleife). In der zweiten while-Schleife wird geprüft, ob der aktuelle Zustand des "spielfelds" in der "zustandsListe" steht. Ist das nicht der Fall, wird der aktuelle Zustand in die "zustandsListe" geschrieben. Jetzt wird das Spieler-Array durchlaufen. Für jeden aktiven Spieler wird geprüft, ob die Felder, die er im "spielfeld" belegen möchte, frei sind. Wird min. ein Feld von einem anderen Spieler blockiert, wird geprüft, welcher der Spieler dafür am günstigsten ist. Nur wenn der aktuelle Spieler (player) für alle blockierten Felder am günstigsten ist, wird er in das "spielfeld" eingetragen. Die Spieler, die ihn blockiert haben, werden vom "spielfeld" gelöscht.
Das wird so oft wiederholt, bis das "spielfeld" einen bereits bekannten Zustand angenommen hat. Daraufhin werden die Spieler, die jetzt noch im "spielfeld" stehen, deaktiviert, d.h. sie fließen nicht weiter in die Berechnungen mit ein. Für die noch aktiven Spieler werden wieder zufällig Felder gewählt, die sie belegen sollen. Die "zustandsListe" wird zurückgesetzt und alles beginnt von vorne.
Ich hoffe, dass ihr den Algorithmus halbwegs nachvollziehen konntet. Auch hier ist mein Problem die Berechnung der Komplexität. Ich habe keine Ahnung, wie ich mit den beiden while-Schleifen umgehen soll.
Ich hoffe, dass ihr mir ein paar Tipps geben könnt, wie man an das Problem rangeht.
Vielen Dank im Voraus!
ich brauche mal wieder eure Hilfe. Es geht um die Berechnung der Laufzeitkomplexität (O-Notation). Ich möchte damit Algorithmen vergleichen.
Meine erste Frage bezieht sich darauf, wie man die Komplexität eines Algorithmus berechnet, der von zwei Parametern abhängig ist. Hier mal ein Beispiel:
Code:
for(int i = 0; i < m; i++){
for(int j= 0; j < n; j++){
doSth();
}
}
Wie man sieht, hängt die Anzahl der Aufrufe von "m" und "n" ab. Die Methode doSth() würde ja m*n-Mal aufgerufen. In welcher Komplexitätsklasse würde sich denn der Algorithmus befinden? Es hängt ja maßgeblich von der Größe von m ab. Ist m <= n, dann müsste die Komplexität quadratisch sein. Im Fall von m > n ist sie kubisch. Was nimmt man denn allg. für die Komplexität dieses Algorithmus an?
Meine zweite Frage betrifft ein weiteres Beispiel. Den Ablauf gebe ich in Pseudocode an:
Code:
int[] spielfeld = new int[m];
Spieler[] spielerAry = new Spieler[n];
erstelle Spieler;
berechne Felder der Spieler;
ArrayList<int[]> zustandsListe = new ArrayList<int[]>();
while(min. ein Spieler deaktiviert wurde){
while(aktueller Zustand von spielfeld nicht in zustandsListe){
aktuellen Zustand von spielfeld in zustandsListe schreiben;
for(Spieler player : spielerAry){
if(min. ein Feld von player in spielfeld blockiert){
prüfe, ob player alle blockierten Felder günstiger erledigen kann als die eingetragenen Spieler;
if(player kann alle Felder günstiger erledigen){
lösche alle Spieler aus spielfeld, die player blockiert haben;
Felder von player in spielfeld blockieren;
}
}
}
}
alle Spieler, die in spielfeld stehen, deaktivieren;
für jeden aktiven Spieler neue Felder berechnen (diese Felder müssen im Spielfeld noch frei sein);
zustandsListe zurücksetzen;
}
Es gibt ein "spielfeld", das aus m Feldern besteht. Außerdem gibt es n Spieler. Für jeden Spieler werden zufällig Felder gewählt, die er im "spielfeld" belegen soll (Anzahl zufällig). Des Weiteren gibt es eine "zustandsListe", die an bestimmten Stellen im Algorithmus den Zustand des Spielfelds speichert.
Zu Beginn sind alle Spieler aktiv. Der Algorithmus wird solange ausgeführt, bis kein Spieler mehr deaktiviert wurde (erste while-Schleife). In der zweiten while-Schleife wird geprüft, ob der aktuelle Zustand des "spielfelds" in der "zustandsListe" steht. Ist das nicht der Fall, wird der aktuelle Zustand in die "zustandsListe" geschrieben. Jetzt wird das Spieler-Array durchlaufen. Für jeden aktiven Spieler wird geprüft, ob die Felder, die er im "spielfeld" belegen möchte, frei sind. Wird min. ein Feld von einem anderen Spieler blockiert, wird geprüft, welcher der Spieler dafür am günstigsten ist. Nur wenn der aktuelle Spieler (player) für alle blockierten Felder am günstigsten ist, wird er in das "spielfeld" eingetragen. Die Spieler, die ihn blockiert haben, werden vom "spielfeld" gelöscht.
Das wird so oft wiederholt, bis das "spielfeld" einen bereits bekannten Zustand angenommen hat. Daraufhin werden die Spieler, die jetzt noch im "spielfeld" stehen, deaktiviert, d.h. sie fließen nicht weiter in die Berechnungen mit ein. Für die noch aktiven Spieler werden wieder zufällig Felder gewählt, die sie belegen sollen. Die "zustandsListe" wird zurückgesetzt und alles beginnt von vorne.
Ich hoffe, dass ihr den Algorithmus halbwegs nachvollziehen konntet. Auch hier ist mein Problem die Berechnung der Komplexität. Ich habe keine Ahnung, wie ich mit den beiden while-Schleifen umgehen soll.
Ich hoffe, dass ihr mir ein paar Tipps geben könnt, wie man an das Problem rangeht.
Vielen Dank im Voraus!