Memory management 有没有一种内存有效的方法来计算这个序列的直方图?

Memory management 有没有一种内存有效的方法来计算这个序列的直方图?,memory-management,tree,Memory Management,Tree,通过递归地将两个函数应用于某个起始值A,即给定序列,生成一个二叉数字树 a, f(a), g(a), f(f(a)), g(f(a)), f(g(a)), g(g(a)), ... 我需要计算在这个序列中所有达到极限的值出现的次数,这可能是因为g(x)>f(x)>x始终保持不变。算法很简单:从一个用a初始化的集合开始,我用f(x)和g(x)替换元素x,除非它们大于限制 唯一的问题是,即使只使用一个字节作为计数器,我也需要大约5倍的内存 我试着使用虚拟内存,但是本地性很糟糕,我怀疑这个程序今年会

通过递归地将两个函数应用于某个起始值
A
,即给定序列,生成一个二叉数字树

a, f(a), g(a), f(f(a)), g(f(a)), f(g(a)), g(g(a)), ...
我需要计算在这个序列中所有达到
极限的值出现的次数,这可能是因为
g(x)>f(x)>x
始终保持不变。算法很简单:从一个用
a
初始化的集合开始,我用
f(x)
g(x)
替换元素
x
,除非它们大于
限制

唯一的问题是,即使只使用一个字节作为计数器,我也需要大约5倍的内存

我试着使用虚拟内存,但是本地性很糟糕,我怀疑这个程序今年会终止。通过总是替换最小的元素来生成数字会导致非常好的局部性,但是(类似于)集合像杂草一样生长,并且内存消耗比以前更糟糕


我通过重复整个计算5次解决了这个问题,同时在
n
-第次运行时忽略所有条目,除了
(n-1)*limit/5
n*limit/5
之间的条目。有更好的解决方案吗?

限额有多大?顺便说一句,你最后做的事情听起来有点像迭代深化DFS-@Ivan Vergiliev:
limit=1e11
,所以我需要100 GB,只有32 GB。我来看看IDDF。