algorithm - 使用缓存计算树结构中的总和

标签 algorithm caching recursion data-structures tree

我需要知道什么类型的算法可以借助缓存机制有效地计算树结构中的和。

我想解决的问题很简单:有两种类型的节点:文件夹 (F) 和文件 (L) ...看起来像一个文件系统:) ...

可以在树结构中创建和移动文件夹和文件。文件大小不断变化。

现在我想要一个返回节点内容大小的函数 size(node)

示例:

F1
 - L1 : 10
 - L2 : 33
F2 
 - F21
    - F211
         - L3 : 2
         - L4 : 8
    - F212
         - F2121
               - L5 : 18
         - F2122
               - L6 : 21
               - L7 : 3            

size(node) gives:

size(F1):43
size(F2):52
size(F21):52
size(F211):10
size(F212):42
size(L5):18
...

已知的解决方案是递归累加 :) ...

size(node) 
  int res=0;
  if(node is File)
    return sizeOfFile(node)
  else
    for each child of node
      res += size(child)
    end 
  end
  return res
end

我问自己是否可以在这里使用某种类型的缓存。我需要搜索的算法的名称和类型是什么?

最佳答案

您可以做一件事。您可以在访问节点并存储它时计算成本。把它想象成手机或电脑上的存储空间。这里有一个例子会更好。 enter image description here

我这里没有给出任何节点的成本。假设您访问节点号 4。您通过将 6 和 7 的成本相加来计算成本并将其存储在数据库中。在数据库上,这可以存储为 directory path -- cost 。现在假设您要计算 2 的成本。您不需要访问 4,因为您已经预先计算了成本。您只需计算 5 的成本即可。因此,我们将 5 和 2 的成本存储在数据库中。下次如果您想知道 4 或 5 的大小,您可以从数据库中获取它。

我假设这是一个文件结构。因此,您将需要更频繁地访问目录。您访问的次数越多,存储的尺寸就越多。计算成本越容易。最后,如果您更改文件或移动它们,只需计算该节点的成本即可。

我认为这里的优势在于您不需要在每次访问节点时都计算成本。随着时间的流逝,您将使用一种可以使您的大小计算速度更快的存储。

希望这是有道理的。

关于algorithm - 使用缓存计算树结构中的总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35498817/

相关文章:

maven-2 - 为什么 Maven 在安装过程中可能会忽略更新的类?

php - 如何在 Laravel 中过滤缓存的查询

c++ - 如何将指针拖到类对象的指针内并递归分配它们然后返回指针? C++

c - 简单标量缓存 LRU 实现

c# - 是否可以实现递归 "SelectMany"?

sorting - 使用 Haskell 按字典顺序获取排列

c++ - 我可能对 std::set 的工作感到困惑。我的代码不能正常工作

algorithm - 为什么 Java 中的 Math.random() 返回 [0, 1) 中的 double 而不是其他间隔?

algorithm - 当已知一个变量小于另一个变量时如何处理大 O?

algorithm - 梯度下降算法在 Haskell 中不收敛