Advertisement
Guest User

Untitled

a guest
Jun 18th, 2019
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.12 KB | None | 0 0
  1. from collections import Counter
  2. import heapq
  3.  
  4. def rec(level,p,s):
  5. w,l,r=tree[level][p]
  6. if l==r:
  7. print(key[l],s)
  8. d[key[l]]=s
  9. return 0
  10. rec(level-1,r,s+'1')
  11. rec(level-1,l,s+'0')
  12.  
  13. s=input()
  14. dictionary=Counter(s)
  15. p=[]
  16. tree=[]
  17.  
  18. key=[i for i in dictionary]
  19. for i,letter in enumerate(key):
  20. w=dictionary[letter]
  21. heapq.heappush(p,(w,i,i,-1)) #weight, leftchild, rightchild, level of node..set to -1 because we don't know on which level node might be.
  22.  
  23. heapq.heapify(p)
  24.  
  25. while len(p)!=1: #all can be done without weight appending to a tree..it's more readable
  26. l,cl1,cl2,level1= heapq.heappop(p) #cl -> short for child left
  27. r,cr1,cr2,level2 = heapq.heappop(p)
  28.  
  29. level=max(level1,level2)+1
  30. if len(tree)<=level:
  31. tree.append([])
  32.  
  33. tree[level].append([l,cl1,cl2])
  34. tree[level].append([r,cr1,cr2])
  35. position=len(tree[level])
  36.  
  37. heapq.heappush(p,(l+r,position-2,position-1,level))
  38.  
  39. tree.append([heapq.heappop(p)[:3]])
  40.  
  41. #for i in tree:
  42. # print(*i)
  43. d={}
  44. rec(len(tree)-1,0,'')
  45. out=''
  46. for i in s:
  47. out+=d[i]
  48. print('compressed:',out)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement