我正在参加Al Zimmermann的编程竞赛。
http://www.azspcs.net/Contest/SonOfDarts
我编写了一个递归算法,但运行时间很长。我想知道关于递归算法速度的最重要的事情是什么。我已将大多数属性设置为全局属性,因此每次递归步骤都不会分配它们。还有什么我能做的,可以在不改变算法的情况下加速我的程序吗?
答案 0 :(得分:2)
这取决于算法的细节。如果是 tail recursive ,您可以相当容易地将其转换为迭代算法。
答案 1 :(得分:0)
Recusrsion总是慢于itterative。由于堆栈/堆/内存分配比大多数执行速度慢。在复杂算法中实现重复函数更容易,如果可能的话,坚固,itterative会更快。
答案 2 :(得分:0)
您使用什么语言编写程序?像Haskell这样的语言是为递归算法量身定做的,而像Python这样的其他语言则不是。
每个函数调用花费了多少时间与函数的递归调用次数?在函数本身内执行的代码太少肯定会导致性能下降。
堆栈上的变量通常比全局变量快得多。考虑从函数到函数传递它们而不是将它们放在全局中。
不幸的是,问题上没有足够的背景来提供更好的答案。
递归算法也可以设计为尾递归。在这种情况下,编译器支持尾递归优化,从而导致更快的代码。
答案 3 :(得分:0)
您的算法中可能存在大量重叠的子问题,并且您没有为每个子问题保存中间结果。如果你这样做,你的程序应该足够快。
修改强>: 我只是对飞镖问题进行了一些思考,并认为采用递归可能不是解决问题的好方法。我在SQL服务器上做了一些研究,问题给出了样本:
create table regions (score int)
insert into regions values (0)
insert into regions values (1)
insert into regions values (2)
insert into regions values (4)
insert into regions values (7)
insert into regions values (11)
create table results (score int)
insert into results
select distinct (s1.score+s2.score+s3.score)
from regions s1, regions s2, regions s3
select * from results
该脚本清楚地揭示了一种可以在命令式编程风格中轻松实现的可能解决方案,而无需采用任何递归方法。
答案 4 :(得分:0)
不要认为问题在于递归或其他任何先验的问题。只需this,你找出最大的东西,修复它,然后继续下一步。我并不是说在某些时候递归是不是很重要。只是机会非常好,你可以先解决更大的问题。
答案 5 :(得分:0)
如果您可以提交英特尔平台的编译代码,那么: 内存内容的搭配有利于CPU缓存内容优于任何领域的最佳经典算法。确保使用提供给链接器选项的英特尔VTune性能分析器输出,以保持相关功能的主体位于代码存储器中。