OEFENINGEN
bij
ALGORITMEN en GEGEVENSSTRUCTUREN

2008-2009

  • LES 1                          
  • SPLAYBOMEN                        25 september 2009

    Soms is het interessant om grafiekjes te kunnen bekijken. We laten uiteraard het eigenlijke werk, het tekenen van de grafiek, over aan iemand anders, en gebruiken een spreadsheet. Een voorbeeldje vind je in het programma zoekboomdiepte.cpp. Dit maakt een grafiek (wat die betekent zien we later, en slaat deze op in een bestand dieptedata.csv. Als je het programma laat lopen en dan dieptedata.csv inleest in je favoriete spreadsheet, zoals Excel of OpenOffice Calc, dan kan je met de diagramfunctie een grafiekje tekenen. Opmerking: dieptedata.csv is geschikt voor rekenbladprogramma's met een niet-Engelstalige instelling, waarbij vlottendekommagetallen worden voorgesteld met een vlottende komma. Hoe je een .csv-bestand produceert waar de vlottende komma vervangen is door een punt, vind je in de API van de klasse CsvData:

    De klasse CsvData wordt gedefinieerd in de header csv.h Elk object van de klasse komt overeen met één .csv-bestand, waarin getalwaarden worden opgeslagen. Vermits de meeste rekenbladen grafieken kunnen opmaken met verschillende gegevensreeksen, waarbij elke gegevensreeks standaard opgeslagen is in een kolom, slaat elke CsvData gegevens ook op deze manier op. De API is de volgende

    CvsData(const std::string& _bestandsnaam, char _scheidingsteken='.')
    Creëert een CsvDataobject. _scheidingsteken duidt aan welk teken geheel en fractioneel deel scheidt in een vlottendekommagetal. Defaultwaarde is '.', voor niet-Engelse rekenbladen dient ',' opgegeven te worden.
    template class<class T>
    voegDataToe(const std::vector<T>& nieuwedata)
    Voeg een kolom met numerieke waarden toe. T kan een willekeurig type zijn dat met static_cast<double> kan worden omgezet naar double.

    Binaire bomen kunnen door omstandigheden een zeer grote diepte bereiken. Een manier om dit te beperken is gebruik te maken van splayoperaties. Programmeer een afgeleide zoekboom (de oorspronkelijke boom zit in zoekboom.h, de nieuwe boom steek je in splayboomb.h, waarbij de eind-b bottom-up aanduidt) met een toevoegfunctie waarin splayen wordt gebruikt, en vergelijk de grafiek met deze van een gewone zoekboom. Je zal ook de hoofding puntgenerator.h nodig hebben.

    Bijkomende opgave:
    Gegeven twee binaire bomen die dezelfde sleutels bevatten, dan kan je de ene boom in de andere transformeren door rotaties uit te voeren. Maak een functie

    Binboom<Sleutel,Data>::kopieerstructuur(Binboom<Sleutel,Data>&)

    die controleert of het argument wel degelijk dezelfde sleutels bevat en, zoja, *this dezelfde structuur geeft als het afrument.

  • LES 3                          
  • ROOD-ZWARTE BOMEN                        2 oktober 2009

    Rood-zwarte bomen zijn altijd nogal evenwichtig. Je betaalt er wel een prijs voor: toevoegen en verwijderen is ingewikkeld. Voor we ze implementeren zijn hier een paar toepassingen om op papier op te lossen.

    De eerste oefening maakt duidelijk dat top-down- en bottom-upmethodes niet altijd hetzelfde resultaat opleveren. Bekijk de kleine boom.

    Verwijder de knoop met sleutel 8. Probeer het eerst bottom-up, daarna top-down. Verwijder ook eens 15: eerst bottom-up, dan top down.

    Bij de tweede oefening hebben we een zeer scheve boom:

    als l de diepte aan de linkerkant is, en r de diepte aan de rechterkant, dan is

    r=2l+1.

    Slechter kan niet bij een rood-zwarte boom, en elke bewerking zal de situatie verbeteren. Probeer maar: elke keer vertrekkend van de beginsituatie van de tekening moet je

    Bijkomende opgave: een doordenkertje.

    Een rood-zwarte boom is altijd nogal evenwichtig. Dat betekent dat je bij een willekeurige zoekboom niet altijd de knopen zo kan inkleuren dat je een rood-zwarte boom krijgt.

    Als je dit alles implementeert moet je een rood-zwarteboomklasse hebben. Omdat elke knoop een kleur heeft moet er dan in elke knoop een attribuut bijkomen. Ook treaps hebben een attribuut. Waarschijnlijk de meest eenvoudige manier om een gelijkaardige structuur (een binaire boom met de data ingepakt in een wrapper) te bekomen als bij zoekbomen is om een klasse BinboomMetKnoopdata<Sleutel,Data,Knoopdata> te maken. Als je echt zoveel mogelijk code wil bewaren, kan je deze laten overerven van de Binboomklasse:
    class BinboomMetKnoopdata<Sleutel,Data,Knoopdata>: public Binboom<Sleutel,pair<Data,Knoopdata> >