我正在上复杂性分析课程,我们尝试确定算法的基本操作。 我们将其定义如下:
基本操作是最能表现出效率的操作 特别感兴趣的算法
对于时间分析,我们期望获得最多的操作 影响算法的总运行时间:
- 搜索算法中的关键比较
- 矩阵乘法算法中的数值乘法
- 在图遍历算法中访问节点(或弧)对于空间分析,这是一项增加内存使用量的操作 - 向运行时堆栈添加新帧的过程调用
- 在运行时堆中创建新对象或数据结构
基本操作可能出现在算法中的多个位置
所以我试图找出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个。
我不确定基本操作是否是一个普遍认可的术语,或者它只是我讲师选择的表达方式。
答案 0 :(得分:1)
您可以将任何操作(赋值,读取数组访问,减法)作为基本操作。所有这些都会导致相同的结果:
在你的例子中没有任何区别。这是一个愚蠢的例子(没有优化的代码),它有所不同:
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)加法。