我想预先计算一些一元函数的值数组f
。
我知道我只需要f(x)
wherex
形式为的值a*b
,其中a
和b
都是 range 中的整数0..N
。
显而易见的时间优化选择只是制作一个大小数组,N*N
并仅预先计算我稍后将要阅读的元素。对于f(a*b)
,我只需检查并设置tab[a*b]
. 这是可能的最快方法 - 但是,这将占用大量空间,因为该数组中有很多索引(以 开头N+1
)永远不会被触及。
另一种解决方案是制作一个简单的树形图......但这会通过引入大量分支来大大减慢查找本身的速度。不。
我想知道 - 是否有任何解决方案可以使这样的数组不那么稀疏和更小,但在查找中仍然快速无分支 O(1)?
编辑
我可以听到很多关于哈希映射的评论......我将继续对一个人的行为进行基准测试(我预计由于分支而导致正常查找的性能显着下降;低于树,但仍然......让我们看看我是否是对的!)。
我想强调一下:我最喜欢一种分析解决方案,它会使用一些聪明的方法(?)来利用仅采用“类产品”索引这一事实。我觉得这个事实可能会被利用来获得比普通的通用哈希映射函数更好的结果,但我自己没有想法。
编辑
按照您的建议,我std::unordered_map
从 gcc 4.5 开始尝试。这比简单的数组查找要慢一点,但确实比基于树的查找要快得多std::map
——最终我对这个解决方案感到满意。我现在明白为什么不能按照我最初的意图去做了;感谢您的解释!
我只是不确定哈希映射是否真的节省了任何内存!:) 正如@Keith Randall 所描述的,我无法使内存占用低于N*N/4
,而@Sjoerd 描述的三角矩阵方法给了我N*N/2
。我认为N*N/2
如果元素大小很小(取决于容器开销),哈希映射完全有可能使用更多空间 - 这将使最快的方法也是最有效的内存!我会试着检查一下。
我希望我能接受2个答案...