LZW onderzoek

You might also like

Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 7

LZW-compressie in Clojure

Naam: Bastiaan van Kleef

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.

De onderzoeksmethode workshop wordt er gebruik gemaakt van de methode prototyping. Bij


prototyping wordt er zoals het woord al zegt een prototype gemaakt van de techniek waar je
onderzoek naar doet, door dit te gebruiken leer je over het onderwerp. Prototypes kunnen worden
gebruikt om de ideeën met de klant te bespreken, maar kunnen ook worden gebruikt om te testen hoe
goed een technologie in de situatie kan worden toegepast, voordat je je er volledig in stort.
(Prototyping - ICT Research Methods, z.d.). Ik hebben voor de methode prototyping gekozen, omdat
door middel van protoypen te maken al kennis op kunnen doen over hoe we deze code in het project
moeten gebruiken.

Deelvraag Gebruikte onderzoeksmethoden


Wat is LZW-compressie?  Literatuuronderzoek
 Prototyping
Wat zijn de verschillen tussen Clojure en Java?  Literatuuronderzoek
 Prototyping

2.2. Criteria bronnen


De bronnen die gebruikt worden voor het uitvoeren van dit onderzoek moeten volgens ons aan
bepaalde eisen voldoen. Hieronder staat een overzicht met waar de bronnen (deels) aan moeten
voldoen om volgens ons betrouwbaar te zijn:

 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.

3.2. Wat zijn de verschillen tussen Clojure en Java?


Naast de syntax wat altijd een duidelijk verschil is tussen de verschillende programmeertalen is tussen
Clojure en Java ook het grote verschil tussen Functioneel programmeren en Object Orientated
programmeren. Beide van deze programmeertalen runnen op een JVM-platform.

3.2.1. Functioneel programmeren


Clojure is een functionele programmeertaal de definitie hiervan is vooral dat er nooit globale objecten
worden gebruikt en geen echte entiteiten waar vaak naar gerefereerd wordt in classes bij Object
Orientated programmeren. Bij functioneel programmeren ligt de focus vooral bij het gebruiken van
functies deze functies kunnen wel een relatie met elkaar hebben zo kan een functie wel een andere
functie gebruiken, zodat er geen duplicate code komt. Hierbij kan je dus ook de SOLID principes
toepassen. Hoewel deze origineel zijn gemaakt voor OO (Object Orientated) programmeren kan het
ook toegepast worden op veel delen van het functioneel programmeren.
Bij het functioneel programmeren zijn vaak verschillende data belangrijk om een doel te kunnen
behalen. Dit kan je in een pipeline verdelen wat er precies nodig is en daarna kan je dit verdelen over
functies. Deze pipeline is hieronder zichtbaar.
(Amberle McKee, November 2023)

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

You might also like