Aufgabe 5.1

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

Aufgabe 5.1
hallo , eigentlich ich konnte nicht verstehen was soöö das bedeuten
Ansonsten ist die Länge des nächst kleineren Gray-Codes durch die größte
2er-Potenz bestimmt, die kleiner len ist.??


2er Potenzen sind 1, 2, 4, 8, 16, 32, 64, 128, … usw und die größte davon die kleiner als len ist.

Als Beispiel: len = 720 die nächst größere 2er Potenz wäre 1024 und die nächst kleinere 512


Was wäre denn das Ergebnis für G_3? Könnte das mal jemand bitte explizit hinschreiben. Danke.

Edit. Um mal meine Frage genauer zu spezifizieren: Wie kann ein GrayCode der Länge 3 enstehen? (siehe public test 66, da wird als Ergebnis ein Array der Länge 3 erwartet …)


Nachdem G4 gegeben ist: 00 01 11 10
ist G3 identisch bis auf, dass der letzte Eintrag fehlt: 00 01 11.
Man tut so als würde man den graycode für die nächst höhere 2er Potenz bilden aber schneidet die überflüssigen Codes ab


Im Anschluss dazu:

Wie macht dann die Funktion aus der 5.1 a) (int prevLength(int len)) Sinn, in der der nächst kleinere Gray Code bestimmt werden soll? Bei ungeradem Eingabewert soll das laut Aufgabenstellung die nächst kleinere Zweierpotenz sein (was Sinn macht), aber bei geraden Eingabewerten soll man len durch zwei teilen. Das führt zu zwei Problemen:

  1. Der nächst kleinere Gray Code von 5 wäre 4 und von 6 wäre er 3. Damit wäre der nächst kleinere Gray Code von 5 grösser als der nächst kleinere Gray Code der grösseren Zahl 6? Das ist seltsam.

Dieses Beispiel passt nicht mit der Aufgabenstellung zusammen, da 720 gerade ist und daher durch zwei geteilt werden müsste: 360.

Ich mag es nicht, diese Annahme zu machen, aber ist also die Aufgabenstellung 5.1 a) falsch? Wenn der nächst kleinere Gray Code einfach immer die nächst kleinere Zweierpotenz ist, würde auch dieses Prinzip mehr Sinn machen:

Grüsse,
Che


Wieso ist das „seltsam“?

Das war (vermutlich) auch nur ein Beispiel für die nächst-kleinere Zweierpotenz und NICHT für das Ergebnis der Aufgabe a)…

Wenn euch der Induktionsgedanke so gar nicht behagen will, dann spinnt die Rechnung einfach weiter: Was ist (nach der echten a)) der nächst-kleinere Gray-Code von 720, dann der davon, dann der davon usw. bis zu einem Basisfall und wie bauen sich die Zwischenergebnisse (ausgehend vom Basisfall) danach wieder zur Gesamtlösung zusammen? (Tipp: Versucht es zuerst mit einer kleineren Startzahl ;))

NACHTRAG (zur Sicherheit): Bitte postet hier nicht die Lösung und auch keinen Lösungsansatz… :scared:


Wo steht das denn in der Aufgabenstellung, dass die letzten Gray Codes wegfallen? Ich finde die Aufgabenstellung hier sehr dürftig. Wenn es gewollt ist, dass die letzten Codes wegfallen, dann sollte das auch so formuliert werden.


!

Geht mal die Berechnung von G_8 und G_6 per Hand durch (mit dem in a) beschriebenen Prinzip für die Längenermittlung des nächst-kleineren Gray-Codes) und vergleicht die beiden miteinander.


Wenn ich den grayCode von Integer.MAX_VALUE generieren will bekomme ich eine outOfMemory Exception.
Muss man das abfangen?


Ich sehe drain nicht definiert, wie du den GrayCode zu ergänzen hast. Mit den hinteren Codes auffüllen? Mit den fortlaufenden?

Wie dem auch sei: Egal wie du es auffüllst, es handelt sich dann nicht mehr um einen GrayCode per Definiton (Zyklus).


Siehe dazu den Hinweis in den VL-Folien 5-17. Zyklische Gray-Codes sind natürlich nur bei einer Zweierpotenz als Länge möglich, für andere Fälle gelten dieselben Bedingungen, mit der Ausnahme, dass sich das erste und das letzte Wort um mehr als eine Stelle unterscheiden dürfen.

Und wie man aus einem Gray-Code mit Länge n/2 einen Gray-Code der Länge n baut, siehst du ab 5-18.

Die einzige Hürde, bei der man etwas nachdenken muss, ist bei einer ungeraden Länge. Aber auch da kann man sich mal ein Beispiel durchrechnen, dank der Teilaufgabe a) weiß man ja, welche Länge der vorherige Gray-Code hat.


Die Folien hatte ich mir angeschaut, da steht lediglich das es eine „erweiterte Gray -Code-Definition“ gibt, wie diese tatsächlich definiert wird, wird nicht erklärt. Auf Wikipedia habe ich dazu auch nichts gelesen. Wie soll man also darauf kommen, die letzten Codes einfach abzuschneiden?

Wie man den passenden Gray Code erzeugt, ist mir klar. Aber diese fehlende Information (abschneiden der zu viel erzeugten Codes) führt zu Problemen, die man mit einem kleinen Kommentar ohne Probleme umgehen könnte.


Es steht aus gutem Grund nicht auf dem Blatt, dass man einfach abschneiden soll…
Auf dem Blatt steht, dass man den neuen Gray-Code aus dem nächstkleineren Gray-Code erzeugen soll (Vorgehen hier: Siehe Folien). Welchen Code bräuchte man denn fürs Abschneiden? Stimmt dieses Vorgehen noch mit der Aufgabenstellung überein?
Es sind alle benötigten Informationen gegeben, man muss sie nur richtig verwerten.


Warum sollte es nicht drauf stehen?

Beispiel:

GrayCode für len=3 könnte sein: [00,01,10] oder [00,01,11]
GrayCode für len=5 könnte sein: [000,001,011,010,100] oder [000,001,011,010, 110]

Was heißt denn bitte in dem Kontext “um diesen anschließend zu einem Gray-Code G_len der Länge len zu erweitern”? Erweitern heißt für mich nicht notwendigerweise, dass ich die nächsten Gray Codes aus der Folge nehme, da ich so keinen zyklischen Gray Code mehr habe (siehe Beispiele oben).

Warum also um die Ecke etwas formulieren, wenn man es doch direkt formulieren kann? Das ist doch schon seit langem ein Problem in den AuD-Aufgaben.


Das heißt: Wende das Verfahren aus der Vorlesung an, mit dessen Hilfe man aus einem Gray-Code mit einer gewissen Länge einen neuen Gray-Code mit größerer Länge erzeugen kann.

Wie gesagt, zyklische Gray-Codes sind eh nur bei einer Zweier-Potenz als Länge möglich. Die Methode soll aber mit beliebigen Längen umgehen können.

Ich gehe mal davon aus, du meinst Wörter? Und wenn ja, aus welcher Folge?

„Etwas ist zu tun“ impliziert „Es steht auf dem Aufgabenblatt.“
„Etwas steht nicht auf dem Aufgabenblatt“ impliziert ?

[000,001,011,010,100] ist kein Gray-Code der Länge 5, da die letzten beiden Wörter zwei unterschiedlich belegte Stellen besitzen.

Und was genau in dem einen Satz, welcher die Funktionalität der Methode beschreibt, „um die Ecke“ formuliert sein soll, verstehe ich auch nicht so ganz.


Jopp! Du hast Gray-Codes verstanden! Was für ein Glück, dass du jedem, der nicht danach fragt, hier im Forum Nachhilfe in AuD anbietest…