作者dh3014 (丝弦裂帛只字动天)
看板Prob_Solve
标题Re: [问题] 面试遇到的程式问题,现在还想不出来(MTK)
时间Sun Jan 6 23:48:26 2008
※ 引述《asleepme (冬天了)》之铭言:
: ※ [本文转录自 Tech_Job 看板]
: 作者: asleepme (冬天了) 看板: Tech_Job
: 标题: [问题] 面试遇到的程式问题,现在还想不出来...
: 时间: Sun Dec 30 13:42:09 2007
: 是当面问的
: 不过他当初是这样讲的:
: 有一个for回圈,从0加到100
: 可是我觉得他不够快,要怎样才能让他更快
: for( i=0; i<=100; i++)
: s=s+i;
: 不可以用数学公式
: 请忽略宣告或初始化的问题,我想不是重点
显然,从数学和算法的角度出发,绝对是最理想的,
而且本题既然可以这样做,把线性的化成常数(well,容我不精确地把数值计算当成常数)
就应该这样做。
如果他真的是打算考较你程式码调校,那这个例子也未免不太恰当…
因为根本没啥必要调校,多数的compiler对这种简单的一层回圈,
自动的最佳化能比你的调校还要好。
目前调校程式码,最简单的是善用cache的技巧以及回圈的展开,
两者间要取一个trade-off并总是很容易,通常8层~16层左右的回圈展开都会有
1.5以上的速度增益。
总之我完全建议采用:
s=5050; 来加速,你想用常数或巨集都请便,如果说100是个变数:
显然
s=n* (n+1)/2; 就好了,你喜欢搞神秘也可以用
s=(n*-~n)>>1;
程式码调校不应该在这种case下列入考量…
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 219.84.97.54