通过递归地将两个函数应用于某个起始值a
来生成二进制数字树,即给定序列
a, f(a), g(a), f(f(a)), g(f(a)), f(g(a)), g(g(a)), ...
我需要计算此序列中出现limit
的所有值的次数,这可能始终保持g(x) > f(x) > x
。该算法很简单:从使用a
初始化的集合开始,我将x
和f(x)
替换为g(x)
,除非它们大于limit
}。
唯一的问题是,即使只使用一个字节作为计数器,我需要的内存大约是我的5倍。
我尝试使用DFS的虚拟内存,但是这个地方非常糟糕,我怀疑这个程序会在今年终止。通过总是替换最小元素来生成数字会导致非常好的局部性,但是(类似于BFS)集合像杂草一样增长,并且内存消耗比以前更糟。
我通过重复整个计算5次来解决问题,而在n
次运行时忽略除(n-1)*limit/5
和n*limit/5
之间的所有条目。有更好的解决方案吗?