Advertisement
Guest User

Untitled

a guest
Sep 8th, 2016
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. # -*- coding: iso-8859-2 -*-
  2. def LZ78_encode(data):
  3. D = {}
  4. n = 1
  5. c = ''
  6. result = []
  7. for s in data:
  8. if c + s not in D:
  9. if c == '':
  10. # specjalny przypadek: symbol 's'
  11. # nie występuje jeszcze w słowniku
  12. result.append( (0, s) )
  13. D[s] = n
  14. else:
  15. # ciąg 'c' jest w słowniku
  16. result.append( (D[c], s) )
  17. D[c + s] = n
  18. n = n + 1
  19. c = ''
  20. else:
  21. c = c + s
  22. return result
  23. def LZ78_decode(data):
  24. D = {}
  25. n = 1
  26. result = []
  27. for i, s in data:
  28. if i == 0:
  29. result.append(s)
  30. D[n] = s
  31. n = n + 1
  32. else:
  33. result.append(D[i] + s)
  34. D[n] = D[i] + s
  35. n = n + 1
  36. return ''.join(result)
  37. if __name__ == '__main__':
  38. import sys
  39. from math import log, ceil
  40. if len(sys.argv) < 2:
  41. print "Podaj nazwę pliku"
  42. sys.exit(1)
  43. data = open(sys.argv[1]).read()
  44. comp = LZ78_encode(data)
  45. decomp = LZ78_decode(comp)
  46. if data == decomp:
  47. k = len(comp)
  48. n = int(ceil(log(max(index for index, symbol in comp), 2.0)))
  49. l1 = len(data)
  50. l2 = (k*(n+8) + 7)/8
  51. print "Liczba par: %d" % k
  52. print "Maks. liczba bitów potrzebna do zapisania kodu: %d" % n
  53. print "Maks. liczba bitów potrzebna do zapisania pary: %d + %d = %d" % (n, 8, n+8)
  54. print "Rozmiar danych wejściowych: %d bajtów" % l1
  55. print "Rozmiar danych skompresowanych: %d bajtów" % l2
  56. print "Stopień kompresji: %.2f%%" % (100.0*(l1-l2)/l1)
  57. # print data
  58. # print decomp
  59. else:
  60. print "Wystąpił jakiś błąd!"
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement