簡體   English   中英

確定算法的確切執行次數

[英]Determining the exact number of executions of an algorithm

我有算法,例如:

for(int i=1; i<=n; i++)
  for(int j=1; j<=2*n; j=j+2)
     for(int k=i; k<=j; k++)
        instr;

我需要找到一個公式來確定“instr”指令將被執行多少次。

我寫了這個。 在此處輸入圖像描述 . 但我得到的值不正確。 例如對於 n=4,“instr”將被執行 43 次,但我的總和得到了 40。

我哪里搞砸了?

從代碼

int count = 0;
for(int i=1; i<=n; i++)
  for(int j=1; j<=2*n; j=j+2)
     for(int k=i; k<=j; k++)
         count++;

可以將其轉換為語義等價的:

int count = 0;
for(int i=1; i<=n; i++)
    for(int j=1; j<=n; j++)
        for(int k=i; k<=2*j - 1; k++)
           count++;

如果在兩個代碼版本的末尾打印count變量,它的值將是:

       |  loop 1 | loop 2
________________________________ 
N = 1  |    1    |   1
N = 2  |    6    |   6
N = 3  |    19   |   19 
N = 4  |    43   |   43 
N = 5  |    82   |   82

從第二個循環中,您提取了公式:

這在紙上是有道理的,但是,有一個問題。 將公式轉換為代碼:

   public static int third_loop(int n ){
        int count = 0;
        for(int i=1; i<=n; i++)
            for(int j=1; j<=n; j++)
                count += (2 * j - 1)  - i + 1;
        return count;
    }

並顯示變量count的值:

       | loop  1 | loop 2 | loop 3
____________________________________
N = 1  |    1    |   1    |    1
N = 2  |    6    |   6    |    6
N = 3  |    19   |   19   |    18
N = 4  |    43   |   43   |    40 
N = 5  |    82   |   82   |    75

count數值現在不同了,其原因是會有 (2 * j - 1) < i + 1 的迭代,因此公式 (2 * j - 1) - i + 1 將產生負面結果,並將這些結果添加到變量count 在第二個循環中隱含地避免了一些事情。 如果將第三個循環更改為:

  public static int fourth_loop(int n ){
        int count = 0;
        for(int i=1; i<=n; i++)
            for(int j=1; j<=n; j++)
                count += Math.max((2 * j - 1)  - i + 1, 0);
        return count;
    }

一個人會得到:

      | loop  1 | loop 2  | loop 3  | loop 4
__________________________________________
N = 1  |    1    |   1    |    1    |  1
N = 2  |    6    |   6    |    6    |  6
N = 3  |    19   |   19   |    18   |  19
N = 4  |    43   |   43   |    40   |  43
N = 5  |    82   |   82   |    75   |  82

所以你的公式的問題是它也考慮了負值,而你的代碼沒有。 因為,我沒有數學工具來給你精確的公式,所以我請你的來自math.stackexchange的朋友這樣做。

編輯:從我提供的賞金中,馬修塔得出了以下確切的表達:

在此處輸入圖像描述

暫無
暫無

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

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