如何在一秒内计算任意 n <= 600的最短加法链(sac) ?
笔记
这是本月的codility编程竞赛。
加法链在数值上非常重要,因为它们是计算 x^n 的最经济的方法(通过连续乘法)。
Knuth's Art of Computer Programming, Volume 2, Seminumerical Algorithms很好地介绍了加法链和一些有趣的属性,但我没有找到任何东西可以满足严格的性能要求。
我尝试过的(剧透警报)
首先,我构建了一个(高度分支的)树(开始 1-> 2 -> ( 3 -> ..., 4 -> ...)),这样对于每个节点 n,从根到 n 的路径是 n 的一个囊。但是对于 >400 的值,运行时间与制作咖啡的时间大致相同。
然后我用那个程序找到了一些有用的属性来减少搜索空间。有了它,我可以在制作咖啡的同时构建多达 600 个的所有解决方案。但是对于 n,我需要计算直到 n 的所有解决方案。不幸的是,codility 也测量了类初始化的运行时间......
由于问题可能是 NP-hard,我最终硬编码了一个查找表。但是既然codility要求构建sac,我不知道他们是否有一个查找表,所以我觉得很脏,像个骗子。因此这个问题。
更新
如果您认为硬编码的完整查找表是可行的方法,您能否给出一个论据,为什么您认为完整计算/部分计算的解决方案/启发式方法不起作用?