Übungsaufgaben

Aufgabe: Datenraten verstehen

Informieren Sie sich im Internet über Maßeinheiten zur Angabe von Datenmengen und Datenraten wie MB oder Gbps.

Einige Firmen bieten Dienste an, die es erlauben, Daten online abzuspeichern und von überall mit einem Internetzugriff darauf zuzugreifen. Angenommen, eine solche Firma böte auch an, eine 1 TB Festplatte innerhalb von 24h mit einem Kurierdienst zuzustellen. Welche Datenrate müsste ein Internetzugriff mindestens bereitstellen, um die gleiche Datenmenge in der selben Zeit herunter zu laden?

Angenommen eine solche Firma verwendet zum Speichern der Nutzerdaten Container mit jeweils 2000 Servern mit jeweils 500 GB Speicherkapazität. Welcher Datenrate entspricht der 10-stündige Transport eines solchen Containers mit einem Lastwagen von einem Datenzentrum zu einem anderen?

Aufgabe: Prüfbits programmieren

Schreiben Sie eine python Funktion add_checksum(s), die einer gegebenen Zeichenkette, die nur Nullen und Einsen enthält, eine Null oder eine Eins anhängt, je nachdem, ob die urpsrüngliche Anzahl der Einsen gerade oder ungerade ist. Der Rückgabewert der Funktion soll also eine entsprechend um ein Zeichen längere Zeichenkette sein.

Implementieren Sie außerdem eine Funktion is_valid(s), die eine Zeichenkette aus Nullen und Einsen inklusive angehängter Prüfsumme auf Übertragungsfehler untersucht. Wenn ein Übertragungsfehler festegestellt wurde, soll die Funktion False zurück liefern, ansonsten True.

Geben Sie verschiedene Beispielaufrufe an und zwar solche ohne Übertragungsfehler, solche mit erkanntem Übertragungsfehler und solche mit unerkanntem Übertragungsfehler.

Bonusaufgabe: Prüfbits variabler Länge programmieren

Mit \(n\) Bits können wir \(2^n\) verschiedene Werte darstellen; eine Prüfsumme der Länge \(n\) erlaubt es also (im Besten Fall), \(2^n - 1\) falsch übertragene Bits zu erkennen, wenn wir der übertragenen Nachricht die Binärdarstellung der Anzahl der Einsen modulo \(2^n\) anhängen.

Erweitern Sie die Funktionen aus der vorigen Aufgabe um einen Parameter n, der die Länge der zu berechnenden Prüfsummen angibt. Für n = 2 sollen also zwei Bits wie beschrieben angehängt werden.

Geben Sie wieder Beispielaufrufe an, die:kumentieren, welche Übertragungsfehler erkannt werden und welche nicht.

Definieren Sie eine Funktion add_block_checksums(s,b,n), die in der Zeichenkette s (aus Nullen und Einsen) hinter jedem Block der Länge b eine Prüfsumme der Länge n einfügt. Falls die Länge von s kein Vielfaches von b ist, sollen im letzten Block Nullen vor der Prüfsumme angehängt werden. Definieren Sie außerdem eine Funktion has_valid_blocks(s,b,n), die eine so verlängerte Zeichenkette auf Übertragungsfehler überprüft.

Testen Sie Ihre Implementierung für b = 6 und n = 2 und dokumentieren Sie welche Übertragungsfehler erkannt werden und welche nicht.

Bonusaufgabe: Fehlerkorrektur programmieren

In einer vorigen Aufgabe haben Sie eine einfache Prüfsumme zur Fehlererkennung in python implementiert. Ein einfaches Verfahren, Fehler nicht nur zu erkennen sondern auch zu korrigieren, ist es jedes Bit einer Nachricht dreimal hintereinander zu verschicken. Aus der Nachricht 1011 wird also die Nachricht 111000111111. Falls einzelne Bits in dieser Nachricht gekippt werden, kann die ursprüngliche Nachricht trotzdem dekodiert werden, indem ein Dreierblock von Bits immer dann in eine 1 zurück übersetzt wird, wenn der Block mindestens zwei Einsen enthält.

Definieren Sie in python Funktionen encode und decode, die dieses Verfahren implementieren. Testen Sie es für einige Eingaben und geben Sie auch ein Beispiel an, bei dem die Rück-Übersetzung fehl schlägt.