Hallo,
Ich glaube, einen Fehler in der Musterlösung der Klausur vom April 2013 bei Aufgabe 6 gefunden zu haben. Soweit ich die Aufgabe richtig verstanden habe, entfernt man jeden Knoten, der nur einen Nachfolger hat, bis man keinen mehr hat, dann ist der Baum vollständig binär. Ich habe mir die Musterlösung zu dieser Aufgabe angesehen und denke, dass sie falsch ist. Wenn man einen richtigen rekursiven Algorithmus dazu haben will, muss dieser folgendes erfüllen:
1. Nach einen rekursiven Aufruf, ist der Teilbaum mit dem aufgerufenen Knoten als Wurzel vollständig binär (das ist offensichtlich)
2. Der als Parameter übergebene Knoten, außer der Wurzel, muss entweder 2 Nachfolger haben oder ein Blatt sein
3. Sollte die Wurzel des resultierenden Baumes nur einen Nachfolger haben, wird dieser Nachfolger als neue Wurzel gewählt
Die zweite Bedingung ist da, weil ein Knoten sich nicht selbst löschen kann, wenn er nur einen Nachfolger hat und gegen die Invariante verstößt. Gegen die Invarianten wird, wenn ich die Lösung richtig verstanden habe, aber mehrmals verstoßen:
In der Funktion reduceToCompleteness wird zwar einmal überprüft, ob die Wurzel nur einen Nachfolger hat und wenn ja, wird dieser als neue Wurzel gewählt, danach wird reduceToCompletenessRec(root) aufgerufen, aber nach dem Aufruf nicht überprüft, ob diese Wurzel auch einen Nachfolger hat (Vertsoß gegen die dritte Invariante).
In der Funktion reduceToCompletenessRec werden die NachfolgerKnoten des übergebenen Parameters gelöscht, wenn sie nur einen Nachfolger haben, es wird aber vor dem rekursiven aufruf aber nicht überprüft, ob der neue NachfolgerKnoten auch nur einen Nachfolger hat, sondern der neue Nachfolger wird direkt als Parameter übergeben (Verstoß gegen die zweite Invariante).
Das Problem könnte gelöst werden, indem man entweder erlaubt, dass reduceToCompletenessRec einen Rückgabewert hat oder man ruft die Funktion mit demselben Parameter rekursiv auf, wenn ein Nachfolgerknoten nur einen Nachfolger hat (Edit: nachdem man diesen Knoten natürlich gelöscht hat) und terminiert dann sofort (der rekursive Aufruf mit demselben Parameter hat schon alles erledigt, also ist nichts mehr zu tun).
Ich habe den Vorschlag in der Musterlösung übrigens getestet und er Funktioniert nicht auf Bäumen, bei denen mer als 2 aufeinander folgende Knoten nur einen Nachfolger haben, sondern löscht nur jeden zweiten und der resultierende Baum ist dann nicht vollständig binär.
Sollte ich mich geirrt haben, tut es mir leid, ich habe die Aufgabenstellung nicht verstanden und es würde mich freuen, wenn ich dann vor der Klausur aufgeklärt werde
LG
Musterlösung April 2013 Aufgabe 6
Gehe zu Forum
- Allgemeines
- ↳ Neuigkeiten
- ↳ Ankündigungen
- ↳ Studienberatung
- ↳ Aktive Fachschaft
- ↳ Allgemein
- ↳ Forumsanregungen
- ↳ Inforz
- ↳ Das Wesentliche
- ↳ Vor dem Studium
- ↳ Studieninteressierte
- ↳ Vorkurs
- ↳ Archiv
- ↳ Ophase
- ↳ Archiv
- ↳ Studium
- ↳ Allgemein
- ↳ Ausland
- ↳ Bachelorpraktikum
- ↳ Archiv
- ↳ RBG/Rechner
- ↳ Studienorganisation
- ↳ Teilzeitstudium
- ↳ Angebote
- ↳ Abschlussarbeiten
- ↳ Jobs
- ↳ Umfragen
- ↳ Veranstaltungen
- ↳ Sonstiges
- ↳ GnoM
- ↳ RPGnoM
- ↳ Offtopic
- ↳ TU Darmstadt Programming-Contest
- ↳ CrypTool
- ↳ Suche / Biete
- ↳ Archiv
- Pflichtveranstaltungen
- ↳ Grundstudium
- ↳ Aussagen- und Prädikatenlogik
- ↳ Archiv
- ↳ Algorithmen und Datenstrukturen
- ↳ AuD: Vorlesung
- ↳ Archiv
- ↳ AuD: Theoretische Aufgaben
- ↳ Archiv
- ↳ AuD: Arbeit mit Nabla
- ↳ Archiv
- ↳ AuD: Programmieraufgaben
- ↳ Archiv
- ↳ AuD: Rund um die Klausur
- ↳ Archiv
- ↳ Automaten, formale Sprachen und Entscheidbarkeit
- ↳ Archiv
- ↳ Betriebssysteme
- ↳ Archiv
- ↳ Digitaltechnik
- ↳ Archiv
- ↳ Einführung in den Compilerbau
- ↳ Archiv
- ↳ Funktionale und Objektorientierte Programmierkonzepte
- ↳ Archiv
- ↳ GdI 1: Vorlesung
- ↳ Archiv
- ↳ GdI 1: Übung
- ↳ Archiv
- ↳ GdI 1: Praktikum
- ↳ Archiv
- ↳ Mathematik für Informatik 1
- ↳ Archiv
- ↳ Mathematik für Informatik 2
- ↳ Archiv
- ↳ Mathematik für Informatik 3
- ↳ Archiv
- ↳ Rechnerorganisation
- ↳ Archiv
- ↳ Systemnahe und parallele Programmierung
- ↳ Archiv
- ↳ Weiterführende Pflichtveranstaltungen
- ↳ Architekturen und Entwurf von Rechnersystemen
- ↳ Archiv
- ↳ Computational Engineering und Robotik
- ↳ Archiv
- ↳ Computer-Netzwerke und verteilte Systeme
- ↳ Archiv
- ↳ Computersystemsicherheit
- ↳ Archiv
- ↳ Informationsmanagement
- ↳ Archiv
- ↳ Modellierung, Spezifikation und Semantik
- ↳ Archiv
- ↳ Software Engineering
- ↳ Archiv
- ↳ Visual Computing
- ↳ Archiv
- ↳ Nicht mehr angeboten
- ↳ FGdI 3
- ↳ Archiv
- ↳ GdI 3
- ↳ GdI 3: Vorlesung
- ↳ Archiv
- ↳ GdI 3: Übung
- ↳ Archiv
- ↳ GdI 3: Praktikum
- ↳ Archiv
- ↳ TGdI
- ↳ Archiv
- ↳ TGdI 1
- ↳ Archiv
- ↳ TGdI 2
- ↳ Archiv
- Wahlbereich
- ↳ IT-Sicherheit
- ↳ Einführung in die Kryptographie
- ↳ Archiv
- ↳ Elektronische Wahlen
- ↳ Embedded System Security
- ↳ Formal Methods for Information Security
- ↳ Archiv
- ↳ Forschungskurs "Angewandte Kryptographie"
- ↳ IT-Sicherheit
- ↳ Archiv
- ↳ IT-Sicherheits-Management
- ↳ Kryptographische Protokolle
- ↳ Multimedia Security
- ↳ Netzsicherheit
- ↳ Operating Systems
- ↳ Archiv
- ↳ Operating Systems II: Dependability and Trust
- ↳ Archiv
- ↳ Post-Quantum Cryptography
- ↳ Praktikum: CAPTCHAs
- ↳ Praktikum: Kryptographie
- ↳ Praktikum: Sichere Informationssysteme
- ↳ Praktikum: Smartphone-Sicherheit für Android Applikationen
- ↳ Praktikum in der Lehre: Informatik Ferienworkshop
- ↳ Privacy Enhancing Technologies
- ↳ Public Key Infrastrukturen
- ↳ Archiv
- ↳ Public Key Kryptoanalyse
- ↳ Archiv
- ↳ Quantenalgorithmen
- ↳ Secure, Trusted and Trustworthy Computing, Teil 1
- ↳ Seminar: PhD Seminar ITS
- ↳ Seminar: Post Quantum Kryptographie
- ↳ Seminar: Sicherheit in Car2Car-Kommunikation
- ↳ Seminar: Usable Security
- ↳ Verfahren zur automatischen Verifikation
- ↳ Netze und Verteilte Systeme
- ↳ Kommunikationsnetze 1
- ↳ Kommunikationsnetze 2
- ↳ Kommunikationsnetze 3: Mobilität in Netzen
- ↳ Archiv
- ↳ Peer-to-Peer und Grid Computing
- ↳ Archiv
- ↳ Peer-to-Peer II - Methods
- ↳ Archiv
- ↳ Praktikum: Internet
- ↳ Praktikum: Kommunikation in Peer-to-Peer-Netzen
- ↳ Praktikum: Peer-to-Peer-Middleware
- ↳ TK1: Rechnernetze, Verteilte Systeme und Algorithmen
- ↳ Archiv
- ↳ TK2: Web Engineering, Web Cooperation und E-Learning
- ↳ TK3: Ubiquitous / Mobile Computing
- ↳ Ubiquitous Computing in Geschäftsprozessen
- ↳ Robotik, Computational und Computer Engineering
- ↳ Algorithmen im Chip-Entwurf
- ↳ Archiv
- ↳ Compiler 1
- ↳ Archiv
- ↳ Compiler 2
- ↳ Archiv
- ↳ Echtzeitsysteme
- ↳ Eingebettete Systeme 1
- ↳ Eingebettete Systeme 2
- ↳ Geometrische Methoden des CAD/CAE
- ↳ Grundlagen der Robotik
- ↳ Hardwaremodellierungssprachen
- ↳ Lernende Roboter
- ↳ Mainframe Technologie
- ↳ Optimierende Compiler
- ↳ Archiv
- ↳ Optimierung statischer und dynamischer Systeme
- ↳ Archiv
- ↳ Praktikum: Adaptive Computersysteme
- ↳ Praktikum: Embedded Systems Hands-On 1
- ↳ Prozessorarchitekturen für rechenstarke eingebettete Systeme
- ↳ Archiv
- ↳ Rekonfigurierbare Prozessoren
- ↳ Seminar: Dynamisch und partiell rekonfigurierbare Architekturen
- ↳ Software-Systeme und formale Grundlagen
- ↳ Algorithmische Modellierung
- ↳ Applied Static Analysis
- ↳ Automated Code Analysis for Large Software Systems
- ↳ Automated Software Engineering
- ↳ Automated Theorem Proving
- ↳ Berechenbarkeitstheorie
- ↳ Archiv
- ↳ Concepts and Technologies for Distributed Systems and Big Data Processing
- ↳ Archiv
- ↳ Design and Implementation of Modern Programming Languages
- ↳ Designing code analyses for large software systems (DECA)
- ↳ Effiziente Graphenalgorithmen
- ↳ Enterprise Application Design
- ↳ Archiv
- ↳ Grundlagen des KI Planens
- ↳ Implementing code analyses for large software systems (ICA)
- ↳ Konzepte der Programmiersprachen
- ↳ Archiv
- ↳ Modellierungspraktikum
- ↳ Optimierungsalgorithmen
- ↳ Praktikum: Algorithmen
- ↳ Praktikum: Proof-Carrying-Code
- ↳ Archiv
- ↳ Programmanalyse und Transformation
- ↳ Secure Coding Lab
- ↳ Secure Software Development (SecDev)
- ↳ Seminar: Current Topics in Information Flow Security
- ↳ Seminar: Current Topics in Usage Control
- ↳ Seminar: Formale Spezifikation
- ↳ Seminar: Proof-Carrying-Code
- ↳ Archiv
- ↳ Seminar: Reading Group Runtime Monitoring
- ↳ Seminar: Reliable Security for Concurrent Programs
- ↳ Seminar: Softwaresystemtechnologien
- ↳ Software Engineering - Design and Construction
- ↳ Archiv
- ↳ Software Engineering - Projekt
- ↳ Archiv
- ↳ Software Engineering - Projektmanagement
- ↳ Software Engineering - Requirements
- ↳ Software Engineering - Wartung und Qualitätssicherung
- ↳ Archiv
- ↳ Software Engineering in industrial practice
- ↳ Archiv
- ↳ Static and Dynamic Program Analysis
- ↳ Archiv
- ↳ Technikgestaltung
- ↳ Type Systems of Programming Languages
- ↳ Web Services Technologien: Einführung, Komposition und Erweiterungen
- ↳ Visual & Interactive Computing
- ↳ Advanced Programming Techniques in Computer Vision
- ↳ Bildverarbeitung
- ↳ Capturing Reality
- ↳ Computer Vision
- ↳ Computer Vision 2
- ↳ Context-Awareness
- ↳ Einführung in die Computermusik
- ↳ Game Technology
- ↳ Archiv
- ↳ Geometric Algebra Computing
- ↳ Archiv
- ↳ Graphische Datenverarbeitung 1
- ↳ Archiv
- ↳ Graphische Datenverarbeitung 2
- ↳ Archiv
- ↳ Graphische Informationssysteme
- ↳ Informationsvisualisierung und Visual Analytics
- ↳ IT-Management und IT-Einsatz
- ↳ Probabilistische Graphische Modelle
- ↳ Programming Massively Parallel Processors
- ↳ Archiv
- ↳ Seminar: Probleme in Computergraphik und Computer Vision
- ↳ Statistisches Maschinelles Lernen
- ↳ Serious Games
- ↳ Archiv
- ↳ Virtual and Augmented Reality
- ↳ Archiv
- ↳ Web, Wissens- und Informationsverarbeitung
- ↳ Algorithms of Language Technology
- ↳ Business Intelligence and Data Warehousing
- ↳ Datenbanken 2
- ↳ Data Mining und Maschinelles Lernen
- ↳ Archiv
- ↳ Digitale Spiele / Digital Games
- ↳ Einführung in die Künstliche Intelligenz
- ↳ Innovative Operating System Elements
- ↳ Middleware
- ↳ Natural Language Processing and the Web
- ↳ Praktikum: Data-Mining
- ↳ Praktikum: Künstliche Intelligenz
- ↳ Praktikum: Question Answering Technologies Behind IBM Watson
- ↳ Semantic Web
- ↳ Seminar: Deep Learning for NLP and Speech
- ↳ Seminar: Knowledge Management in Web 2.0
- ↳ Web Mining
- ↳ Fachübergreifender Anteil
- ↳ Einführung in wissenschaftliches Arbeiten
- ↳ Archiv
- ↳ Nicht mehr angeboten
- ↳ Digital Storytelling
- ↳ Graphische Datenverarbeitung 3
- ↳ Archiv
- ↳ Grundlagen der Rechnertechnologie
- ↳ Grundlagen des CAE/CAD 2
- ↳ Mobile sichere Systeme
- ↳ Netzwerksicherheit
- ↳ Praktikum: Spielerische Edutainment-Anwendungen / Game Technology
- ↳ Archiv
- ↳ Rechnerarchitektur
- ↳ Rechnerentwurf und Mikroprogrammierung
- ↳ Archiv
- ↳ Robotik 0: Mobile und sensorgeführte Robotiksysteme
- ↳ Robotik 1: Grundlagen
- ↳ Archiv
- ↳ Robotik 2: Mobilität und Autonomie
- ↳ Archiv
- ↳ Seminar: Rechnerarchitektur
- ↳ Systementwurf mit Mikroprozessoren
- ↳ Archiv
- ↳ Seminar: Digital Storytelling
- ↳ Archiv
- Masterstudium
- ↳ Neben- und Anwendungsfächer
- ↳ Archiv
- ↳ Spezialisierungsmaster
- ↳ Abschlussarbeiten
- ↳ Studienorganisation
- Serviceveranstaltungen
- ↳ AI 1
- ↳ Archiv
- ↳ AI 2
- ↳ Archiv
- ↳ AI 3
- ↳ Archiv