diff --git a/ov8/comp.py b/ov8/comp.py
index 3c949b921c5161622659fd3ceab2650510a81a2d..fd58e41396290e01c046f34efee0f3342f4d44d8 100644
--- a/ov8/comp.py
+++ b/ov8/comp.py
@@ -4,7 +4,7 @@ with open('./fil.txt') as file:
     tekst = file.read()
 
 
-
+extended_string = '¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ'
 
 
 def run_comp():
@@ -25,8 +25,12 @@ def run_comp():
             #add the remaing string
             output += text[-diff:len(text)]
             for j in text[-diff:len(text)]:
-                if j not in string.printable:
+                if j not in string.printable and j not in extended_string:
+                    extra_bytes_counter +=2
+
+                elif j not in string.printable:
                     extra_bytes_counter +=1
+
             #add the last counter for uncompresed chars 
             output = output[:tmp_index_to_store_counter] + f'[{(index + increment)-tmp_index_in_input+extra_bytes_counter}]' + output[tmp_index_to_store_counter:]
             return output
@@ -58,9 +62,11 @@ def run_comp():
         else: 
             #if substring not procesed, add letter to output and incremnet index
             output += text[index]
-            index +=1
-            if text[index] not in string.printable:
+            if text[index] not in string.printable and text[index] not in extended_string:
+                extra_bytes_counter +=2
+            elif text[index] not in string.printable:
                 extra_bytes_counter +=1
+            index +=1
 
 
 
@@ -131,7 +137,9 @@ while True:
         with open('./compresed', 'a') as file:
             #print(a[i + len_of_int+1:i + len_of_int+1+int1])
             for j in a[i + len_of_int+1:i + len_of_int+1+int1]:
-                if j not in string.printable:
+                if j not in string.printable and j not in extended_string:
+                    extra_bytes_counter2 += 2
+                elif j not in string.printable:
                     extra_bytes_counter2 += 1
             file.write(a[i + len_of_int+1:i + len_of_int+1+int1 - extra_bytes_counter2])
         i += len_of_int + int1 + 2 - extra_bytes_counter2
diff --git a/ov8/compresed b/ov8/compresed
index cd1eb46adffef74cc8a0c9e3ccbe6c9105076d57..0f608168368f1342d65afc7bb13058cee42ae82b 100644
Binary files a/ov8/compresed and b/ov8/compresed differ
diff --git a/ov8/dcomp.py b/ov8/dcomp.py
index 19b69ac6ef6567402fe3424baa2083db05bab4f0..e63141fd064ab2a3567466757e4660002b97e248 100644
--- a/ov8/dcomp.py
+++ b/ov8/dcomp.py
@@ -5,7 +5,6 @@ with open('./compresed', 'rb') as file:
 
 
 
-
 def dcomp():
     i = 0
     dcomp_string = ''
diff --git a/ov8/fil.txt b/ov8/fil.txt
index c377a654f297dcf537a10544c71b9c1d82bcc817..ac8fe2b20d5e1b3bfcb3809a519adff19b87f1a4 100644
--- a/ov8/fil.txt
+++ b/ov8/fil.txt
@@ -1,21 +1,824 @@
-Lorem ipsum dolor sit amet, consectetur adipiscing elit. In sollicitudin orci ac blandit mollis. Pellentesque nec dui accumsan, condimentum neque at, tempus libero. Morbi eleifend porta magna at tincidunt. Phasellus nisi ex, fermentum non dictum id, rutrum sit amet neque. Nulla id scelerisque nibh, sit amet ultricies dui. Praesent eget lacus ac velit faucibus viverra et sit amet turpis. Donec laoreet eu turpis non mattis. Etiam tincidunt sapien ac augue semper, at mollis lacus aliquam. Sed posuere dui arcu, eget volutpat odio malesuada sed. Morbi at tristique eros, sed luctus diam. Phasellus ut maximus erat. Pellentesque sed mi eget ligula ornare fringilla vitae a turpis. Ut commodo sollicitudin venenatis. Donec ut dictum velit, vel sollicitudin risus.
+Tekstsøk, Datakompresjon
 
-Vestibulum sit amet massa cursus felis iaculis tempor id quis est. Sed blandit magna non orci pharetra cursus. Pellentesque ultrices ornare volutpat. Vivamus fermentum et nisl sit amet congue. Praesent quis nibh at dolor lobortis eleifend ut eget arcu. Proin vestibulum luctus est eu volutpat. Nam a risus quis arcu dictum volutpat. Integer ultricies mauris at rutrum bibendum. Curabitur consequat accumsan augue, id hendrerit sapien molestie et. Fusce vitae consequat eros. Pellentesque sodales est velit, luctus pretium ante faucibus a. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Vestibulum tristique et augue ac lobortis. Duis varius ultrices condimentum.
+Helge Hafting
 
-Nulla consectetur mi a eleifend sodales. Sed eget egestas eros, in ultrices ex. Ut sagittis mauris eu quam efficitur pharetra. Donec et gravida lacus, ac aliquam nunc. Nulla hendrerit lectus quis porttitor efficitur. Proin sodales orci quis lectus dignissim, ac pulvinar neque tincidunt. Sed ultricies, dui sit amet malesuada venenatis, augue lectus sodales nunc, vel iaculis sem risus ut metus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Ut elementum dapibus quam, id condimentum eros suscipit eget. Nullam in ultrices orci, a ullamcorper neque. Sed nunc nulla, luctus vel felis non, venenatis eleifend sem. Curabitur lobortis erat et pellentesque cursus. Aenean suscipit lorem non tortor venenatis, ac rutrum orci vulputate. Fusce faucibus justo sit amet massa rutrum, et cursus risus dapibus. Sed ullamcorper, eros eu sagittis dictum, tellus ante fringilla nibh, vitae scelerisque erat nisl ac tellus.
+Institutt for datateknologi og informatikk
 
-Aenean eu ipsum rhoncus, imperdiet ex nec, laoreet lacus. Integer convallis posuere dignissim. Nunc placerat mi ultrices, suscipit erat sed, elementum lectus. Vestibulum diam mi, sodales vitae ornare in, tristique id risus. Mauris faucibus in massa nec interdum. Sed ac arcu et arcu vulputate ultricies. Mauris a iaculis purus. Nullam non euismod urna. Integer scelerisque, nunc quis bibendum porta, lacus mi porta tortor, id ultricies ligula erat dictum massa. Praesent pellentesque tortor justo, sit amet congue ipsum scelerisque vel. Phasellus in orci sit amet odio semper venenatis. Sed a vehicula tellus, ac condimentum tellus. Donec elit elit, elementum in metus at, iaculis condimentum urna. Cras tempor mi vel enim dictum, in porttitor erat consequat. In at velit mattis, consectetur mauris et, ultricies enim.
+Seksjon 1 Tekstsøk
 
-Suspendisse eget feugiat diam. Sed porttitor malesuada commodo. Suspendisse potenti. Nunc metus enim, mattis non massa in, malesuada pretium nisl. Vivamus volutpat consectetur est, sit amet elementum ligula volutpat nec. Donec ac rhoncus diam, ut sodales tellus. Aenean ornare, ante tincidunt tempus imperdiet, urna sapien convallis velit, in tincidunt enim mi eu ex. Nulla mattis fringilla sem id elementum. Morbi cursus nunc id tempor viverra. In fringilla lorem quis rutrum interdum. Maecenas lorem purus, fermentum nec iaculis in, lobortis cursus nulla. Pellentesque molestie, odio eu rhoncus congue, diam libero volutpat elit, quis cursus sapien odio nec nisi.
 
-Quisque sodales hendrerit nulla sed scelerisque. Aenean ornare, ligula et ultrices malesuada, nulla augue vulputate est, eget iaculis enim magna sit amet sapien. Nam dictum leo ligula, quis maximus magna egestas eu. Donec tempus eros ut lorem pulvinar mattis. Maecenas posuere ex sapien, et porttitor est accumsan sit amet. Proin auctor mattis ante, ullamcorper porttitor ligula imperdiet vel. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Quisque quis est tempor, vestibulum enim sit amet, venenatis sem.
 
-Etiam a nisl nulla. Phasellus rutrum sed massa nec tristique. Donec auctor hendrerit quam, nec accumsan diam tempor id. Curabitur aliquet cursus tellus, et sagittis erat pellentesque quis. Nunc ac sollicitudin odio, ut sagittis libero. Praesent lobortis pulvinar finibus. Nunc vel quam et ex consectetur maximus vitae vitae dolor. Suspendisse congue aliquet felis, luctus molestie libero porta vitae. Nunc eu vehicula orci. Ut varius ut tellus a tempus. Quisque scelerisque commodo lorem sit amet convallis. Ut tempor aliquam metus, a posuere tortor tincidunt sed.
 
-Fusce fringilla vitae velit eu interdum. Suspendisse dictum cursus lorem, non feugiat orci posuere a. Suspendisse potenti. Curabitur imperdiet sapien et justo posuere hendrerit. Donec tincidunt, est et semper porttitor, sem sapien cursus erat, id pellentesque tortor dolor sit amet quam. Fusce dictum ut libero vel laoreet. Quisque eleifend egestas pharetra. Nam posuere accumsan gravida. Fusce eget dui eu felis semper hendrerit. Nam non fringilla orci. Morbi gravida leo quis ipsum dignissim, et commodo augue euismod.
+  • Fritekstsøk i dokumenter, nettsider og lignende
 
-Suspendisse euismod id enim non blandit. Vivamus scelerisque volutpat massa, non tempus enim placerat nec. Proin at aliquet arcu. Curabitur commodo urna ut neque pretium, a scelerisque libero varius. Ut tempus mi vitae nunc ullamcorper molestie. Suspendisse sit amet varius tellus. Ut nulla nulla, pellentesque finibus diam sed, fermentum tincidunt lectus. Vestibulum in dignissim felis, sed mollis est. Maecenas eros dolor, pulvinar a ultrices ac, iaculis at lacus. Vivamus in tincidunt ligula.
+  • Fritekstsøk i databaser
 
-Pellentesque massa dolor, condimentum lacinia nibh at, condimentum interdum massa. Morbi a sollicitudin tortor. Aliquam malesuada nisl eu tortor interdum convallis. Vestibulum vitae facilisis neque, a consectetur magna. Vivamus eleifend sem enim, non varius justo volutpat sit amet. Curabitur ligula massa, cursus ac justo a, sagittis accumsan risus. In lobortis nisl nec lacus viverra, vel ullamcorper ante fermentum. Quisque viverra pulvinar porta.
+  • Søkemotorer
 
-Cras metus tortor, aliquet quis pretium at, pharetra porta est. Aenean in eleifend eros, non elementum urna. Praesent ullamcorper, quam luctus tristique mollis, elit ipsum gravida diam, sed gravida ex dui eu sem. Curabitur fermentum, lacus ac volutpat accumsan, lectus libero facilisis magna, a.
\ No newline at end of file
+  • Søke etter repeterte strenger for datakompresjon
+
+  • DNA-matching
+
+
+
+
+
+
+
+  Tekst: rabarbra     (lengde n)
+
+  Søkeord: bra     (lengde m)
+
+  Skyv søkeordet langs teksten, se om det passer
+
+
+    • tegn som passer, vises med fet skrift
+
+    • første feil med kursiv
+
+    • dobbeltløkke for n-m posisjoner, og m tegn i søkeordet. 
+
+  
+
+
+  Hele greia, O\left(n\cdot m\right),\Omega\left(n\right)
+
+  
+  Forsøk  | r  | a  | b  | a  | r  | b  | r  | a  
+----------+----+----+----+----+----+----+----+----
+    0     | b  | r  | a  |    |    |    |    |    
+
+  
+  Forsøk  | r  | a  | b  | a  | r  | b  | r  | a  
+----------+----+----+----+----+----+----+----+----
+    1     |    | b  | r  | a  |    |    |    |    
+
+  
+  Forsøk  | r  | a  | b  | a  | r  | b  | r  | a  
+----------+----+----+----+----+----+----+----+----
+    2     |    |    | b  | r  | a  |    |    |    
+
+  
+  Forsøk  | r  | a  | b  | a  | r  | b  | r  | a  
+----------+----+----+----+----+----+----+----+----
+    3     |    |    |    | b  | r  | a  |    |    
+
+  
+  Forsøk  | r  | a  | b  | a  | r  | b  | r  | a  
+----------+----+----+----+----+----+----+----+----
+    4     |    |    |    |    | b  | r  | a  |    
+
+  
+  Forsøk  | r  | a  | b  | a  | r  | b  | r  | a  
+----------+----+----+----+----+----+----+----+----
+    5     |    |    |    |    |    | b  | r  | a  
+
+  
+  Forsøk  | r  | a  | b  | a  | r  | b  | r  | a  
+----------+----+----+----+----+----+----+----+----
+    0     | b  | r  | a  |    |    |    |    |    
+    1     |    | b  | r  | a  |    |    |    |    
+    2     |    |    | b  | r  | a  |    |    |    
+    3     |    |    |    | b  | r  | a  |    |    
+    4     |    |    |    |    | b  | r  | a  |    
+    5     |    |    |    |    |    | b  | r  | a  
+
+
+
+
+
+
+
+
+  • Se på siste tegn i søketeksten først
+
+  • Hvis det ikke passer, flytt søketeksten så langt vi kan
+
+
+    
+     | r  | a  | b  | a  | r  | b  | r  | a  
+    -----+----+----+----+----+----+----+----+----
+      0  | b  | r  | a  |    |    |    |    |    
+      1  |    |    | b  | r  | a  |    |    |    
+      2  |    |    |    | b  | r  | a  |    |    
+      3  |    |    |    |    |    | b  | r  | a  
+    
+
+  • Hvis det passer, se på nestsiste osv.
+
+
+
+
+
+
+
+  • Hvis tegnet ikke fins i søketeksten, kan vi flytte m steg 
+    frem:
+
+  
+     | m  | e  | t  | e  | o  | r  | i  | t  | t  | s  | t  | e  | i  | n  
+  -----+----+----+----+----+----+----+----+----+----+----+----+----+----+----
+    0  | s  | t  | e  | i  | n  |    |    |    |    |    |    |    |    |    
+    1  |    |    |    |    |    | s  | t  | e  | i  | n  |    |    |    |    
+    2  |    |    |    |    |    |    |    |    |    | s  | t  | e  | i  | n  
+  
+
+  • Hvis tegnet fins til venstre i søkeordet, kan vi flytte ordet 
+    så det passer med teksten 
+
+  • Vi har vi en tabell for hvor mye vi kan flytte
+
+  • I praksis en tabell for hele alfabetet, hvor de fleste tegn 
+    gir et flytt på m. (Regel om «upassende tegn»)
+
+  • Tabellen lager vi ved å pre-prosessere søketeksten
+
+  • Tegn som fins i søketeksten, gir kortere flytt
+
+
+    – En «s» i siste posisjon gir flytt på m-1, fordi ordet 
+      starter på «s»
+
+  • \Omega\left(n/m\right) for søket. Mye bedre!
+
+
+
+
+
+
+
+  • Hvis tegnet ikke fins i søketeksten, kan vi flytte m steg 
+    frem,
+
+
+    – hvis mismatch var på siste tegn i søketeksten
+
+    – med mismatch på nestsiste tegn kan vi flytte m-1 steg
+
+    – ved mismatch på nestnestsiste, flytter vi m-2 steg osv.
+
+  
+     | m  | e  | t  | e  | o  | r  | i  | t  | t  | s  | t  | e  | i  | n  
+  -----+----+----+----+----+----+----+----+----+----+----+----+----+----+----
+    0  | m  | e  | n  | e  |    |    |    |    |    |    |    |    |    |    
+    1  |    |    |    | m  | e  | n  | e  |    |    |    |    |    |    |    
+  
+
+  • Vi trenger altså en todimensjonal tabell:
+
+
+    – En indeks er det upassende tegnet
+
+    – Den andre indeksen er posisjonen i søketeksten
+
+    – Verdien i cellen er hvor langt vi kan flytte fremover
+
+
+
+
+
+
+
+  For hver posisjon p i søketeksten
+
+     For hvert tegn x i alfabetet
+
+        let mot start i søketeksten fra p
+
+        hvis vi finner x etter i steg,
+
+        sett Tab[p][x] = i
+
+        hvis vi ikke finner x, Tab[p][x]=p+1
+
+
+
+
+
+
+
+  
+     | r  | e  | n  | n  | e  | n  | e  |   
+  -----+----+----+----+----+----+----+----+---
+    0  | e  | n  | e  |    |    |    |    |   
+    1  |    | e  | n  | e  |    |    |    |   
+    2  |    |    | e  | n  | e  |    |    |   
+       |    |    |    |    | e  | n  | e  |   
+  
+
+  • 0,1: Når siste posisjon treffer «n», kan vi bare flytte ett 
+    steg
+
+  • 2: Feil i første posisjon
+
+
+    – Regel om «upassende tegn» lar oss bare flytte ett hakk
+
+  • Regel om «passende endelse» lar oss flytte to hakk her
+
+  • «ne» passet, og «ene» overlapper med seg selv
+
+  • Vi slår opp både «upassende tegn» og passende endelse», og 
+    bruker regelen som gir det lengste hoppet. 
+
+
+
+
+
+
+
+  • Tabellen for «passende endelse»
+
+
+    – index er hvor mange tegn som passet
+
+    – verdien i cellen er hvor langt vi kan flytte
+
+  • Lages ved å prøve ut om søketeksten overlapper med seg selv
+
+
+    – ofte gjør den ikke det, og vi får lange hopp!
+
+
+
+
+
+
+  • Hvis vi søker etter «aaa» i «aaaaaa…», har vi dessverre O\left(n\cdot m\right)
+     
+
+    – søkeordet passer overalt, de samme a-ene sjekkes flere 
+      ganger
+
+  • Galil fant en måte å unngå unødvendige sammenligninger:
+
+    – Når vi flytter søkeordet kortere enn den delen av søkeordet 
+      vi allerede har sjekket, trenger vi ikke sjekke det 
+      overlappende området omigjen.
+
+    – Korte flytt skjer fordi søkeordet delvis matcher seg selv. 
+      Hvis det ikke hadde passet, hadde vi flyttet lenger. 
+
+  
+    Teksten     | .  | .  | .  | O  | l  | a  | l  | a  | .  | . |  . |
+    Mismatch O/a  |    |    | l  | a  | l  | a  | l  | a  |    |   |    |
+    Nytt forsøk   |    |    |    |    | l  | a  | l  | a  | l  | a |    |
+  
+
+  • Programmet trenger ikke sjekke den oransje regionen omigjen
+
+  • Dermed: O\left(n\right) og \Omega\left(n/m\right) for 
+    tekstsøk
+
+
+
+
+
+
+
+  • Boyer og Moore sin artikkel:
+
+
+    http://www.cs.utexas.edu/~moore/publications/fstrpos.pdf
+
+  • Wikipedia:
+
+
+    https://en.wikipedia.org/wiki/Boyer_moore_string_search_algorithm
+
+  • Animasjon (Fyll ut, og velg Boyer-Moore)     Trenger java
+
+
+    http://www.cs.pitt.edu/~kirk/cs1501/animations/String.html
+
+  • Demonstrasjon på Moore sin nettside:
+
+    
+http://www.cs.utexas.edu/users/moore/best-ideas/string-searching/fstrpos-example.html
+
+Seksjon 2 Mer om datakompresjon
+
+
+
+
+  • Enkleste form for datakompresjon
+
+  • En serie repetisjoner erstattes med et antall:
+
+    – ABIIIIIIIIIIIIBBBCDEFFFGH \rightarrow AB12I3BCDE3FGH
+
+    
+
+  • I praksis litt mer komplisert
+
+    – det kan jo være sifre i det vi komprimerer
+
+    – ser vanligvis på «bytes», ikke «tekst»
+
+    – må kunne skille mellom data og metadata
+
+      
+
+  • Eks., bruker negativ byte for ukomprimerte sekvenser:
+
+    – ABIIIIIIIIIIIIBBBCDEFFFGH \rightarrow 
+      [-2]AB[12]I[3]B[-3]CDE[3]F[-2]GH
+
+    – 25 byte ble redusert til 16
+
+      
+
+  • Kan ikke komprimere ABABABABABAB…
+
+
+
+
+
+
+
+  • Leser gjennom fila
+
+  • Input kopieres til output
+
+  • Hvis en lang nok sekvens kommer omigjen:
+
+
+    – dropp den, skriv heller en referanse til output
+
+    – format: repeter X tegn, som vi har sett Y tegn tidligere
+
+  • Hjelper hvis sekvensen er lenger enn en slik referanse
+
+  • Søker bakover i et sirkulært buffer
+
+  • Output kan komprimeres videre med Huffman-koding 
+
+
+
+
+
+
+
+  • Må være kompakt
+
+
+    – ellers kan vi ikke referere til korte strenger
+
+    – f.eks. 2–3 byte
+
+  • Å «se» langt bakover i datastrømmen, gir større sjanse for å 
+    finne repetisjoner.
+
+
+    – men også lenger kjøretid
+
+    – påvirker formatet på referansene våre
+
+
+      ∗ 1 byte kan peke 255 tegn bakover
+
+      ∗ 2 byte kan peke 65 536 tegn bakover
+
+      ∗ 3 byte kan peke 16 777 215 tegn bakover
+
+  • I blant kan vi ikke komprimere
+
+
+    – Må derfor også ha en måte å si:
+
+    – Her kommer X bytes ukomprimerte data
+
+    – Slik informasjon tar også plass!
+
+
+
+
+
+
+
+  • Vurdering:
+
+
+    – Skal dette være en del av en større ukomprimert blokk?
+
+    – Evt. bakover-ref + header for kortere ukomprimert blokk
+
+  • Det vi komprimerer må altså være lenger enn samlet lengde 
+    for:
+
+
+    – en bakover-referanse
+
+    – header for en ukomprimert blokk
+
+  • Vi komprimerer ikke svært korte strenger, det hjelper ikke!
+
+
+
+
+
+
+
+  • Eksempeltekst:
+
+
+    Problemer, problemer. Alltid problemer!
+Dette er dagens problem. Problemet er
+å komprimere problematisk tekst.
+
+  • Eksempeltekst med avstander:
+
+
+    Problemer,^{10} problemer^{20}. Alltid p^{30}roblemer!
+^{40}Dette er d^{50}agens prob^{60}lem. Probl^{70}emet er
+å ^{80}komprimere^{90} problemat^{100}isk tekst.^{110}
+
+  • 110 tegn, inkludert linjeskift og blanke.
+
+
+
+
+
+
+
+  • Eksempeltekst med avstander:
+
+
+    Problemer,^{10} problemer^{20}. Alltid p^{30}roblemer!
+^{40}Dette er d^{50}agens prob^{60}lem. Probl^{70}emet er
+å ^{80}komprimere^{90} problemat^{100}isk tekst.^{110}
+
+  • Komprimert:
+
+
+    [12]Problemer, p[-11,8][8]. Alltid[-18,10][17]!
+Dette er dagens[-27,7][2]. [-65,8][17]t er
+å komprimere[-35,8][12]atisk tekst.
+
+  • Før komprimering, 110 tegn. 
+
+  • Med 1 byte per tallkode, 84 tegn.
+
+
+    Vi sparte 110-84=26 tegn, eller 23%
+
+  • se også Lz-demo
+
+
+
+
+
+
+
+  • For hver tegnposisjon i input, må vi søke etter lengste match 
+    i bufferet.
+
+  • Fil med n tegn, sirkulært buffer med størrelse m.
+
+  • Teste alle posisjoner, i verste fall O\left(nm^{2}\right)
+
+  • I praksis går det bedre, særlig hvis data varierer en del
+
+  • Kan bruke Boyer-Moore tekstsøk for bedre kjøretid.
+
+
+
+
+
+
+
+  • Lempel og Ziv sin artikkel:
+
+
+    
+http://www.cs.duke.edu/courses/spring03/cps296.5/papers/ziv_lempel_1977_universal_algorithm.pdf
+
+  • Wikipedia:
+
+
+    https://en.wikipedia.org/wiki/Lempel\%E2\%80\%93Ziv
+
+
+
+
+
+
+
+  • LZ leser input, og skriver
+
+    – bakover-referanser
+
+    – sekvenser med ukomprimerte tegn
+
+  • ukomprimerte tegn telles opp, og komprimeres videre med 
+    Huffmannkoding
+
+
+
+
+
+
+
+  • Ligner LZ. Teoretisk samme kompresjon. Lettere å speede opp.
+
+  • Leser ett og ett tegn
+
+  • Bygger en ordliste (dictionary) underveis
+
+    – til å begynne med, alle 1-byte «ord»
+
+  • Finn et (lengst mulig) ord, skriv ordnummeret (med færrest 
+    mulig bits!)
+
+    – lagre nytt «ord» = dette ordet + neste tegn
+
+  • Kompresjon hvis ordene blir lengre enn numrene
+
+  • LZW+Huffman \rightarrowDeflate (brukt i zip)
+
+    
+
+  • Se eksempel «lzw»
+
+
+
+
+
+
+
+  • LZW 
+
+    – leser input, 
+
+    – bygger en dictionary, 
+
+    – skriver «ordnumre»
+
+  • Noen «ord» forekommer oftere enn andre
+
+  • Programmet finner antall (frekvenser) for ulike ordnumre, 
+
+    – skriver Huffmankoder i stedet for ordnumre
+
+    – ord som forekommer ofte, får kortere koder
+
+
+
+
+
+
+
+  • Komprimerer mer enn LZ-algoritmene
+
+  1. run-length coding
+
+  2. Burrows-Wheeler transformasjon (hoveddel)
+
+  3. Move-To-Front transformasjon (MFT)
+
+  4. run-length coding igjen
+
+  5. Huffmannkoding
+
+
+
+
+
+
+
+  • Hoveddelen av BZ2 (blokksorteringen)
+
+  • Dette steget komprimerer ikke selv, men transformerer en 
+    blokk (typisk 900kB)
+
+  • Transformerer repeterte sekvenser (som ord) til repeterte 
+    tegn
+
+  • Repeterte tegn er lettere å komprimere videre!
+
+  • Transformasjonen er reversibel (for dekomprimering)
+
+
+
+
+
+
+
+  • BWT på ordet «refererer●». Tegnet «●» markerer slutten
+
+  • 
+  Rotasjoner     Sortert    
+  ----------------------------
+    refererer•    efererer•r  
+    •refererer    ererer•ref  
+    r•referere    erer•refer  
+    er•referer    er•referer  
+    rer•refere    fererer•re  
+    erer•refer    refererer•  
+    rerer•refe    rerer•refe  
+    ererer•ref    rer•refere  
+    fererer•re    r•referere  
+    efererer•r    •refererer  
+  
+
+  • BWT er siste kolonne med tegn fra sortert liste, «rfrre•eeer»
+
+  • Nå har vi mange like tegn ved siden av hverandre, 
+
+    – lettere å komprimere med run-length coding
+
+    – Se også bw brukt på diverse filer
+
+
+
+
+
+
+
+  • Hvordan gå fra «rfrre•eeer» til «referere•»?
+
+  • Vet at «rfrre•eeer» er siste kolonne i sortert liste
+
+  • Lista bestod av ulike rotasjoner av samme ord
+
+    – alle kolonner inneholder de samme tegnene
+
+  • Lista var sortert
+
+    – første kolonne må altså ha de samme tegnene, sortert
+
+    – altså «eeeefrrrr•»
+
+  • Vi har nå to kolonner, i ei liste over rotasjoner
+
+    – kan rotere sidelengs, så siste kolonne blir første, og 
+      første blir andre
+
+    – dette er fortsatt en del av løsningen
+
+    – sorterer vi dette, har vi de to første kolonnene
+
+    – så kan vi legge på siste kolonne igjen
+
+    – vi har nå tre kolonner. Repeter til vi har alle!
+
+  • Riktig rad er den som har «•» på siste plass
+
+
+
+
+
+
+
+  • Hvordan gå fra «rfrre•eeer» til «referere•»?
+
+  • Legg til sisteRotere mot høyreSortere
+
+   re ef fe er re er re er r•r
+
+   fe er re er re er r• •r ref
+
+   re er re er r• •r re ef fer
+
+   re er r• •r re ef fe er rer
+
+   ef fe er re er re er r• •re
+
+   •r re ef fe er re er re er• \Longleftarrow Der
+
+   er re er re er r• •r re efe
+
+   er re er r• •r re ef fe ere
+
+   er r• •r re ef fe er re ere
+
+   r• •r re ef fe er re er rer
+
+  
+
+
+
+
+
+
+
+  • Komprimerer ikke data, men forbereder
+
+  • Initialiserer en tabell med alle byte-verdier. t[0]=0, 
+    t[1]=1, t[2]=2, …
+
+  • Leser ett og ett tegn fra input
+
+    – finn tegnet i tabellen, skriv index til output
+
+    – flytt tegnet vi fant til første plass i tabellen (move to 
+      front)
+
+  • input: caaaaacbbbbbabababab
+
+      inn:caaaaacbbbbbabababab
+
+       ut:21000012000021111111
+
+  tabell
+
+      0: aca....cb....abababab   
+
+      1: bac....ac....babababa
+
+      2: cbb....ba....c.......
+
+      3: ddd....dd....d.......
+
+  • Alle repeterte tegn blir til nuller
+
+  • Korte repeterende sekvenser blir små tall
+
+  • Lett å gå andre veien ved utpakking
+
+
+
+
+
+
+
+  • Eksempel
+
+      inn:caaaaacbbbbbbbaaaabb
+
+       ut:21000012000000200010
+
+  
+
+  • 
+    Frekv. før    |  |    Frekv. etter    
+  ------------------+--+--------------------
+    a        9      |  |  0        14       
+    b        9      |  |  1         3       
+    c        2      |  |  2         3       
+  
+
+  • Før: like mange «a» som «b»
+
+  • Etter: overvekt av «0», som kan få kortere kode.
+
+
+
+
+
+
+
+  • Burrows-Wheeler sorterer så vi får mange repetisjoner
+
+    – 900 kB blokkstørrelse
+
+  • Move-to-front gjør ulike repetisjoner om til nuller
+
+  • Deretter fungerer run-length coding veldig bra!
+
+  • Huffmannkoding av det som blir igjen
+
+
+
+
+
+
+
+  • Huffmankoding av ei fil, bruker samme koding for hele fila
+
+  • Ei fil kan bestå av ulike deler (f.eks. norsk+engelsk)
+
+    – Ulike deler har ulik bokstavfordeling
+
+    – De komprimeres best med ulike Huffman-trær
+
+
+
+
+
+
+
+  • Noen forskere mener datakompresjon og AI er samme problem
+
+    – AI: det korteste programmet som oppfører seg intelligent
+
+  • Å oppdage repeterte mønstre (kan nyttes for kompresjon) 
+    krever intelligens
+
+  • Mer intelligens gir bedre kompresjon
+
+  • Desimalene i \pi er et vanskelig datasett å komprimere. (mye 
+    variasjon) Men:
+
+    – vi kjenner rekkeutviklinger som genererer \pi.
+
+    – Et program med endelig lengde, kan generere hele rekka. \infty
+       kompresjon!
+
+  • Ei zipfil er vanskelig å komprimere, selv om det fins bedre 
+    kompresjon enn zip
+
+    – Hvis vi pakker ut zipfila, kan vi komprimere bedre med bz2
+
+    – Å oppdage at noe er zip-komprimert, og dermed kan behandles 
+      slik, krever intelligens…
diff --git a/ov8/trash/file_cleaning b/ov8/trash/file_cleaning
new file mode 100644
index 0000000000000000000000000000000000000000..cf897484b75589b83b7d61160f6c3ee09149f6c3
--- /dev/null
+++ b/ov8/trash/file_cleaning
@@ -0,0 +1,95 @@
+U+00A1	¡	\xc2\xa1	¡	¡	INVERTED EXCLAMATION MARK
+U+00A2	¢	\xc2\xa2	¢	¢	CENT SIGN
+U+00A3	£	\xc2\xa3	£	£	POUND SIGN
+U+00A4	¤	\xc2\xa4	¤	¤	CURRENCY SIGN
+U+00A5	¥	\xc2\xa5	¥	¥	YEN SIGN
+U+00A6	¦	\xc2\xa6	¦	¦	BROKEN BAR
+U+00A7	§	\xc2\xa7	§	§	SECTION SIGN
+U+00A8	¨	\xc2\xa8	¨	¨	DIAERESIS
+U+00A9	©	\xc2\xa9	©	©	COPYRIGHT SIGN
+U+00AA	ª	\xc2\xaa	ª	ª	FEMININE ORDINAL INDICATOR
+U+00AB	«	\xc2\xab	«	«	LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+U+00AC	¬	\xc2\xac	¬	¬	NOT SIGN
+U+00AD	­	\xc2\xad	­	­	SOFT HYPHEN
+U+00AE	®	\xc2\xae	®	®	REGISTERED SIGN
+U+00AF	¯	\xc2\xaf	¯	¯	MACRON
+U+00B0	°	\xc2\xb0	°	°	DEGREE SIGN
+U+00B1	±	\xc2\xb1	±	±	PLUS-MINUS SIGN
+U+00B2	²	\xc2\xb2	²	²	SUPERSCRIPT TWO
+U+00B3	³	\xc2\xb3	³	³	SUPERSCRIPT THREE
+U+00B4	´	\xc2\xb4	´	´	ACUTE ACCENT
+U+00B5	µ	\xc2\xb5	µ	µ	MICRO SIGN
+U+00B6	¶	\xc2\xb6	¶	¶	PILCROW SIGN
+U+00B7	·	\xc2\xb7	·	·	MIDDLE DOT
+U+00B8	¸	\xc2\xb8	¸	¸	CEDILLA
+U+00B9	¹	\xc2\xb9	¹	¹	SUPERSCRIPT ONE
+U+00BA	º	\xc2\xba	º	º	MASCULINE ORDINAL INDICATOR
+U+00BB	»	\xc2\xbb	»	»	RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+U+00BC	¼	\xc2\xbc	¼	¼	VULGAR FRACTION ONE QUARTER
+U+00BD	½	\xc2\xbd	½	½	VULGAR FRACTION ONE HALF
+U+00BE	¾	\xc2\xbe	¾	¾	VULGAR FRACTION THREE QUARTERS
+U+00BF	¿	\xc2\xbf	¿	¿	INVERTED QUESTION MARK
+U+00C0	À	\xc3\x80	À	À	LATIN CAPITAL LETTER A WITH GRAVE
+U+00C1	Á	\xc3\x81	Á	Á	LATIN CAPITAL LETTER A WITH ACUTE
+U+00C2	Â	\xc3\x82	Â	Â	LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+U+00C3	Ã	\xc3\x83	Ã	Ã	LATIN CAPITAL LETTER A WITH TILDE
+U+00C4	Ä	\xc3\x84	Ä	Ä	LATIN CAPITAL LETTER A WITH DIAERESIS
+U+00C5	Å	\xc3\x85	Å	Å	LATIN CAPITAL LETTER A WITH RING ABOVE
+U+00C6	Æ	\xc3\x86	Æ	Æ	LATIN CAPITAL LETTER AE
+U+00C7	Ç	\xc3\x87	Ç	Ç	LATIN CAPITAL LETTER C WITH CEDILLA
+U+00C8	È	\xc3\x88	È	È	LATIN CAPITAL LETTER E WITH GRAVE
+U+00C9	É	\xc3\x89	É	É	LATIN CAPITAL LETTER E WITH ACUTE
+U+00CA	Ê	\xc3\x8a	Ê	Ê	LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+U+00CB	Ë	\xc3\x8b	Ë	Ë	LATIN CAPITAL LETTER E WITH DIAERESIS
+U+00CC	Ì	\xc3\x8c	Ì	Ì	LATIN CAPITAL LETTER I WITH GRAVE
+U+00CD	Í	\xc3\x8d	Í	Í	LATIN CAPITAL LETTER I WITH ACUTE
+U+00CE	Î	\xc3\x8e	Î	Î	LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+U+00CF	Ï	\xc3\x8f	Ï	Ï	LATIN CAPITAL LETTER I WITH DIAERESIS
+U+00D0	Ð	\xc3\x90	Ð	Ð	LATIN CAPITAL LETTER ETH
+U+00D1	Ñ	\xc3\x91	Ñ	Ñ	LATIN CAPITAL LETTER N WITH TILDE
+U+00D2	Ò	\xc3\x92	Ò	Ò	LATIN CAPITAL LETTER O WITH GRAVE
+U+00D3	Ó	\xc3\x93	Ó	Ó	LATIN CAPITAL LETTER O WITH ACUTE
+U+00D4	Ô	\xc3\x94	Ô	Ô	LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+U+00D5	Õ	\xc3\x95	Õ	Õ	LATIN CAPITAL LETTER O WITH TILDE
+U+00D6	Ö	\xc3\x96	Ö	Ö	LATIN CAPITAL LETTER O WITH DIAERESIS
+U+00D7	×	\xc3\x97	×	×	MULTIPLICATION SIGN
+U+00D8	Ø	\xc3\x98	Ø	Ø	LATIN CAPITAL LETTER O WITH STROKE
+U+00D9	Ù	\xc3\x99	Ù	Ù	LATIN CAPITAL LETTER U WITH GRAVE
+U+00DA	Ú	\xc3\x9a	Ú	Ú	LATIN CAPITAL LETTER U WITH ACUTE
+U+00DB	Û	\xc3\x9b	Û	Û	LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+U+00DC	Ü	\xc3\x9c	Ü	Ü	LATIN CAPITAL LETTER U WITH DIAERESIS
+U+00DD	Ý	\xc3\x9d	Ý	Ý	LATIN CAPITAL LETTER Y WITH ACUTE
+U+00DE	Þ	\xc3\x9e	Þ	Þ	LATIN CAPITAL LETTER THORN
+U+00DF	ß	\xc3\x9f	ß	ß	LATIN SMALL LETTER SHARP S
+U+00E0	à	\xc3\xa0	à	à	LATIN SMALL LETTER A WITH GRAVE
+U+00E1	á	\xc3\xa1	á	á	LATIN SMALL LETTER A WITH ACUTE
+U+00E2	â	\xc3\xa2	â	â	LATIN SMALL LETTER A WITH CIRCUMFLEX
+U+00E3	ã	\xc3\xa3	ã	ã	LATIN SMALL LETTER A WITH TILDE
+U+00E4	ä	\xc3\xa4	ä	ä	LATIN SMALL LETTER A WITH DIAERESIS
+U+00E5	å	\xc3\xa5	å	å	LATIN SMALL LETTER A WITH RING ABOVE
+U+00E6	æ	\xc3\xa6	æ	æ	LATIN SMALL LETTER AE
+U+00E7	ç	\xc3\xa7	ç	ç	LATIN SMALL LETTER C WITH CEDILLA
+U+00E8	è	\xc3\xa8	è	è	LATIN SMALL LETTER E WITH GRAVE
+U+00E9	é	\xc3\xa9	é	é	LATIN SMALL LETTER E WITH ACUTE
+U+00EA	ê	\xc3\xaa	ê	ê	LATIN SMALL LETTER E WITH CIRCUMFLEX
+U+00EB	ë	\xc3\xab	ë	ë	LATIN SMALL LETTER E WITH DIAERESIS
+U+00EC	ì	\xc3\xac	ì	ì	LATIN SMALL LETTER I WITH GRAVE
+U+00ED	í	\xc3\xad	í	í	LATIN SMALL LETTER I WITH ACUTE
+U+00EE	î	\xc3\xae	î	î	LATIN SMALL LETTER I WITH CIRCUMFLEX
+U+00EF	ï	\xc3\xaf	ï	ï	LATIN SMALL LETTER I WITH DIAERESIS
+U+00F0	ð	\xc3\xb0	ð	ð	LATIN SMALL LETTER ETH
+U+00F1	ñ	\xc3\xb1	ñ	ñ	LATIN SMALL LETTER N WITH TILDE
+U+00F2	ò	\xc3\xb2	ò	ò	LATIN SMALL LETTER O WITH GRAVE
+U+00F3	ó	\xc3\xb3	ó	ó	LATIN SMALL LETTER O WITH ACUTE
+U+00F4	ô	\xc3\xb4	ô	ô	LATIN SMALL LETTER O WITH CIRCUMFLEX
+U+00F5	õ	\xc3\xb5	õ	õ	LATIN SMALL LETTER O WITH TILDE
+U+00F6	ö	\xc3\xb6	ö	ö	LATIN SMALL LETTER O WITH DIAERESIS
+U+00F7	÷	\xc3\xb7	÷	÷	DIVISION SIGN
+U+00F8	ø	\xc3\xb8	ø	ø	LATIN SMALL LETTER O WITH STROKE
+U+00F9	ù	\xc3\xb9	ù	ù	LATIN SMALL LETTER U WITH GRAVE
+U+00FA	ú	\xc3\xba	ú	ú	LATIN SMALL LETTER U WITH ACUTE
+U+00FB	û	\xc3\xbb	û	û	LATIN SMALL LETTER U WITH CIRCUMFLEX
+U+00FC	ü	\xc3\xbc	ü	ü	LATIN SMALL LETTER U WITH DIAERESIS
+U+00FD	ý	\xc3\xbd	ý	ý	LATIN SMALL LETTER Y WITH ACUTE
+U+00FE	þ	\xc3\xbe	þ	þ	LATIN SMALL LETTER THORN
+U+00FF	ÿ	\xc3\xbf	ÿ	ÿ	LATIN SMALL LETTER Y WITH DIAERESIS
\ No newline at end of file
diff --git a/ov8/trash/test.py b/ov8/trash/test.py
index 6987ab0f92943558dfc776965ff5a8cdb68f3f78..adcf2b90eb28a3bbf0c360c284fd8a833c24703a 100644
--- a/ov8/trash/test.py
+++ b/ov8/trash/test.py
@@ -41,7 +41,7 @@ import string
 b = checkstring('åøæ')
 print(b)
 '''
-
+'''
 with open('./test','wb') as file:
     int2 = int('78')
     file.write(int2.to_bytes(2,'little'))
@@ -70,7 +70,7 @@ for i in range(len(tekst)):
     print(array)
     print(''.join(map(chr, arr)))
     exit()
-
+'''
     
 '''string_to_test = 'abå'
 def test():
@@ -80,3 +80,29 @@ test()'''
 
 
 #å=Ã¥ Å= 
+
+
+'''with open('./file_cleaning') as file:
+    tekst = file.read()
+
+tekst = tekst.split('\n')
+str = ''
+for i in tekst:
+    i = i.split()
+    str += i[1]
+    
+print(str)'''
+extended_string = '¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ'
+print(string.printable)
+print(extended_string)
+
+
+a = "ø"
+
+for i in a:
+    if i in string.printable:
+        print("ascii")
+    elif i in extended_string:
+        print("not ascii")
+    else:
+        print("nor")
\ No newline at end of file
diff --git a/ov8/uncomp b/ov8/uncomp
index c377a654f297dcf537a10544c71b9c1d82bcc817..ac8fe2b20d5e1b3bfcb3809a519adff19b87f1a4 100644
--- a/ov8/uncomp
+++ b/ov8/uncomp
@@ -1,21 +1,824 @@
-Lorem ipsum dolor sit amet, consectetur adipiscing elit. In sollicitudin orci ac blandit mollis. Pellentesque nec dui accumsan, condimentum neque at, tempus libero. Morbi eleifend porta magna at tincidunt. Phasellus nisi ex, fermentum non dictum id, rutrum sit amet neque. Nulla id scelerisque nibh, sit amet ultricies dui. Praesent eget lacus ac velit faucibus viverra et sit amet turpis. Donec laoreet eu turpis non mattis. Etiam tincidunt sapien ac augue semper, at mollis lacus aliquam. Sed posuere dui arcu, eget volutpat odio malesuada sed. Morbi at tristique eros, sed luctus diam. Phasellus ut maximus erat. Pellentesque sed mi eget ligula ornare fringilla vitae a turpis. Ut commodo sollicitudin venenatis. Donec ut dictum velit, vel sollicitudin risus.
+Tekstsøk, Datakompresjon
 
-Vestibulum sit amet massa cursus felis iaculis tempor id quis est. Sed blandit magna non orci pharetra cursus. Pellentesque ultrices ornare volutpat. Vivamus fermentum et nisl sit amet congue. Praesent quis nibh at dolor lobortis eleifend ut eget arcu. Proin vestibulum luctus est eu volutpat. Nam a risus quis arcu dictum volutpat. Integer ultricies mauris at rutrum bibendum. Curabitur consequat accumsan augue, id hendrerit sapien molestie et. Fusce vitae consequat eros. Pellentesque sodales est velit, luctus pretium ante faucibus a. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Vestibulum tristique et augue ac lobortis. Duis varius ultrices condimentum.
+Helge Hafting
 
-Nulla consectetur mi a eleifend sodales. Sed eget egestas eros, in ultrices ex. Ut sagittis mauris eu quam efficitur pharetra. Donec et gravida lacus, ac aliquam nunc. Nulla hendrerit lectus quis porttitor efficitur. Proin sodales orci quis lectus dignissim, ac pulvinar neque tincidunt. Sed ultricies, dui sit amet malesuada venenatis, augue lectus sodales nunc, vel iaculis sem risus ut metus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Ut elementum dapibus quam, id condimentum eros suscipit eget. Nullam in ultrices orci, a ullamcorper neque. Sed nunc nulla, luctus vel felis non, venenatis eleifend sem. Curabitur lobortis erat et pellentesque cursus. Aenean suscipit lorem non tortor venenatis, ac rutrum orci vulputate. Fusce faucibus justo sit amet massa rutrum, et cursus risus dapibus. Sed ullamcorper, eros eu sagittis dictum, tellus ante fringilla nibh, vitae scelerisque erat nisl ac tellus.
+Institutt for datateknologi og informatikk
 
-Aenean eu ipsum rhoncus, imperdiet ex nec, laoreet lacus. Integer convallis posuere dignissim. Nunc placerat mi ultrices, suscipit erat sed, elementum lectus. Vestibulum diam mi, sodales vitae ornare in, tristique id risus. Mauris faucibus in massa nec interdum. Sed ac arcu et arcu vulputate ultricies. Mauris a iaculis purus. Nullam non euismod urna. Integer scelerisque, nunc quis bibendum porta, lacus mi porta tortor, id ultricies ligula erat dictum massa. Praesent pellentesque tortor justo, sit amet congue ipsum scelerisque vel. Phasellus in orci sit amet odio semper venenatis. Sed a vehicula tellus, ac condimentum tellus. Donec elit elit, elementum in metus at, iaculis condimentum urna. Cras tempor mi vel enim dictum, in porttitor erat consequat. In at velit mattis, consectetur mauris et, ultricies enim.
+Seksjon 1 Tekstsøk
 
-Suspendisse eget feugiat diam. Sed porttitor malesuada commodo. Suspendisse potenti. Nunc metus enim, mattis non massa in, malesuada pretium nisl. Vivamus volutpat consectetur est, sit amet elementum ligula volutpat nec. Donec ac rhoncus diam, ut sodales tellus. Aenean ornare, ante tincidunt tempus imperdiet, urna sapien convallis velit, in tincidunt enim mi eu ex. Nulla mattis fringilla sem id elementum. Morbi cursus nunc id tempor viverra. In fringilla lorem quis rutrum interdum. Maecenas lorem purus, fermentum nec iaculis in, lobortis cursus nulla. Pellentesque molestie, odio eu rhoncus congue, diam libero volutpat elit, quis cursus sapien odio nec nisi.
 
-Quisque sodales hendrerit nulla sed scelerisque. Aenean ornare, ligula et ultrices malesuada, nulla augue vulputate est, eget iaculis enim magna sit amet sapien. Nam dictum leo ligula, quis maximus magna egestas eu. Donec tempus eros ut lorem pulvinar mattis. Maecenas posuere ex sapien, et porttitor est accumsan sit amet. Proin auctor mattis ante, ullamcorper porttitor ligula imperdiet vel. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Quisque quis est tempor, vestibulum enim sit amet, venenatis sem.
 
-Etiam a nisl nulla. Phasellus rutrum sed massa nec tristique. Donec auctor hendrerit quam, nec accumsan diam tempor id. Curabitur aliquet cursus tellus, et sagittis erat pellentesque quis. Nunc ac sollicitudin odio, ut sagittis libero. Praesent lobortis pulvinar finibus. Nunc vel quam et ex consectetur maximus vitae vitae dolor. Suspendisse congue aliquet felis, luctus molestie libero porta vitae. Nunc eu vehicula orci. Ut varius ut tellus a tempus. Quisque scelerisque commodo lorem sit amet convallis. Ut tempor aliquam metus, a posuere tortor tincidunt sed.
 
-Fusce fringilla vitae velit eu interdum. Suspendisse dictum cursus lorem, non feugiat orci posuere a. Suspendisse potenti. Curabitur imperdiet sapien et justo posuere hendrerit. Donec tincidunt, est et semper porttitor, sem sapien cursus erat, id pellentesque tortor dolor sit amet quam. Fusce dictum ut libero vel laoreet. Quisque eleifend egestas pharetra. Nam posuere accumsan gravida. Fusce eget dui eu felis semper hendrerit. Nam non fringilla orci. Morbi gravida leo quis ipsum dignissim, et commodo augue euismod.
+  • Fritekstsøk i dokumenter, nettsider og lignende
 
-Suspendisse euismod id enim non blandit. Vivamus scelerisque volutpat massa, non tempus enim placerat nec. Proin at aliquet arcu. Curabitur commodo urna ut neque pretium, a scelerisque libero varius. Ut tempus mi vitae nunc ullamcorper molestie. Suspendisse sit amet varius tellus. Ut nulla nulla, pellentesque finibus diam sed, fermentum tincidunt lectus. Vestibulum in dignissim felis, sed mollis est. Maecenas eros dolor, pulvinar a ultrices ac, iaculis at lacus. Vivamus in tincidunt ligula.
+  • Fritekstsøk i databaser
 
-Pellentesque massa dolor, condimentum lacinia nibh at, condimentum interdum massa. Morbi a sollicitudin tortor. Aliquam malesuada nisl eu tortor interdum convallis. Vestibulum vitae facilisis neque, a consectetur magna. Vivamus eleifend sem enim, non varius justo volutpat sit amet. Curabitur ligula massa, cursus ac justo a, sagittis accumsan risus. In lobortis nisl nec lacus viverra, vel ullamcorper ante fermentum. Quisque viverra pulvinar porta.
+  • Søkemotorer
 
-Cras metus tortor, aliquet quis pretium at, pharetra porta est. Aenean in eleifend eros, non elementum urna. Praesent ullamcorper, quam luctus tristique mollis, elit ipsum gravida diam, sed gravida ex dui eu sem. Curabitur fermentum, lacus ac volutpat accumsan, lectus libero facilisis magna, a.
\ No newline at end of file
+  • Søke etter repeterte strenger for datakompresjon
+
+  • DNA-matching
+
+
+
+
+
+
+
+  Tekst: rabarbra     (lengde n)
+
+  Søkeord: bra     (lengde m)
+
+  Skyv søkeordet langs teksten, se om det passer
+
+
+    • tegn som passer, vises med fet skrift
+
+    • første feil med kursiv
+
+    • dobbeltløkke for n-m posisjoner, og m tegn i søkeordet. 
+
+  
+
+
+  Hele greia, O\left(n\cdot m\right),\Omega\left(n\right)
+
+  
+  Forsøk  | r  | a  | b  | a  | r  | b  | r  | a  
+----------+----+----+----+----+----+----+----+----
+    0     | b  | r  | a  |    |    |    |    |    
+
+  
+  Forsøk  | r  | a  | b  | a  | r  | b  | r  | a  
+----------+----+----+----+----+----+----+----+----
+    1     |    | b  | r  | a  |    |    |    |    
+
+  
+  Forsøk  | r  | a  | b  | a  | r  | b  | r  | a  
+----------+----+----+----+----+----+----+----+----
+    2     |    |    | b  | r  | a  |    |    |    
+
+  
+  Forsøk  | r  | a  | b  | a  | r  | b  | r  | a  
+----------+----+----+----+----+----+----+----+----
+    3     |    |    |    | b  | r  | a  |    |    
+
+  
+  Forsøk  | r  | a  | b  | a  | r  | b  | r  | a  
+----------+----+----+----+----+----+----+----+----
+    4     |    |    |    |    | b  | r  | a  |    
+
+  
+  Forsøk  | r  | a  | b  | a  | r  | b  | r  | a  
+----------+----+----+----+----+----+----+----+----
+    5     |    |    |    |    |    | b  | r  | a  
+
+  
+  Forsøk  | r  | a  | b  | a  | r  | b  | r  | a  
+----------+----+----+----+----+----+----+----+----
+    0     | b  | r  | a  |    |    |    |    |    
+    1     |    | b  | r  | a  |    |    |    |    
+    2     |    |    | b  | r  | a  |    |    |    
+    3     |    |    |    | b  | r  | a  |    |    
+    4     |    |    |    |    | b  | r  | a  |    
+    5     |    |    |    |    |    | b  | r  | a  
+
+
+
+
+
+
+
+
+  • Se på siste tegn i søketeksten først
+
+  • Hvis det ikke passer, flytt søketeksten så langt vi kan
+
+
+    
+     | r  | a  | b  | a  | r  | b  | r  | a  
+    -----+----+----+----+----+----+----+----+----
+      0  | b  | r  | a  |    |    |    |    |    
+      1  |    |    | b  | r  | a  |    |    |    
+      2  |    |    |    | b  | r  | a  |    |    
+      3  |    |    |    |    |    | b  | r  | a  
+    
+
+  • Hvis det passer, se på nestsiste osv.
+
+
+
+
+
+
+
+  • Hvis tegnet ikke fins i søketeksten, kan vi flytte m steg 
+    frem:
+
+  
+     | m  | e  | t  | e  | o  | r  | i  | t  | t  | s  | t  | e  | i  | n  
+  -----+----+----+----+----+----+----+----+----+----+----+----+----+----+----
+    0  | s  | t  | e  | i  | n  |    |    |    |    |    |    |    |    |    
+    1  |    |    |    |    |    | s  | t  | e  | i  | n  |    |    |    |    
+    2  |    |    |    |    |    |    |    |    |    | s  | t  | e  | i  | n  
+  
+
+  • Hvis tegnet fins til venstre i søkeordet, kan vi flytte ordet 
+    så det passer med teksten 
+
+  • Vi har vi en tabell for hvor mye vi kan flytte
+
+  • I praksis en tabell for hele alfabetet, hvor de fleste tegn 
+    gir et flytt på m. (Regel om «upassende tegn»)
+
+  • Tabellen lager vi ved å pre-prosessere søketeksten
+
+  • Tegn som fins i søketeksten, gir kortere flytt
+
+
+    – En «s» i siste posisjon gir flytt på m-1, fordi ordet 
+      starter på «s»
+
+  • \Omega\left(n/m\right) for søket. Mye bedre!
+
+
+
+
+
+
+
+  • Hvis tegnet ikke fins i søketeksten, kan vi flytte m steg 
+    frem,
+
+
+    – hvis mismatch var på siste tegn i søketeksten
+
+    – med mismatch på nestsiste tegn kan vi flytte m-1 steg
+
+    – ved mismatch på nestnestsiste, flytter vi m-2 steg osv.
+
+  
+     | m  | e  | t  | e  | o  | r  | i  | t  | t  | s  | t  | e  | i  | n  
+  -----+----+----+----+----+----+----+----+----+----+----+----+----+----+----
+    0  | m  | e  | n  | e  |    |    |    |    |    |    |    |    |    |    
+    1  |    |    |    | m  | e  | n  | e  |    |    |    |    |    |    |    
+  
+
+  • Vi trenger altså en todimensjonal tabell:
+
+
+    – En indeks er det upassende tegnet
+
+    – Den andre indeksen er posisjonen i søketeksten
+
+    – Verdien i cellen er hvor langt vi kan flytte fremover
+
+
+
+
+
+
+
+  For hver posisjon p i søketeksten
+
+     For hvert tegn x i alfabetet
+
+        let mot start i søketeksten fra p
+
+        hvis vi finner x etter i steg,
+
+        sett Tab[p][x] = i
+
+        hvis vi ikke finner x, Tab[p][x]=p+1
+
+
+
+
+
+
+
+  
+     | r  | e  | n  | n  | e  | n  | e  |   
+  -----+----+----+----+----+----+----+----+---
+    0  | e  | n  | e  |    |    |    |    |   
+    1  |    | e  | n  | e  |    |    |    |   
+    2  |    |    | e  | n  | e  |    |    |   
+       |    |    |    |    | e  | n  | e  |   
+  
+
+  • 0,1: Når siste posisjon treffer «n», kan vi bare flytte ett 
+    steg
+
+  • 2: Feil i første posisjon
+
+
+    – Regel om «upassende tegn» lar oss bare flytte ett hakk
+
+  • Regel om «passende endelse» lar oss flytte to hakk her
+
+  • «ne» passet, og «ene» overlapper med seg selv
+
+  • Vi slår opp både «upassende tegn» og passende endelse», og 
+    bruker regelen som gir det lengste hoppet. 
+
+
+
+
+
+
+
+  • Tabellen for «passende endelse»
+
+
+    – index er hvor mange tegn som passet
+
+    – verdien i cellen er hvor langt vi kan flytte
+
+  • Lages ved å prøve ut om søketeksten overlapper med seg selv
+
+
+    – ofte gjør den ikke det, og vi får lange hopp!
+
+
+
+
+
+
+  • Hvis vi søker etter «aaa» i «aaaaaa…», har vi dessverre O\left(n\cdot m\right)
+     
+
+    – søkeordet passer overalt, de samme a-ene sjekkes flere 
+      ganger
+
+  • Galil fant en måte å unngå unødvendige sammenligninger:
+
+    – Når vi flytter søkeordet kortere enn den delen av søkeordet 
+      vi allerede har sjekket, trenger vi ikke sjekke det 
+      overlappende området omigjen.
+
+    – Korte flytt skjer fordi søkeordet delvis matcher seg selv. 
+      Hvis det ikke hadde passet, hadde vi flyttet lenger. 
+
+  
+    Teksten     | .  | .  | .  | O  | l  | a  | l  | a  | .  | . |  . |
+    Mismatch O/a  |    |    | l  | a  | l  | a  | l  | a  |    |   |    |
+    Nytt forsøk   |    |    |    |    | l  | a  | l  | a  | l  | a |    |
+  
+
+  • Programmet trenger ikke sjekke den oransje regionen omigjen
+
+  • Dermed: O\left(n\right) og \Omega\left(n/m\right) for 
+    tekstsøk
+
+
+
+
+
+
+
+  • Boyer og Moore sin artikkel:
+
+
+    http://www.cs.utexas.edu/~moore/publications/fstrpos.pdf
+
+  • Wikipedia:
+
+
+    https://en.wikipedia.org/wiki/Boyer_moore_string_search_algorithm
+
+  • Animasjon (Fyll ut, og velg Boyer-Moore)     Trenger java
+
+
+    http://www.cs.pitt.edu/~kirk/cs1501/animations/String.html
+
+  • Demonstrasjon på Moore sin nettside:
+
+    
+http://www.cs.utexas.edu/users/moore/best-ideas/string-searching/fstrpos-example.html
+
+Seksjon 2 Mer om datakompresjon
+
+
+
+
+  • Enkleste form for datakompresjon
+
+  • En serie repetisjoner erstattes med et antall:
+
+    – ABIIIIIIIIIIIIBBBCDEFFFGH \rightarrow AB12I3BCDE3FGH
+
+    
+
+  • I praksis litt mer komplisert
+
+    – det kan jo være sifre i det vi komprimerer
+
+    – ser vanligvis på «bytes», ikke «tekst»
+
+    – må kunne skille mellom data og metadata
+
+      
+
+  • Eks., bruker negativ byte for ukomprimerte sekvenser:
+
+    – ABIIIIIIIIIIIIBBBCDEFFFGH \rightarrow 
+      [-2]AB[12]I[3]B[-3]CDE[3]F[-2]GH
+
+    – 25 byte ble redusert til 16
+
+      
+
+  • Kan ikke komprimere ABABABABABAB…
+
+
+
+
+
+
+
+  • Leser gjennom fila
+
+  • Input kopieres til output
+
+  • Hvis en lang nok sekvens kommer omigjen:
+
+
+    – dropp den, skriv heller en referanse til output
+
+    – format: repeter X tegn, som vi har sett Y tegn tidligere
+
+  • Hjelper hvis sekvensen er lenger enn en slik referanse
+
+  • Søker bakover i et sirkulært buffer
+
+  • Output kan komprimeres videre med Huffman-koding 
+
+
+
+
+
+
+
+  • Må være kompakt
+
+
+    – ellers kan vi ikke referere til korte strenger
+
+    – f.eks. 2–3 byte
+
+  • Å «se» langt bakover i datastrømmen, gir større sjanse for å 
+    finne repetisjoner.
+
+
+    – men også lenger kjøretid
+
+    – påvirker formatet på referansene våre
+
+
+      ∗ 1 byte kan peke 255 tegn bakover
+
+      ∗ 2 byte kan peke 65 536 tegn bakover
+
+      ∗ 3 byte kan peke 16 777 215 tegn bakover
+
+  • I blant kan vi ikke komprimere
+
+
+    – Må derfor også ha en måte å si:
+
+    – Her kommer X bytes ukomprimerte data
+
+    – Slik informasjon tar også plass!
+
+
+
+
+
+
+
+  • Vurdering:
+
+
+    – Skal dette være en del av en større ukomprimert blokk?
+
+    – Evt. bakover-ref + header for kortere ukomprimert blokk
+
+  • Det vi komprimerer må altså være lenger enn samlet lengde 
+    for:
+
+
+    – en bakover-referanse
+
+    – header for en ukomprimert blokk
+
+  • Vi komprimerer ikke svært korte strenger, det hjelper ikke!
+
+
+
+
+
+
+
+  • Eksempeltekst:
+
+
+    Problemer, problemer. Alltid problemer!
+Dette er dagens problem. Problemet er
+å komprimere problematisk tekst.
+
+  • Eksempeltekst med avstander:
+
+
+    Problemer,^{10} problemer^{20}. Alltid p^{30}roblemer!
+^{40}Dette er d^{50}agens prob^{60}lem. Probl^{70}emet er
+å ^{80}komprimere^{90} problemat^{100}isk tekst.^{110}
+
+  • 110 tegn, inkludert linjeskift og blanke.
+
+
+
+
+
+
+
+  • Eksempeltekst med avstander:
+
+
+    Problemer,^{10} problemer^{20}. Alltid p^{30}roblemer!
+^{40}Dette er d^{50}agens prob^{60}lem. Probl^{70}emet er
+å ^{80}komprimere^{90} problemat^{100}isk tekst.^{110}
+
+  • Komprimert:
+
+
+    [12]Problemer, p[-11,8][8]. Alltid[-18,10][17]!
+Dette er dagens[-27,7][2]. [-65,8][17]t er
+å komprimere[-35,8][12]atisk tekst.
+
+  • Før komprimering, 110 tegn. 
+
+  • Med 1 byte per tallkode, 84 tegn.
+
+
+    Vi sparte 110-84=26 tegn, eller 23%
+
+  • se også Lz-demo
+
+
+
+
+
+
+
+  • For hver tegnposisjon i input, må vi søke etter lengste match 
+    i bufferet.
+
+  • Fil med n tegn, sirkulært buffer med størrelse m.
+
+  • Teste alle posisjoner, i verste fall O\left(nm^{2}\right)
+
+  • I praksis går det bedre, særlig hvis data varierer en del
+
+  • Kan bruke Boyer-Moore tekstsøk for bedre kjøretid.
+
+
+
+
+
+
+
+  • Lempel og Ziv sin artikkel:
+
+
+    
+http://www.cs.duke.edu/courses/spring03/cps296.5/papers/ziv_lempel_1977_universal_algorithm.pdf
+
+  • Wikipedia:
+
+
+    https://en.wikipedia.org/wiki/Lempel\%E2\%80\%93Ziv
+
+
+
+
+
+
+
+  • LZ leser input, og skriver
+
+    – bakover-referanser
+
+    – sekvenser med ukomprimerte tegn
+
+  • ukomprimerte tegn telles opp, og komprimeres videre med 
+    Huffmannkoding
+
+
+
+
+
+
+
+  • Ligner LZ. Teoretisk samme kompresjon. Lettere å speede opp.
+
+  • Leser ett og ett tegn
+
+  • Bygger en ordliste (dictionary) underveis
+
+    – til å begynne med, alle 1-byte «ord»
+
+  • Finn et (lengst mulig) ord, skriv ordnummeret (med færrest 
+    mulig bits!)
+
+    – lagre nytt «ord» = dette ordet + neste tegn
+
+  • Kompresjon hvis ordene blir lengre enn numrene
+
+  • LZW+Huffman \rightarrowDeflate (brukt i zip)
+
+    
+
+  • Se eksempel «lzw»
+
+
+
+
+
+
+
+  • LZW 
+
+    – leser input, 
+
+    – bygger en dictionary, 
+
+    – skriver «ordnumre»
+
+  • Noen «ord» forekommer oftere enn andre
+
+  • Programmet finner antall (frekvenser) for ulike ordnumre, 
+
+    – skriver Huffmankoder i stedet for ordnumre
+
+    – ord som forekommer ofte, får kortere koder
+
+
+
+
+
+
+
+  • Komprimerer mer enn LZ-algoritmene
+
+  1. run-length coding
+
+  2. Burrows-Wheeler transformasjon (hoveddel)
+
+  3. Move-To-Front transformasjon (MFT)
+
+  4. run-length coding igjen
+
+  5. Huffmannkoding
+
+
+
+
+
+
+
+  • Hoveddelen av BZ2 (blokksorteringen)
+
+  • Dette steget komprimerer ikke selv, men transformerer en 
+    blokk (typisk 900kB)
+
+  • Transformerer repeterte sekvenser (som ord) til repeterte 
+    tegn
+
+  • Repeterte tegn er lettere å komprimere videre!
+
+  • Transformasjonen er reversibel (for dekomprimering)
+
+
+
+
+
+
+
+  • BWT på ordet «refererer●». Tegnet «●» markerer slutten
+
+  • 
+  Rotasjoner     Sortert    
+  ----------------------------
+    refererer•    efererer•r  
+    •refererer    ererer•ref  
+    r•referere    erer•refer  
+    er•referer    er•referer  
+    rer•refere    fererer•re  
+    erer•refer    refererer•  
+    rerer•refe    rerer•refe  
+    ererer•ref    rer•refere  
+    fererer•re    r•referere  
+    efererer•r    •refererer  
+  
+
+  • BWT er siste kolonne med tegn fra sortert liste, «rfrre•eeer»
+
+  • Nå har vi mange like tegn ved siden av hverandre, 
+
+    – lettere å komprimere med run-length coding
+
+    – Se også bw brukt på diverse filer
+
+
+
+
+
+
+
+  • Hvordan gå fra «rfrre•eeer» til «referere•»?
+
+  • Vet at «rfrre•eeer» er siste kolonne i sortert liste
+
+  • Lista bestod av ulike rotasjoner av samme ord
+
+    – alle kolonner inneholder de samme tegnene
+
+  • Lista var sortert
+
+    – første kolonne må altså ha de samme tegnene, sortert
+
+    – altså «eeeefrrrr•»
+
+  • Vi har nå to kolonner, i ei liste over rotasjoner
+
+    – kan rotere sidelengs, så siste kolonne blir første, og 
+      første blir andre
+
+    – dette er fortsatt en del av løsningen
+
+    – sorterer vi dette, har vi de to første kolonnene
+
+    – så kan vi legge på siste kolonne igjen
+
+    – vi har nå tre kolonner. Repeter til vi har alle!
+
+  • Riktig rad er den som har «•» på siste plass
+
+
+
+
+
+
+
+  • Hvordan gå fra «rfrre•eeer» til «referere•»?
+
+  • Legg til sisteRotere mot høyreSortere
+
+   re ef fe er re er re er r•r
+
+   fe er re er re er r• •r ref
+
+   re er re er r• •r re ef fer
+
+   re er r• •r re ef fe er rer
+
+   ef fe er re er re er r• •re
+
+   •r re ef fe er re er re er• \Longleftarrow Der
+
+   er re er re er r• •r re efe
+
+   er re er r• •r re ef fe ere
+
+   er r• •r re ef fe er re ere
+
+   r• •r re ef fe er re er rer
+
+  
+
+
+
+
+
+
+
+  • Komprimerer ikke data, men forbereder
+
+  • Initialiserer en tabell med alle byte-verdier. t[0]=0, 
+    t[1]=1, t[2]=2, …
+
+  • Leser ett og ett tegn fra input
+
+    – finn tegnet i tabellen, skriv index til output
+
+    – flytt tegnet vi fant til første plass i tabellen (move to 
+      front)
+
+  • input: caaaaacbbbbbabababab
+
+      inn:caaaaacbbbbbabababab
+
+       ut:21000012000021111111
+
+  tabell
+
+      0: aca....cb....abababab   
+
+      1: bac....ac....babababa
+
+      2: cbb....ba....c.......
+
+      3: ddd....dd....d.......
+
+  • Alle repeterte tegn blir til nuller
+
+  • Korte repeterende sekvenser blir små tall
+
+  • Lett å gå andre veien ved utpakking
+
+
+
+
+
+
+
+  • Eksempel
+
+      inn:caaaaacbbbbbbbaaaabb
+
+       ut:21000012000000200010
+
+  
+
+  • 
+    Frekv. før    |  |    Frekv. etter    
+  ------------------+--+--------------------
+    a        9      |  |  0        14       
+    b        9      |  |  1         3       
+    c        2      |  |  2         3       
+  
+
+  • Før: like mange «a» som «b»
+
+  • Etter: overvekt av «0», som kan få kortere kode.
+
+
+
+
+
+
+
+  • Burrows-Wheeler sorterer så vi får mange repetisjoner
+
+    – 900 kB blokkstørrelse
+
+  • Move-to-front gjør ulike repetisjoner om til nuller
+
+  • Deretter fungerer run-length coding veldig bra!
+
+  • Huffmannkoding av det som blir igjen
+
+
+
+
+
+
+
+  • Huffmankoding av ei fil, bruker samme koding for hele fila
+
+  • Ei fil kan bestå av ulike deler (f.eks. norsk+engelsk)
+
+    – Ulike deler har ulik bokstavfordeling
+
+    – De komprimeres best med ulike Huffman-trær
+
+
+
+
+
+
+
+  • Noen forskere mener datakompresjon og AI er samme problem
+
+    – AI: det korteste programmet som oppfører seg intelligent
+
+  • Å oppdage repeterte mønstre (kan nyttes for kompresjon) 
+    krever intelligens
+
+  • Mer intelligens gir bedre kompresjon
+
+  • Desimalene i \pi er et vanskelig datasett å komprimere. (mye 
+    variasjon) Men:
+
+    – vi kjenner rekkeutviklinger som genererer \pi.
+
+    – Et program med endelig lengde, kan generere hele rekka. \infty
+       kompresjon!
+
+  • Ei zipfil er vanskelig å komprimere, selv om det fins bedre 
+    kompresjon enn zip
+
+    – Hvis vi pakker ut zipfila, kan vi komprimere bedre med bz2
+
+    – Å oppdage at noe er zip-komprimert, og dermed kan behandles 
+      slik, krever intelligens…