De presentatie wordt gedownload. Even geduld aub

De presentatie wordt gedownload. Even geduld aub

Instructie Programmeren Task 7 5JJ70. PAGE 2 Task 7: Hash Dictionary Het doel van deze opdracht is: Een structuur in het geheugen vullen met random zinnen.

Verwante presentaties


Presentatie over: "Instructie Programmeren Task 7 5JJ70. PAGE 2 Task 7: Hash Dictionary Het doel van deze opdracht is: Een structuur in het geheugen vullen met random zinnen."— Transcript van de presentatie:

1 Instructie Programmeren Task 7 5JJ70

2 PAGE 2 Task 7: Hash Dictionary Het doel van deze opdracht is: Een structuur in het geheugen vullen met random zinnen samengesteld uit een lijst woorden Je moet op een snelle manier kunnen bepalen of een bepaalde zin in het geheugen staat Je programma en geheugenstructuur moet te vullen zijn met een zeer groot aantal zinnen (1~4mln) binnen een redelijke tijd (minder dan ongeveer 30 seconden) Wanneer het zinnen dictionary leeggemaakt wordt, moet het gebruikte geheugen allemaal vrijgegeven worden Hierbij maak je gebruik van hashing

3 Task 7: Hash Dictionary – Random sentence De random sentence functie heeft de volgende vorm: void random_sentence(char * line) De functie neemt dus een pointer naar een plaats in het geheugen waar de random zin terecht moet komen als argument De random zinnen stel je samen uit een lijstje met woorden: const int NWORDS = 3; char* randWords[ NWORDS ] = {“BOM", “RITA", “WIMLEX"}; De random functie die in de opdracht genoemd wordt bestaat niet meer. Om een random getal tussen 0 en NWORDS -1 te genereren kun je het volgende gebruiken: #include int my_rand_nr = rand()% NWORDS ; Vervolgens kun je in een lusje iedere keer een random getal genereren. Dit getal gebruik je om je randWords array te indexeren en zo iedere keer een woord te selecteren PAGE 3

4 PAGE 4 Random woorden toevoegen aan de zin kan met behulp van strcat(): De hoeveelheid woorden die je in een zin stopt mag je zelf bepalen (zorg wel voor een redelijk aantal, anders zijn er te weinig verschillende zinnen) Je kunt ook gebruik maken van sprintf. Hiermee print je naar een variabele zoals je normaal naar het scherm print: Let op: De doelocatie en de bronlocatie van deze functies mogen niet overlappen, anders is het effect onvoorspelbaar: char str1[9] = "Test zin"; char dest[40] = ""; strcat(dest, str1); // dest bevat nu de string “ Test Zin ” strcat(dest, str1); // dest bevat nu de string “ Test ZinTest Zin ” strcat(dest, " einde"); // dest bevat nu de string “ Test ZinTest Zin einde ” Task 7: Hash Dictionary – Random sentence char str2[30]; int a = 3; sprintf(str2, "Dit is een test %d", a); // str2 bevat nu: "Dit is een test 3“ sprintf(str2, "str1: %s", str1); // str2 bevat nu: "str1: Test zin" char som[40] = “= 2"; sprintf(som, "1 + 1 %s", som);// som bevat "1 + 1 = = "

5 PAGE 5 Task 7: Hash Dictionary – Hashing Hashen kun je zien als het labelen van een zin binnen een bepaalde categorie. Zinnen die dezelfde hashwaarde opleveren worden samen gegroepeerd. Wil je weten of een string in het woordenboek staat, dan ga je kijken in de categorie die hoort bij de hashwaarde van die string. Vervolgens hoef je alleen binnen die categorie precies naar de inhoud van de string te kijken met string-compare. De hash functie bevat een “magic number” in de regel: hashval += *line+31*hashval; Dit nummer bepaalt de spreiding van je zinnen over de verschillende categorieën Test het effect van verschillende nummers, je kunt hier behoorlijk wat snelheidswinst halen!

6 PAGE 6 Task 7: Hash Dictionary – Hashing Het toevoegen van zinnen gaat via de volgende procedure: Genereer een random zin Hash deze zin Gebruik de hashwaarde om de categorie waar de zin thuishoort te bepalen Maak in deze categorie ruimte voor een extra pointer Maak ruimte voor de zin zelf Kopieer de zin in die ruimte Kopieer de pointer naar die zin in de extra ruimte in de categorie

7 PAGE 7 Task 7: Hash Dictionary – Geheugenstructuur De structuur wordt uitgelegd in de opdracht; lees deze goed door! Het functioneren van de structuur is afhankelijk van de 0 pointer die het einde van de lijst pointers in de categorieën staat, vergeet deze nooit! Haal de groottes van een lijst en de index van het laatste item niet door elkaar! Bijvoorbeeld: Het laatste item heeft index 3, de grootte van de lijst is 4 Wil je de lijst 1 groter maken aan de hand van de index van het laatste item (n), dan wordt de lijst dus (n+2) items groot. 0

8 Free de ruimte waar je pointers opslaat niet voordat je die pointers gefreed hebt! Je programma werkt wanneer: Het nooit crasht Het al het geheugen dat het alloceert ook weer vrijgeeft. Je kunt dit bekijken met de task manager. PAGE 8 Task 7: Hash Dictionary – Clear commando

9 Vooral het vrijgeven van geheugen kan erg lang duren. Door te kiezen voor de release configuratie wordt het geheugen management een stuk sneller alleen je programma is niet meer te debuggen. Zorg dus eerst voor een werkend programma, en test dan eens in de release stand. Run vervolgens je programma van buiten Visual C++. Dit geeft de snelste resultaten. Gebruik de versie uit de release map: Zorg dat je naar de steady state van je programma kijkt. Vlak na het opstarten gebruikt je programma vaak minder geheugen dan nadat het een keer gewerkt heeft, zie het voorbeeld op de volgende slides. PAGE 9

10 Startup geheugengebruik: In dit voobeeld: 7104kb Geheugengebruik na read : Bijv: kb PAGE 10 Task 7: Hash Dictionary – Clear commando

11 Geheugengebruik na clear: kb Geheugengebruik na 2e read commando: kb PAGE 11 Task 7: Hash Dictionary – Clear commando

12 Geheugengebruik na 2x clear: kb Dit is kleiner dan kb en dus waarschijnlijk correct. Het geheugengebruik van een programma kan fluctueren, maar mag nooit continu stijgen PAGE 12 Task 7: Hash Dictionary – Clear commando


Download ppt "Instructie Programmeren Task 7 5JJ70. PAGE 2 Task 7: Hash Dictionary Het doel van deze opdracht is: Een structuur in het geheugen vullen met random zinnen."

Verwante presentaties


Ads door Google