时空权衡

时间:2015-03-10 14:34:41

标签: java math if-statement for-loop

在测验中我被问到以下问题并且在提示设计更有效的代码段时不知道该问我自己。我的意思是我知道 - 如果 - 其他是耗费时间,我想也许是for循环?我很好奇是否有人可以A.告诉我是否只有1个答案而且B.告诉我为什么解决方案可以运行得更快。

它说:假设以下代码段非常耗时,请编写一个至少削减运行时间2分钟的段。

if (f(n)%==0)
  key = 3*f(n)+4*f(n)+7;
else 
  key = 6*f(n)*f(n)-33;

4 个答案:

答案 0 :(得分:5)

“我的意思是我知道 - 如果 - 其他是耗费时间,我想也许是for循环”这是不正确的。考虑一下这里发生的实际耗时。提示:f(n)可以做很多事情。但如果代码需要很长时间才能处理,那么唯一最好的选择是f(n)是罪魁祸首。这里发生的唯一其他事情是if-statement这是快速的,有些算术(计算机非常快)。

幸运的是,您正在多次计算固定输入f(n)的{​​{1}}!通过将此方法的输出保存在变量中然后仅使用变量来节省您的麻烦。我不知道你或你的老师在哪里“2分钟”,在我看来,这是任意的废话。

答案 1 :(得分:5)

需要注意的是f(n)在所有情况下都会被调用3次。如果我们假设这是瓶颈,那么我们希望最小化我们调用该函数的次数。

另请注意,f(n)的结果是常数(假设没有外部因素)。因此,您只需要计算一次。

答案 2 :(得分:0)

如果您的教授说您需要从代码中缩两分钟,那么您可以说代码至少需要两分钟来计算。您在代码中计算f(n) 3次,然后可以肯定地说,假设没有缓存,每个f(n)计算大约需要40秒。然后,通过在开头计算f(n)一次并保存结果以在其他四个调用中使用它将节省40*2秒。

这样的事情:

result = f(n)
if (result%==0)
   key = 3*result+4*result+7;
else 
   key = 6*result*result-33;

答案 3 :(得分:0)

根据测验,优化的代码段将至少削减两分钟的时间。您可以推断出给定的代码段至少需要两分钟来计算。

无论条件if语句的结果如何,您在给定的代码段中调用f(n) 3次。

通过在开头计算f(n)一次并将值分配给将在后续计算中使用的变量...

这样的事情:

result = f(n)
if (result%==0)
   key = 3*result+4*result+7;
else 
   key = 6*result*result-33;

... 减少 执行时间 2 x 执行时间 {{ 1}} 调用) - (声明变量并为其赋值的执行时间 +( 2 x 执行时间为从变量读取值。。声明和赋值,从该变量读取值以及给定代码中的其他语句(如if语句和逻辑表达式操作)的执行时间是微不足道的(可能不到1毫秒)。

根据预期结果,您可以推断每次调用f(n)至少需要1分钟才能执行;为了重新迭代,给定代码段执行产量与现在优化的代码段执行结果之间的时间差异,结果是2分钟。