【问题标题】:What would be the tight asymptotic runtime (Big Theta) for these algorithms?这些算法的严格渐近运行时间(Big Theta)是多少?
【发布时间】:2018-10-10 15:07:59
【问题描述】:

问题 1

 public void guessWhat1(int N){
  for (int i=N; i>0, i=i/2){
  for (int j=0; j<i*2; j+=1){
  System.out.println(“Hello World”);
  }
 }
}

第一个循环将运行 log(n)。 第二个循环将为 log(n) 运行。

上限是 O(log^2(n)。Big Θ 是多少?

问题 2

 public void guessWhat2(int N) {
 int i=1, s=1;
 while (s<=N) {
  i += 1;
  s = s + i;
 }
}

这个的上限是 O(n)。我不太确定 Big Θ。

如果有人能澄清这些,那就太好了。谢谢你

【问题讨论】:

  • 1)的建议:(i)注意“n”对于不同循环的含义,(ii ) 你确定第二个(内部)循环是log n吗?
  • @meowgoesthedog 感谢您的建议。一开始我以为它是(n),但是因为它乘以*2,它不会是log(n)吗?我在其他例子中也看到过类似的情况。

标签: algorithm big-o


【解决方案1】:

让我们先弄清楚符号的定义。

Big O:表示算法的上限

Big Theta:表示算法的平均界限

第一个问题

public void guessWhat1(int N){
  for (int i=N; i>0, i=i/2){
  for (int j=0; j<i*2; j+=1){
  System.out.println(“Hello World”);
  }
 }
}

对于i=N,内循环运行2N次,i=N/2内循环运行N次,对于i=N/4内循环运行N/2次..... 所以总复杂度 = O(2N+N+N/2+N/4+...+1) 这等于 O(N(2+1+1/2+1/4+....1/N))= O(N(3+1/2+1/4+....1/ N))

N(3+1/2+1/4+....1/N) = N( 3 + 1 - (0.5)^logN ) = O(N(4-1/N)) = O(N) 所以复杂度是 O(N),即使在 theta 表示法中,它与上述循环相同的 N 在所有情况下都需要相同的时间。

关于你的第二个问题

public void guessWhat2(int N) {
 int i=1, s=1;
 while (s<=N) {
  i += 1;
  s = s + i;
 }
}

while 循环需要 O(sqrt(N))。同上,这里的 theta 符号也将与大 O 符号相同,即 sqrt(N)。

如果输入有多种情况,theta 表示法与大 O 不同。让我们以插入排序 https://en.wikipedia.org/wiki/Insertion_sort 为例,其中 N 是输入数组的大小。如果输入数组已经排序,则需要线性时间,但如果输入数组是反向排序的,则需要 N^2 时间对数组进行排序。

所以在这种情况下,对于插入排序,时间复杂度是 O(N^2)。

最好的情况是 theta(N),最坏的情况是 theta(N^2)。

【讨论】:

  • @Chandini 感谢您的解释。您说 O(sqrt(n)) 与上面的 log(n) 相同。这是否意味着 log(n) = sqrt(n) 因为它们的图表不同。你能澄清一下吗?谢谢
  • 不,我的意思是第二个问题,theta 符号也将与大 O 相同,即 sqrt(N)。修改答案以避免混淆。
  • 我和@meowgoesthedog 在一起——第一个闻起来很像 O(n)。
  • @moreON 和 meowgoesthedog 谢谢。修改了我的答案
  • @moreON 谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-06
  • 1970-01-01
  • 2019-03-27
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
相关资源
最近更新 更多