Schattenläufer
10.10.2011, 21:10
Hallo, ich übe gerade auf meine Informatik-Klausur demnächst und bin wieder über diese Aufgabe gestolpert, bei der ich das letzte Mal unter Klausurbedingungen gescheitert bin...
Ein ungerichteter Graph ist in Adjanzenzmatrix-Darstellung (n x n) gegeben, die Matrix sei A. Man soll einen möglichst effizienten Pseudocode schreiben, der die Anzahl der Kreise der Länge 3 zählt.
Ich hab mir mal Gedanken dazu gemacht und eine Lösung erstellt, aber ich bin mir nicht sicher ob das effizient ist, und auch nicht ob es richtig ist. Ganz ehrlich, Adjazenzmatrix-Darstellung finde ich sehr unübersichtlich und ich bin auch einfach nicht gut darin, meine Ansätze zu verifizieren.
Hier ist jedenfalls meine Lösung:
int z = 0;
for (int i = 0; i < n; i++)
for (int j = i; j < n; j++)
if A[i][j] = 1
for (int k = 0; k < n; k++)
if A[j][k] = 1 AND A[k][i] = 1 then z++;
return z/3;
Was denkt ihr? Könnte das so stimmen? Und wenn ich das richtig überblicke, wäre die Laufzeit doch O(n³), oder? Das gilt ja als effiziente Laufzeit... aber ginge es noch besser?
Bedenkt die Klausurbedingungen. Ich habe mittlerweile eine Lösung gefunden, wo man die Matrix so oft mit sich multipliziert, wie der Kreis lang sein soll, und dann die Diagonale aufsummiert... das ist ja schön und gut, aber sowas fällt mir in einer Klausur nicht ein. :)
Ein ungerichteter Graph ist in Adjanzenzmatrix-Darstellung (n x n) gegeben, die Matrix sei A. Man soll einen möglichst effizienten Pseudocode schreiben, der die Anzahl der Kreise der Länge 3 zählt.
Ich hab mir mal Gedanken dazu gemacht und eine Lösung erstellt, aber ich bin mir nicht sicher ob das effizient ist, und auch nicht ob es richtig ist. Ganz ehrlich, Adjazenzmatrix-Darstellung finde ich sehr unübersichtlich und ich bin auch einfach nicht gut darin, meine Ansätze zu verifizieren.
Hier ist jedenfalls meine Lösung:
int z = 0;
for (int i = 0; i < n; i++)
for (int j = i; j < n; j++)
if A[i][j] = 1
for (int k = 0; k < n; k++)
if A[j][k] = 1 AND A[k][i] = 1 then z++;
return z/3;
Was denkt ihr? Könnte das so stimmen? Und wenn ich das richtig überblicke, wäre die Laufzeit doch O(n³), oder? Das gilt ja als effiziente Laufzeit... aber ginge es noch besser?
Bedenkt die Klausurbedingungen. Ich habe mittlerweile eine Lösung gefunden, wo man die Matrix so oft mit sich multipliziert, wie der Kreis lang sein soll, und dann die Diagonale aufsummiert... das ist ja schön und gut, aber sowas fällt mir in einer Klausur nicht ein. :)