June 2018 Update
This commit is contained in:
parent
ba8067c3b7
commit
22f33d4004
5278 changed files with 84726 additions and 14379 deletions
50
Task/LZW-compression/Julia/lzw-compression.julia
Normal file
50
Task/LZW-compression/Julia/lzw-compression.julia
Normal file
|
|
@ -0,0 +1,50 @@
|
|||
function compressLZW(decompressed::String)
|
||||
dictsize = 256
|
||||
dict = Dict{String,Int}(string(Char(i)) => i for i in range(0, dictsize))
|
||||
result = Vector{Int}(0)
|
||||
w = ""
|
||||
for c in decompressed
|
||||
wc = string(w, c)
|
||||
if haskey(dict, wc)
|
||||
w = wc
|
||||
else
|
||||
push!(result, dict[w])
|
||||
dict[wc] = dictsize
|
||||
dictsize += 1
|
||||
w = string(c)
|
||||
end
|
||||
end
|
||||
if !isempty(w) push!(result, dict[w]) end
|
||||
return result
|
||||
end
|
||||
|
||||
function decompressLZW(compressed::Vector{Int})
|
||||
dictsize = 256
|
||||
dict = Dict{Int,String}(i => string('\0' + i) for i in range(0, dictsize))
|
||||
result = IOBuffer()
|
||||
w = string(Char(shift!(compressed)))
|
||||
write(result, w)
|
||||
for k in compressed
|
||||
if haskey(dict, k)
|
||||
entry = dict[k]
|
||||
elseif k == dictsize
|
||||
entry = string(w, w[1])
|
||||
else
|
||||
error("bad compressed k: $k")
|
||||
end
|
||||
write(result, entry)
|
||||
dict[dictsize] = string(w, entry[1])
|
||||
dictsize += 1
|
||||
w = entry
|
||||
end
|
||||
return String(result)
|
||||
end
|
||||
|
||||
original = ["0123456789", "TOBEORNOTTOBEORTOBEORNOT", "dudidudidudida"]
|
||||
compressed = compressLZW.(original)
|
||||
decompressed = decompressLZW.(compressed)
|
||||
|
||||
for (word, comp, decomp) in zip(original, compressed, decompressed)
|
||||
comprate = (length(word) - length(comp)) / length(word) * 100
|
||||
println("Original: $word\n-> Compressed: $comp (compr.rate: $(round(comprate, 2))%)\n-> Decompressed: $decomp")
|
||||
end
|
||||
Loading…
Add table
Add a link
Reference in a new issue