Performance 如何在一秒钟内计算任意n≤600的最短加法链?

Performance 如何在一秒钟内计算任意n≤600的最短加法链?,performance,algorithm,numbers,Performance,Algorithm,Numbers,你怎么计算任意n的a呢?我刚刚拿到了这个问题的金证书。我不会提供完整的解决方案,因为该问题仍然存在于网站上。我将给您一些提示: 你可以考虑做一个深入的第一次搜索。 每个n

你怎么计算任意n的a呢?我刚刚拿到了这个问题的金证书。我不会提供完整的解决方案,因为该问题仍然存在于网站上。我将给您一些提示:

你可以考虑做一个深入的第一次搜索。 每个n<12509都存在一个最小的星链 你需要知道如何删减你的搜索空间。 你需要一个很好的链长度下限,你正在寻找。 记住,你只需要一个解决方案,而不是全部。 祝你好运

加法链在数值上非常重要,因为它们是 通过连续乘法计算x^n的最经济的方法

事实并非如此。它们并不总是计算x^n最经济的方法。格雷厄姆等人:

如果添加链中的每个步骤都分配了与产品相等的成本 在该步骤的数字中,二进制加法链显示为 将成本降至最低

当我们计算x^n mod m时,情况发生了巨大的变化,这是一种常见的情况,例如在密码学中

现在,回答你的问题。除了用答案对表格进行硬编码外,您还可以尝试使用Brauer链

布劳尔链又称星链,是一种加法链,其中每个新元素都是前一个元素和某些可能相同的元素的总和。布劳尔链是n<12509的sac。引述:

布劳尔的算法通常被称为从左到右的2^k元方法, 或者简单的2^k元方法。它非常受欢迎。这很容易理解 使生效构造n的链是一个简单的问题 检查n的位。它不需要太多的存储空间


顺便问一下,有人知道Brauer的链式计算的一个像样的C/C++实现吗?我正在使用二进制和Brauer链对两种情况下的求幂时间进行部分比较:x^n和x^n mod m。

是否明确要求您不要构建查找表?这是解决问题的有效方法。我也会选择查找。与其说是肮脏的骗子,不如说更像是诡计……好吧,问题解决了;尽管我发现Codibility的措词有误导性——我不是在构建sac,我只是在查找它……一秒钟的限制高得离谱,仅仅是查找一个包含600个条目的表。要么你错过了什么,要么他们错过了-硬编码的查找表似乎有点。。便宜。谢谢你的建议,slvr+1。我使用了比星链更强大的属性-你有没有关注我的math.stackexchange链接?不过,我确实使用了动态规划,并认为DFS无法快速找到解决方案,因为最短的加法链相对较少。所以现在我知道我的金质证书作弊了,周日早上我有一个很好的任务:我确实读了你在math.stackechange.com上写的东西。动态规划,嗯?有趣的对于DFS,i5-2400上的运行时间上限为80ms。