Algorithm 欧拉计划#8:有比暴力计算更有效的算法吗?

Algorithm 欧拉计划#8:有比暴力计算更有效的算法吗?,algorithm,Algorithm,问题 有没有比蛮力法更好的方法来解决工程Euler问题8,也就是说 我计算了所有可能的乘积,选择了最大的一个--蛮力算法 有没有更有效的算法?还是暴力手段是唯一的方法 旁注 这不是一个家庭作业问题 我不是在问问题8的结果 由于问题要求连续数字,“暴力”在本例中表示O(n),n为数字(1000)。只要数字中没有某种模式,只需扫描数字就需要n个步骤,因此这是最快的解决方案 您可以缓存最后4位数字的乘积或执行类似的操作,但肯定不会比O(n)更好。您可以使用大小为5的滑动窗口,在O(d)中解决此问题,

问题

有没有比蛮力法更好的方法来解决工程Euler问题8,也就是说

我计算了所有可能的乘积,选择了最大的一个--蛮力算法

有没有更有效的算法?还是暴力手段是唯一的方法

旁注

  • 这不是一个家庭作业问题
  • 我不是在问问题8的结果

由于问题要求连续数字,“暴力”在本例中表示O(n),n为数字(1000)。只要数字中没有某种模式,只需扫描数字就需要n个步骤,因此这是最快的解决方案


您可以缓存最后4位数字的乘积或执行类似的操作,但肯定不会比O(n)更好。

您可以使用大小为5的滑动窗口,在
O(d)
中解决此问题,其中d是输入数字中的位数

通过窗口中起始编号的索引表示窗口,窗口i的值是元素与索引[i,i+4]的乘积。现在,在每次迭代中,将窗口向右滑动,有效地删除最左边的元素,并在右侧添加新元素,窗口的新值是
old\u value/left\u most\u ele*new\u right\u ele
。对范围
[0,d-5]
中的每个索引
i
继续执行此操作,并找到最大窗口值


请注意,在内部循环运行五次的情况下使用嵌套循环的蛮力方法也是一种
O(d)
解决方案。但是上面的方法稍微好一点,因为我们在每一步中不进行五次乘法,而是进行一次乘法和一次除法。

是和否。您确实需要查看五个连续数字的每个序列,但您不必每次通过循环都对这些序列进行乘法。有一些快捷方式可以加快处理速度。例如,如果下一个数字是0,则可以向前跳过。此外,如果下一个数字小于从序列中删除的最后一个数字,则您知道与其他四个常用数字相乘的结果将更小,因此跳过相乘并转到下一个数字。当你只有1000位数字时,这样的技巧不会有太大的区别,但是以后的问题会是一样的,只是输入的数字更大。

一个优化是计算前五位数字的乘积,在每次迭代中乘以下一位数字,再除以上一位(移动窗口)


另一个优化是立即丢弃
0

周围的所有数字,但要小心不要除以0:)@IVlad:我把这些细节留给OP:)+1谢谢你的精彩回答!