Professional Documents
Culture Documents
LZW onderzoek
LZW onderzoek
LZW onderzoek
Studentnummer: 1636376
Datum: 08-03-2024
0.1 Voorwoord
Voor u ligt het onderzoek naar LZW-compressie in Clojure, dit is een soort algoritme dat gemaakt is
met een functionele programmeertaal. In dit onderzoek gaan we bekijken hoe er met behulp van het
functioneel programmeren een LZW-compressie gedaan kan worden. Hierbij wordt gekeken naar
optimalisatie van de code maar ook dat dit uiterst alleen in functioneel programmeren gedaan
wordt. De stakeholder van dit onderzoek zijn Bastiaan van Kleef en de HAN.
0.2 Abstract
Om LZW-compressie te kunnen doen in Clojure moet rekening gehouden worden met de principes
van functioneel programmeren. Hierbij ligt de focus ervan vooral om de dictonary te maken die
karakters bijhoudt en aan elke volgorde een unieke code aan te geven. Hierbij vergelijkt hij op
decompression bij deze dictionary naar de code om deze opnieuw te kunnen maken.
1. Inleiding
De aanleiding voor dit onderzoek is gekomen vanuit een wens dat er getest moet worden met een
nieuwe programmeertaal. Hierbij is gekozen voor een LZW-compressie met Clojure. Uit dit
onderzoek moet blijken hoe ik dit moeten gaan implementeren. Clojure en LZW-compressie is iets
waar ik nog niet eerder mee heb gewerkt en zou dit onderzoek een goede uitleg moeten zijn hoe je
ermee moet werken. Als resultaat zal daarom ook een klein prototype gemaakt worden waarbij een
implementatie aanwezig is van de LZW-compressie. Daarnaast worden er ook vergelijkingen gemaakt
met andere technieken die mogelijk waren om dit te kunnen bereiken.
Voor dit onderzoek is de volgende hoofdvraag geformuleerd: “Hoe kan er een LZW-compressie
gedaan worden met behulp van Clojure?” Met behulp van deelvragen wordt er een antwoord
geformuleerd op deze hoofdvraag. Die te vinden zal zijn in de conclusie. Voor het onderzoeken van de
hoofdvraag zijn de volgende deelvragen opgesteld:
Wat is LZW-compressie?
Wat zijn de verschillen tussen Clojure en Java?
2. Methode
Het doel van dit onderzoek is om de hoofdvraag te beantwoorden die in de inleiding gegeven staat
met behulp van verschillende opgestelde deelvragen. Om dit te onderzoeken moet er voor het
onderzoek gebruik gemaakt worden van verschillende onderzoeksmethoden.
2.1. Onderzoeksmethoden
Voor het uitvoeren van het onderzoek is er gekozen om gebruik te maken van verschillende
onderzoeksmethoden. De gekozen onderzoeksmethoden zijn de bibliotheek en de workshop.
(Methods - ICT Research Methods, z.d.).
Van de onderzoeksmethode bibliotheek wordt er gebruikt gemaakt van de methode
literatuuronderzoek. Het literatuuronderzoek wordt uitgevoerd door op het internet op zoek te gaan
naar betrouwbare bronnen die helpen bij het beantwoorden van de deelvragen en uiteindelijk de
hoofdvraag. De criteria waaraan volgens ons de betrouwbare bronnen van dit onderzoek moeten
voldoen zijn te vinden in hoofdstuk 2.2 Criteria bronnen. (Literature Study - ICT Research Methods,
z.d.-b). Ik heb voor deze methode gekozen, omdat door middel van goede bronnen te gebruiken
betrouwbaar informatie vinden. Met deze informatie kunnen we een standpunt vormen wat we later in
het project kunnen gebruiken om op terug te vallen.
Er worden geen meningen gegeven door de auteur. Er moeten controleerbare feiten te vinden
zijn. Dit met als reden dat de bronnen objectief moeten zijn en niet subjectief. Meningen zijn
subjectief, wat als gevolg heeft dat een bron onbetrouwbaar wordt.
Document heeft als doel informeren of uiteenzetten en niet activeren, motiveren of betogen.
Dit met als reden dat informerende en uiteenzettende teksten objectief zijn en dus
controleerbare feiten bevatten. Activerende, motiverende of betogende teksten zijn subjectief.
Deze bevatten meningen, omdat de schrijver zijn mening geeft over het onderwerp en
eventueel de lezer hiervan probeert te overtuigen.
De bron is afkomstig van een site, persoon of bedrijf dat erkend is op dit gebied. Erkende
bronnen hebben voldoende kennis van het onderwerp en worden erkend als betrouwbaar door
grote groepen mensen.
Informatie moet niet aangepast kunnen worden door iedereen. Een beperkt aantal auteurs
moet toestemming hebben om de informatie te mogen wijzigen. Informatiebeperking aan de
bron op te leggen mogen alleen experts/kundige personen over de informatie gaan, waardoor
de kans groter is dat de informatie betrouwbaar en dus correct is.
3. Resultaten
3.1. Wat is LZW-compressie?
LZW-compressie is een data compressie algoritme dat is uitgevonden door Abraham Lempel. Het
doel hiervan is dan om dictionary te maken van 256 karakter dat dan overgezet kan worden naar de
data. Dit wetende zal dus ook betekenen dat LZW-compressie een O(n) notatie zal hebben. Data van
de LZW-compressie kan geencrypt en gedecrypt worden. Op deze manier kunnen lange strings in een
dictionary geplaats worden en omgezet naar een enkel karakter. Een nadeel dat wel aanwezig kan zijn
is dat als er veel unieke data aanwezig is dat de compressie erg groot zal worden, dus zal het het doel
van compressie missen.
3.1.1. Encryptie
Om te kunnen encrypten zal er eerst een dictionary aangemaakt moeten worden hierbij zullen de
karakters kunnen worden opgeslagen en worden opgehaald. Het algoritme werkt door het scannen van
de invoerreeks op achtereenvolgens langere subreeksen totdat er één wordt gevonden die niet in het
woordenboek staat. Wanneer een dergelijke string wordt gevonden, wordt de index voor de string
minus het laatste teken (de langste substring die zich in het woordenboek bevindt) wordt opgehaald
uit het woordenboek en naar de uitvoer gestuurd, en de nieuwe string (inclusief de laatste teken) wordt
aan het woordenboek toegevoegd met de eerstvolgende beschikbare code. Het laatste invoerteken
wordt dan gebruikt als volgende startpunt om te scannen op substrings (LZW Data Compression,
2014). Hieronder staat een afbeelding met het proces hoe een encryptie zal plaatsvinden.
3.1.2. Decryptie
Om te kunnen data te kunnen decrypten zal de eerder gemaakte dictionary opnieuw gebruikt moeten
worden en doorzocht. Daarbij zal ook een nieuw dictonary moeten worden aangemaakt om het te
kunnen vertalen deze wordt ook bekeken met het onderste gedeelte waarbij Is in dictonary wordt
gedaan.
Hiernaast is het ook erg belangrijk om declaratief te programmeren dit draait er dus om dat er
functies worden gemaakt en dat deze ook direct behoren met de benaming die daarbij zijn. Denk
hierbij aan een functie als in de eerdere afbeelding is aangegeven Read CSV. Dat deze alleen een csv
zal uitlezen.
Als laatste is ook immutable data erg belangrijk voor het functioneel programmeren dit kan er dan
voor zorgen dat data maar 1 keer wordt aangepast maar wel vaker in iets anders overgezet kan
worden.
4. Conclusie
De hoofdvraag die eerder werd gesteld was: “Hoe kan er een LZW-compressie gedaan worden met
behulp van Clojure?”. Om een LZW-compressie te kunnen maken moet het concept van Clojure eerst
goed begrepen worden als een functionele programmeertaal. Hierbij is het dus vooral belangrijk dat
de data een bepaalde richtlijn volgt. Hierbij kan de eerder gemaakte data pipeline gebruikt worden.
Hierdoor zullen er twee verschillende functies moeten worden aangemaakt. 1 van deze methode zal
voor de dictonary moeten zijn die aangemaakt moet worden. Dit zodat er altijd een functie altijd een
single responsibility heeft wat dus ook de eerdergenoemde SOLID principes volgt. Daarnaast is er
ook een algemene compress functie nodig. Deze functie zal bijdragen aan het compressen van de
string naar een code.
Er is eerder overwogen om de compress functie nog verder op te delen. Dit door de split point die
eerder werd aangegeven bij hoofdstuk 3.1.1. Echter is dit niet in een andere functie gedaan omdat het
dan variabele globaal zou gaan gebruiken waardoor de functie dus ook niet functioneel programmeren
zou zijn zoals eerder is aangegeven in hoofdstuk 3.2.1.
De volledige uitwerking van de code is te vinden in bijlage 1.
5. Discussie
Er waren ook alternatieven om de code te kunnen maken. Deze zijn echter niet gebruikt omdat ze niet
zo efficiënt zijn als de huidige code of omdat deze over complex waren om het volledige doel te
kunnen bereiken. Daarnaast is er ook een uitwerking (Bijlage 2) die niet volledig functioneel
geprogrammeerd is. Hierdoor volgt het ook niet volledig de standaarden van Clojure en zal het ook
niet volledig tellen als een werkende uitwerking.
6. Literatuurlijst
Methods - ICT research methods. (z.d.). ICT Researchmethods. Geraadpleegd op 4 Maart
2024, van https://ictresearchmethods.nl/Methods
Literature study - ICT research methods. (z.d.-b). ICT Researchmethods. Geraadpleegd op 4
Maart 2024, van https://ictresearchmethods.nl/Literature_study
Prototyping - ICT research methods. (z.d.). ICT Researchmethods. Geraadpleegd op 4
Maart 2024, van https://ictresearchmethods.nl/Prototyping
Dheemanth, H. N. (2014). LZW data compression. American Journal of Engineering.
Geraadpleegd op 5 Maart 2024, van
https://d1wqtxts1xzle7.cloudfront.net/33160414/C0322226-libre.pdf?
1394228836=&response-content-disposition=inline%3B+filename
%3DAmerican_Journal_of_Engineering_Research.pdf&Expires=1709902047&Signature=G
6NAnvy3SR8Jqb8aRXjk5icIKc9eM67tAgR8H-El7v~JleuG4h5x-
uxY0ZZ8yn1Nsefj9ZTbotmHjDK3hGbIiLJOFEa~y6AJUwJVhMNFY0QJWFou4sT4vEcNb
END-
ejE5EjXyeGgCWgGUJTJ8yCq2r5caEU6~CQAkBdqM7GPWGjRfvax5rBKXRBP3X0pysiB
teaBKNpYUUefWca4JNJUcm7e9XNsFeOba3qz6vUC4lASpnHJUe48ZHXwtM5ULCKaRu
WEb4hk~4E2PsyR22esenVHvGsOJkap1Zaf9adNHE2jJhgywWZrcVqgOU24FRqwD6SNhP
2a1jwyoOe5jQeq1A__&Key-Pair-Id=APKAJLOHF5GGSLRBV4ZA
Amberle McKee (November 2023). Functional Programming vs Object-Oriented
Programming in Data Analysis. Geraadpleegd op 7 Maart 2024, van
https://www.datacamp.com/tutorial/functional-programming-vs-object-oriented-programming