在复杂性分析中,为什么++被认为是2个操作?

时间:2009-01-14 15:46:55

标签: loops complexity-theory analysis

在我的计算机科学II课程中,教授认为++, - ,* =等是2个操作。但是,在大会一级,这实际上不是两个行动。有人可以解释或仅仅是为了简单起见吗?

9 个答案:

答案 0 :(得分:9)

我实际上认为它是3个操作:读取,增量(或其他),写入。这是假设它从某种共享内存读取到某种本地存储(例如寄存器或堆栈),在本地存储上运行,然后写回。

装配级别的操作数量取决于您的增量,平台,硬件等。

答案 1 :(得分:8)

因为++(例如:b ++)是

的简化
b = b + 1 

那里有两个操作,即加法(b + 1),然后分配原始变量的加法值。

答案 2 :(得分:2)

为什么在进行复杂性分析时会烦恼?它只是O(1): - )

编辑:请在投票时告诉我原因。由于问题被标记为复杂性,我认为大O概念是最重要的,而不是实际的常量。此外,正如其他答案中已经提到的,这取决于许多因素:计算操作,平台,编译器等的方式。

答案 3 :(得分:1)

我要猜一猜。

  • 你的教授是指解释语言吗?
  • ++我与i ++不同,也许他指的是那个?
  • 也许他的装配选择需要中间存储变量?

    add reg_temp, reg_i, 1
    mov reg_i, reg_temp
    

答案 4 :(得分:0)

这不是一个加法加一个二传手吗?

与i + = 1相似?

答案 5 :(得分:0)

教授可能只是指必须取值,加1,然后将其分配回变量。

答案 6 :(得分:0)

在汇编级别,所有操作都在寄存器中完成,因此在A

中有一个变量
ADD AX,1

但是,在编译语言中,必须存储所有内容,以便i ++变为(在伪装配中)

MOV AX,i
ADD AX, 1
MOV i, AX

这是三个操作......除非我完全忘记了我的基本架构......

答案 7 :(得分:0)

你提醒我一个很久以前听过的有点“陪审团没有出去”的问题。

  

“预增量比后增量快”

我刚刚进行了快速谷歌搜索。

  1. 很多人仍然认为这是真的。
  2. 其他人认为编译器是如此优化,不能对比较高级别的代码进行基准测试。
  3. 然而other people认为没有区别。

答案 8 :(得分:0)

在我看来它应该超过2,因为它有两个含义取决于上下文,当我看到它时我总是要提醒自己。

a = b++a = b; b = b + 1

相同

a = ++bb = b + 1; a = b

相同

这足以让大多数一年级学生离开悬崖。