Cobra_Tomtrein-temp-

Untitled

Jul 20th, 2017
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.50 KB | None | 0 0
  1. local api = {}
  2.  
  3.  
  4. --Type example
  5. --local leaf = {freq = x, char = y}
  6. --local node = {freq = x, right = t1,left = t2}
  7. function dequeue(tab)
  8. local data = tab[1]
  9. for i=2,#tab do
  10. tab[i-1] = tab[i]
  11. tab[i] = nil
  12. end
  13. return data
  14. end
  15.  
  16. function enqueue(tab,data,ind)
  17. if ind then
  18. for i=#tab,ind,-1 do
  19. tab[i+1] = tab[i]
  20. end
  21. else
  22. ind = #tab+1
  23. end
  24. tab[ind] = data
  25. end
  26.  
  27. function insertOrder(data,tab,valueFunc)
  28. local n_val = valueFunc(data)
  29. for i2=1,#tab do
  30. local val = valueFunc(tab[i2])
  31. if n_val <= val then
  32. enqueue(tab,data,i2)
  33. return
  34. end
  35. end
  36. enqueue(tab,data)
  37. end
  38.  
  39. function sort(tab,valueFunc)
  40. local tab2 = {}
  41. for i,v in pairs(tab) do
  42. tab2[i] = v
  43. end
  44. for i=1,#tab do
  45. tab[i] = nil
  46. end
  47. for i=1,#tab2 do
  48. local data = tab2[i]
  49. insertOrder(data,tab,valueFunc)
  50. end
  51. end
  52.  
  53.  
  54. function makeLeaf(freq,char)
  55. local leaf = {}
  56. leaf.freq = freq
  57. leaf.char = char
  58. return leaf
  59. end
  60.  
  61. function isLeaf(leaf)
  62. return leaf.char ~= nil
  63. end
  64.  
  65. function makeNode(n_l1,n_l2)
  66. local node = {}
  67. node.freq = n_l1.freq + n_l2.freq
  68. node.left = n_l1
  69. node.right = n_l2
  70. return node
  71. end
  72.  
  73. function getFreq(node)
  74. return node.freq
  75. end
  76.  
  77. function make_table(txt)
  78. local tab = {}
  79. for chr in txt:gmatch(".") do
  80. tab[chr] = (tab[chr] or 0) + 1
  81. end
  82. return tab
  83. end
  84.  
  85. function sort_huffman_table(tab)
  86. while #tab > 1 do
  87. sort(tab,getFreq)
  88. print(textutils.serialize(tab))
  89. local n1 = dequeue(tab)
  90. print(textutils.serialize(tab))
  91. local n2 = dequeue(tab)
  92. print(textutils.serialize(tab))
  93. local n3 = makeNode(n1,n2)
  94. insertOrder(tab,n3,getFreq)
  95. end
  96. return tab
  97. end
  98.  
  99. function make_huffman_table(txt)
  100. local tab = make_table(txt)
  101. print(#tab)
  102. local nodeTable = {}
  103. for chr,freq in pairs(tab) do
  104. nodeTable[#nodeTable+1] = makeLeaf(freq,chr)
  105. end
  106. print(textutils.serialize(nodeTable))
  107. sort_huffman_table(nodeTable)
  108. return nodeTable
  109. end
  110.  
  111. function decode_node(node,bits)
  112. local m_bit = dequeue(bits)
  113. local m_node = nil
  114. if m_bit == 0 then
  115. m_node = node.left
  116. else
  117. m_node = node.right
  118. end
  119. if isLeaf(m_node) then
  120. return m_node.char
  121. else
  122. return decode_node(m_node,bits)
  123. end
  124. end
  125.  
  126. function decode(node_tree,bits)
  127. local txt = ""
  128. while #bits > 0 do
  129. txt = txt..decode_node(node_tree,bits)
  130. end
  131. return txt
  132. end
  133.  
  134. api.decode = decode
  135. api.makeTable = make_huffman_table
  136.  
  137. _G.huffman = api
Advertisement
Add Comment
Please, Sign In to add comment