簡體   English   中英

比較數學運算所花費的時間

[英]comparing the time taken by mathematical operations

從理論上講,哪個實施應該更快?

long int total=0;
for(int n=1;n<=200000;)`
{ 
  total=total + n*(++n);
}

要么

 long int total=0,sum=0;
for(int n=1;n<=200000;n++)`
{ 
  sum =sum+2*n;
  total=total + sum;
}

還是沒有任何區別?

您需要做的是顯式地編寫要比較的兩個程序。 我想我知道您的意思,但是如果您明確編寫它,它將是確定的。

假設我對您的意思是正確的,則漸進時間復雜度對該問題毫無意義,因為沒有自由變量。 n被“綁定”到循環中。 如果將200000替換為M那么談論時間復雜度將是有意義的。

就絕對而言,您沒有編寫兩個程序中哪個程序更快的問題也是一個框架欠佳的問題,因為答案很可能取決於上下文,正如Mark Dickinson所指出的那樣。 如果我對程序的外觀是正確的,那么算術運算的次數似乎大致相同。 這可能意味着程序將在大約相同的時間內運行,也可能不會。 我的猜測是時差不會被察覺,但是為什么不嘗試一下呢?

最后,如果您要使用捷徑2(1)+2(2)+...+2(n)=n(n+1) ,那為什么不走得更遠一點呢?削減1(2)+2(3)+...+n(n+1)的總和? 我們有

n(n+1) = (1/3)((n+1)^3 - n^3) - (1/3)

所以

1(2)+2(3)+...+n(n+1) 
= (1/3)(2^3-1^3) - (1/3) + (1/3)(3^3-2^3) - (1/3) + ... + (1/3)((n+1)^3-n^3) - (1/3)
= ((n+1)^3 - n - 1)/3

該系列是“ telescoping”,因此中間的所有立方體項都將取消。 結果表達式可以用5個算術運算求值。

如果用上面的n = 200000代替,您將看到int total對於32位int類型將溢出。 那是你的意圖嗎?

更新

我在系統(MacBook Air / Yosemite)上嘗試過。 我比較的程序是

#include <stdio.h>

int main() {
  long int total;
  for (int trial=0; trial<1000; ++trial) {
    total = 0;
    for (int i=1; i<=200000; ++i) {
      total = total + i*(i+1);
    }
  }
  printf("answer is %ld", total);
  return 0;
}

#include <stdio.h>

int main() {
  long int total;
  int sum;
  for (int trial=0; trial<1000; ++trial) {
    total = 0;
    sum = 0;
    for (int i=1; i<=200000; ++i) {
      sum = sum + 2*i;
      total = total + sum;
    }
  }
  printf("answer is %ld", total);
  return 0;
}

我用gcc -O編譯了它們,然后在unix time命令下運行它們。 顯而易見的贏家(在我的系統上,以其特定的體系結構以及我做出的選擇)是第一個程序。 大約需要160毫秒,而第二秒大約需要240毫秒。 第一個運行時間為第二個時間的2/3。 我對架構了解不足,無法推測出差異的原因。

請注意,程序中的行total = total + i*(i++); 是不正確的。 計算出i*i然后增加i 此外,該行和改進的total = total + i*(++i)生成警告。

一些風格上的問題:對於循環索引,我使用i而不是n ,因此人們不會對n含義感到困惑。 我習慣性地使用++x來增加x而不是x++ ,這可能會使舊的x成為不必要的臨時副本。

好吧,如果您從算法的角度講,那么第一個操作的復雜度會高於第二個操作。 第一次操作的復雜度為O(1),而在第二種情況下,復雜度為O(n)。 因此,當您增加輸入的數量時,第一個輸入所花的時間可能會少於第二個輸入所花的時間。 延遲與執行操作所需的機器指令成正比。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM