复杂性分析:如何识别"基本操作"?

时间:2017-09-12 05:19:25

标签: time-complexity complexity-theory

我正在上复杂性分析课​​程,我们尝试确定算法的基本操作。 我们将其定义如下:

  

基本操作是最能表现出效率的操作   特别感兴趣的算法

     

对于时间分析,我们期望获得最多的操作   影响算法的总运行时间:
   - 搜索算法中的关键比较
   - 矩阵乘法算法中的数值乘法
   - 在图遍历算法中访问节点(或弧)

     

对于空间分析,这是一项增加内存使用量的操作    - 向运行时堆栈添加新帧的过程调用
   - 在运行时堆中创建新对象或数据结构

基本操作可能出现在算法中的多个位置

所以我试图找出ReverseArray算法的基本操作。

ReverseArray(A[0..n-1])
for i=0 to [n/2]-1 do
   temp <- A[i]
   A[i] <- A[n-1-i]
   A[n-1-i] <- temp

我的导师提到基本操作是一种&#34;操作&#34;比如赋值,加法,除法,我可以在这个算法的情况下在赋值或减法之间进行选择。

现在我有一个练习询问给定算法的基本操作。那么说基本操作是&#34;赋值&#34;是否正确?然后在for循环中列出所有3行代码?

在我看来,它也可能是减法,因为它有4个。

我不确定基本操作是否是一个普遍认可的术语,或者它只是我讲师选择的表达方式。

1 个答案:

答案 0 :(得分:1)

您可以将任何操作(赋值,读取数组访问,减法)作为基本操作。所有这些都会导致相同的结果:

  1. 作业:3 * n / 2 - &gt;的 O(n)的
  2. 阅读权限:2 * n / 2 - &gt;的 O(n)的
  3. 完成for-block:n / 2 - &gt;的 O(n)的
  4. 在你的例子中没有任何区别。这是一个愚蠢的例子(没有优化的代码),它有所不同:

    for i = 1 to n do
        x = a[i]
        for j = 1 to n do
            b[j] += x
    

    显然,对数组a的读取访问需要 O(n)步骤,其中写入操作或添加的数量为 O(n ^ 2)

    基本操作是在计算复杂性的基础上进行的操作。这可能是代码中的每个操作,但这会导致不同的结果,如我在示例中所示。

    出于这个原因,人们常常看到如下词: 代码需要 O(n)乘法 O(n ^ 2)加法