Algorithm 如何计算此算法中的基元运算?

Algorithm 如何计算此算法中的基元运算?,algorithm,time-complexity,Algorithm,Time Complexity,首先:以下伪代码的T(n)和O(n)是什么? 当内部for循环有一个变量限制时,如何对这样的代码进行遍历和计数操作 其次:在我努力精确计算原始操作时,需要寻找哪些原始操作 我知道没有必要计算原始操作的确切数量(对于O(n)),但知道如何计算会使我更容易计算“大画面” Input: X, a 1-D numerical array of size n 1) Let A = an empty 1-D numerical array of size n ~T1 = 1 or n 2) For i

首先:以下伪代码的T(n)和O(n)是什么? 当内部for循环有一个变量限制时,如何对这样的代码进行遍历和计数操作

其次:在我努力精确计算原始操作时,需要寻找哪些原始操作

我知道没有必要计算原始操作的确切数量(对于O(n)),但知道如何计算会使我更容易计算“大画面”

Input: X, a 1-D numerical array of size n
1) Let A = an empty 1-D numerical array of size n ~T1 = 1 or n  
2) For i = 0 to n-1                               ~T2 = n (multiplies T3 to T8)                     
3)    Let s = X[0]                                ~T3 = 1                     
4)    For j = 1 to i                              ~T4 = ? multiplies T5                     
5)       Let s = s + X[j]                         ~T5 = 2 reads and 1 set? Or 1 operation if using +=?                     
6)    End For                                     ~T6 = 0                   
7)   Let A[i] = s /(i+1)                          ~T7 = 1 set and 1 or 2 reads                     
8) End For                                        ~T8 = 0  
Output: An n-element array A of numbers such that A[i]
        is the average of elements X[0],X[1], … ,X[i]

我们非常感谢任何能够强化基本运算计数(带答案)的材料/资源/Q。

因此,解决此问题的最简单方法似乎是立即计算出每行的总数,而不是事后相乘。澄清如下:

  • T1设置任何大小的数组都是
    1
    操作
  • T2 For循环的设置范围为i:
    n
  • T3 1读取加1设定次数n,
    2n
  • T4使用第二个for循环的第一个for循环的逻辑,并朝一个小的n计数,而不是立即尝试乘法,我们会看到0(贴现,因为j=1到0的
    没有意义)+1+2+…+(n-1)。现在我们使用著名的求和公式Sx=x(x+1)/2,除了这里我们使用n-1所以Sn-1=(n-1)(n-1+1)/2=(n2-n)/2
  • T5是读取+读取+添加+设置,4次操作,是循环给出的立即
    的次数2(n2-n)
  • T6是0,因为它只是为循环标记
    的结束
  • T7可以猜测(不确定)为从左到右:set+read+divide+read+add,5次运算,乘以外部
    ,表示5n
  • T8见T6
因此,将Tn添加到1到n中,我们得到了不吸引人的结果:

T(n)=1+5.5n+2.5n2

O(n2)

TL;DR:单独计算每一行,使用前n个自然数之和公式,如果抽象起来太难,则使用小n


起初,这让我很困惑,因为我在处理T(n)的非整数系数,但结果总是整数:)

我会分别计算对数组的读/写操作、算术运算和for循环迭代次数

在内部循环(4-6)中,
i
读取,
i
+,
i

然后在外循环(2-8)中,
n
读取,
n
内循环(
i=0到n-1
),
n
+,
n
n
写入,
n
用于

总共,
(n+1)n/2
读取,
n
写入,
(n+1)n/2
+,
n
/,
(n+1)n/2

我将它们分开计算,因为它们的执行时间可能高度依赖于体系结构,也可能高度依赖于数据类型。其他操作,例如本地数据(保存在寄存器中)的移动,以某种方式被前者吸收


显然,对于较大的
n
(比如
>25
)来说,读取、累加和循环占主导地位。对于非常大的
n
,由于缓存效应,您可以预期读操作将占主导地位。

我理解这个特定的算法效率很低,因为我计算了它的主观运行时间,而不是另一个更高效的算法。这不是java,您只是在陈述一个教科书问题,没有证据表明已经对它进行了操作。此外,这是纯粹的理论:虽然在了解复杂性时指令计数很好,但它与给定机器上的实际性能几乎没有关系。你可能想把这个问题发布到CSTrimeStAcExchange。你可能认为是一个原始操作,在这种情况下是主观的(甚至比它是用java编写的),我在java中测试算法,因此我的错误…移除了标签。您可能认为每一行都是假设机器的原始操作。这样就可以计算执行的行数。例如,第2行可能被视为1+n操作或最多1+8*n操作。