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

Loops 在复杂性分析中,为什么是++;被认为是2个操作?,loops,complexity-theory,analysis,Loops,Complexity Theory,Analysis,在我的计算机科学II课上,教授认为++、-、*=等是两个运算。然而,在装配级别,这实际上不是两个操作。有人能解释一下吗?或者这只是为了简单起见?这不是一个加法加上一个setter吗 类似i+= 1?< p>我实际上认为它是3种操作:读取、增量(或任何)、写入。这是假设它从某种共享内存读入某种本地存储(例如寄存器或堆栈),在本地存储上操作,然后写回 它在汇编级别的操作数量将取决于所增加的内容、平台、硬件等。因为++(例如:b++)是 b = b + 1 这里有两个操作,加法(b+1),然后将加

在我的计算机科学II课上,教授认为++、-、*=等是两个运算。然而,在装配级别,这实际上不是两个操作。有人能解释一下吗?或者这只是为了简单起见?

这不是一个加法加上一个setter吗


类似i+= 1?

< p>我实际上认为它是3种操作:读取、增量(或任何)、写入。这是假设它从某种共享内存读入某种本地存储(例如寄存器或堆栈),在本地存储上操作,然后写回

它在汇编级别的操作数量将取决于所增加的内容、平台、硬件等。

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

b = b + 1 

这里有两个操作,加法(b+1),然后将加法的值赋给原始变量。

教授可能只是指必须取值,加1,然后再赋回变量。

我要做一些猜测

  • 你的教授指的是口译语言吗
  • ++我和我不一样也许他指的是那个
  • 也许他选择的汇编语言需要中间存储变量

    add reg_temp, reg_i, 1
    mov reg_i, reg_temp
    

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

ADD AX,1
然而,在编译语言中,所有的东西都必须存储起来,这样i++就变成了(在伪汇编中)


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

为什么要在进行复杂性分析时费事呢?它只是O(1):-)


编辑:请让我知道为什么当你投票否决它。由于问题被标记为复杂性,我认为大O概念是最重要的,而不是实际的常量。此外,正如其他答案中已经提到的,这是多少操作取决于很多因素:计算操作的方式、平台、编译器等。

你让我想起了一个我很久以前听到的“陪审团还没有出来”的问题

“预增量比后增量快”

我只是在谷歌上快速搜索了一下

  • 很多人仍然认为这是真的
  • 其他人则认为编译器是如此优化,相对高级的代码无法进行基准测试
  • 然而,他们坚持认为没有区别

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

    a=b++
    a=b相同;b=b+1

    a=++b
    b=b+1相同;a=b


    这足以让大多数一年级学生感到困惑。

    除非,也许,你正在增加cpu寄存器?我不确定,但那可能是一种机器语言操作。。。如果我记得的话,您可以在某些语言中指定声明的变量将只存储在寄存器中。因此,关于共享内存的假设,以及它取决于您递增的内容、平台、硬件等的声明(如果带有注释,则向下投票更有用)没有人会因为真理、正义和道路而对飞碟+1投反对票!与它输出多少装配操作相关吗?我认为大多数复杂度分析工具都会衡量代码在总体上的难易程度?如果编译器上基本数据类型的独立增量前或增量后存在差异,那么优化的最佳方法就是获得一个更好的编译器。在其他情况下,可能需要创建一个临时值来返回,这一点很重要。未优化,预增量比后增量快。然而,在许多常见情况下,这可以通过一个合适的编译器进行优化。即使在未优化的情况下,基本数字类型(与重载运算符++的用户定义类型相反)之间的差异也不大@David:获得一个更好的编译器很少是一个解决方案@泰勒:说得好。因此,pre vs post的总括语句是错误的,因为影响它的因素各不相同?但他的问题只是关于++类型的操作(因此它只是++b或b++而不是a=b++pr a=++b)。在这种情况下,上下文没有任何意义,因为b++和++b=(b=b+1)
    MOV AX,i
    ADD AX, 1
    MOV i, AX