MatrixTree.lua 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. function mt_create(tree, data)
  2. data = data or {data = {}, val = 0}
  3. local childCount = tree[1]
  4. if not childCount then
  5. return
  6. end
  7. local rTree = {}
  8. for i = 2, #tree do
  9. table.insert(rTree, tree[i])
  10. end
  11. if childCount then
  12. local cData = {val = 0, data = {}}
  13. for i = 1, childCount do
  14. data.data[i] = clone(cData)
  15. mt_create(rTree, data.data[i])
  16. end
  17. end
  18. return data
  19. end
  20. function mt_newNode(val)
  21. return {
  22. val = val or 0,
  23. data = {}
  24. }
  25. end
  26. function mt_set(cache, tree, value)
  27. local childIdx = tree[1]
  28. local data = cache.data[childIdx]
  29. local rTree = {}
  30. for i = 2, #tree do
  31. table.insert(rTree, tree[i])
  32. end
  33. if #rTree == 0 then
  34. data.val = value
  35. else
  36. mt_set(data, rTree, value)
  37. end
  38. end
  39. function mt_addNode(data, key, node)
  40. data.data = data.data or {}
  41. data.data[key] = node
  42. end
  43. function mt_getVal(cache, tree)
  44. local childIdx = tree[1]
  45. local data = cache.data[childIdx]
  46. local rTree = {}
  47. for i = 2, #tree do
  48. table.insert(rTree, tree[i])
  49. end
  50. if #rTree == 0 then
  51. return data.val
  52. else
  53. return mt_getVal(data, rTree, value)
  54. end
  55. end
  56. function mt_getData(cache, tree)
  57. local childIdx = tree[1]
  58. local data = cache.data[childIdx]
  59. local rTree = {}
  60. for i = 2, #tree do
  61. table.insert(rTree, tree[i])
  62. end
  63. if #rTree == 0 then
  64. return data
  65. else
  66. return mt_getData(data, rTree)
  67. end
  68. end
  69. function mt_max(cache)
  70. local maxVal = 0
  71. for k,v in pairs(cache.data) do
  72. if v.data and next(v.data) then
  73. v.val = mt_max(v)
  74. end
  75. maxVal = math.max(v.val, maxVal)
  76. end
  77. cache.val = maxVal
  78. return maxVal
  79. end
  80. --endregion