【问题标题】:What is the running time of T(n)= T(n/2) + T(n/2) + n^2?T(n)= T(n/2) + T(n/2) + n^2 的运行时间是多少?
【发布时间】:2019-03-23 20:26:12
【问题描述】:

我知道这对你来说似乎很容易,但这些天有一些事情让我全神贯注。这两个方程的运行时间是否相同?

1) T(n)= T(n/2) + T(n/2) + n^2 ?

2) T(n)= 2T(n/2) + n^2 ?

因为在 1 中编译器必须为每个 T 每次调用,但在 2 中只有 on call 返回结果将乘以 2。在 1 中我们有一个树,我的意思是每次我们需要调用两次对于 T,

我想我发现了我不确定的错误, F(n) = F(n/2) + .... 与 T(n) 不同!!

如果我们编写代码 { return f(n) + f(n)} 它必须与基于运行时间的 return 2*f(n) 不同。不优化编译器

【问题讨论】:

  • 这取决于你的“方程式”中的T是代表运行时间,还是别的什么。
  • 如果编译器可以看到T()T() 的代码没有副作用,那么优化是可能的。至少据我所知,对于类 C 语言来说是这样的,但我相信如果我错了,有人会纠正我!
  • @BenVoigt 它正在运行时间。
  • @KenY-N 我没有谈到特殊的编译器,所以我认为我的 Q 不值得一个减号!!!!!!

标签: algorithm performance recursion


【解决方案1】:

两种算法都属于 O(log n) 类,但选项 #2 在实践中总是更快。

函数调用普遍比整数乘法慢,而且通常明显慢;即使在可以利用 T 的确定性来有效地缓存每个 T(x) 的结果的情况下也是如此。

编辑:看来我误解了 OP。

我理解 OP 是在询问特定递归函数 T(n) 的两个不同但在数学上等效的实现,它返回 n^2 + 2(n/2)^2 + 4(n/4) 的总和)^2 + ... + n(n/n)^2,假设 T(1) = 1 且 n 是 2 的完美幂。

实现#1 为每个递归级别调用了两次 T()。我错误地指出这样的算法将是 O(log n),而实际上它是 O(2n - 1),或者更简单地说是 O(n)。

实现#2 对每个递归级别只调用一次 T(),这使得它成为 O(log n)。因此,它可能是两者中较快的一个。

我现在明白 T() 是用于其他算法的时间函数!我的错。显然,在这种情况下,O() 的解决方案将由 n^2 项主导。

【讨论】:

  • 等等。如果那里有 n^2,那么函数怎么可能是 O(log n)?当谈到递归和渐近分析时,函数调用与跳转到内存中的另一条指令有什么关系呢? T(n/2) + T(n/2) = 2T(n/2),两个递归完全一样。我知道 OP 指的是两个,但重复只是代表这一点的错误工具。
  • LOG (n)!!!!!!。你在开玩笑。我知道运行时间,但我只是想确定差异
猜你喜欢
  • 2021-02-27
  • 1970-01-01
  • 2017-10-03
  • 2015-08-04
  • 2011-08-03
  • 2015-05-08
  • 2021-05-05
  • 1970-01-01
  • 2012-06-08
相关资源
最近更新 更多