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