时间space权衡

Time space trade-off

我在测验中被问到以下问题,当提示我设计更高效的代码段时,我不知道该问自己什么。我的意思是我知道 if-else 很耗时,我在想也许是一个 for 循环?我很好奇是否有人可以 A. 告诉我是否只有 1 个答案,然后 B. 告诉我为什么解决方案可能 运行s 如此之快。

它说:假设下面的代码段很耗时,写一段至少可以节省运行时间的2分钟。

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

"I mean I know if-else are time consuming, I was thinking maybe a for loop" 这是不正确的。想想这里发生的事情实际上 很耗时。提示:f(n) 可以做很多事情。但是如果代码需要很长时间来处理,那么唯一最好的选择就是 f(n) 是罪魁祸首。这里唯一发生的另一件事是 if-statement ,它很快,还有一些算术(计算机在这方面非常快)。

幸运的是,您正在多次计算固定输入 nf(n)!通过将此方法的输出保存在变量中然后仅使用该变量来省去麻烦。我不知道你或你的老师从哪里得到的“2 分钟”,在我看来那是胡说八道。

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

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

如果你的教授说你需要从代码中节省两分钟,那么你可以说代码至少需要两分钟来计算。您在代码中计算了 3 次 f(n),那么假设没有缓存,可以肯定地说每次 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;

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

无论条件 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 执行时间 f(n) 调用) - (声明变量并为其赋值的执行时间 + ( 2 x execution time of reading value from that variabl). 声明和赋值,读取值的执行时间从该变量开始,给定代码中的其他语句(如 if 语句和逻辑表达式操作)无关紧要(可能小于 1 毫秒)。

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