【问题标题】:In Complexity Analysis why is ++ considered to be 2 operations?在复杂性分析中,为什么 ++ 被认为是 2 个操作?
【发布时间】:2024-01-19 10:54:01
【问题描述】:

在我的计算机科学 II 课上,教授认为 ++、--、*= 等是 2 个操作。但是,在组装级别,这并不是真正的两个操作。有人可以解释一下还是只是为了简单起见?

【问题讨论】:

    标签: loops complexity-theory analysis


    【解决方案1】:

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

    在装配级别有多少操作取决于您要增加的内容、平台、硬件等。

    【讨论】:

    • 除非,也许,你正在增加一个 cpu 寄存器?我不确定,但这可能是一种机器语言操作...如果我记得的话,您可以在某些语言中指定声明的变量将仅存储在寄存器中。
    • 因此假设共享内存,并且声明它取决于您要增加的内容、平台、硬件等。
    • (如果与 cmets 一起出现,投反对票会更有用,伙计们......)
    • 没有人反对 Skeet +1 的真相正义和 * 方式!
    • 输出多少组装操作是否相关?我认为大多数复杂性分析工具通常会衡量代码的难易程度?
    【解决方案2】:

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

    的简化
    b = b + 1 
    

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

    【讨论】:

      【解决方案3】:

      在进行复杂性分析时为什么要麻烦?这只是 O(1) :-)

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

      【讨论】:

        【解决方案4】:

        我会猜测一些。

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

          add reg_temp, reg_i, 1
          mov reg_i, reg_temp
          

        【讨论】:

          【解决方案5】:

          不是加法加setter吗?

          类似于 i+=1?

          【讨论】:

            【解决方案6】:

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

            【讨论】:

              【解决方案7】:

              在汇编级别,一切都在寄存器中完成,因此在 A 中有一个变量

              ADD AX,1
              

              但是,在编译语言中,所有内容都必须存储,因此 i++ 变为(在伪汇编中)

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

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

              【讨论】:

                【解决方案8】:

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

                “前增量比后增量快”

                我刚刚做了一个快速的谷歌搜索。

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

                【讨论】:

                • 如果您的编译器上的基本数据类型的独立前增量或后增量之间存在差异,那么您可以为优化做的最好的事情就是获得更好的编译器。在其他情况下,您可能需要创建一个临时值来返回,这很重要。
                • 未优化,前置增量比后置增量快。然而,在许多常见情况下,这可以通过一个体面的编译器进行优化。即使未优化,基本数值类型的差异也可能不显着(与重载 operator++ 的用户定义类型相反)
                • @David:获得更好的编译器几乎不是解决方案。 @Tyle:好点。那么由于影响因素的差异,pre vs post 的一揽子陈述是错误的?
                【解决方案9】:

                在我看来应该不止2个,因为它根据上下文有两种含义,而且我看到它时总是要提醒自己。

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

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

                这足以让大多数一年级学生陷入困境。

                【讨论】:

                • 但他的问题只是关于 ++ 类型操作(所以它只是 ++b 或 b++ 而不是 a=b++ pr a=++b)。在这种情况下,上下文没有意义,因为 b++ 和 ++b = (b=b+1)
                最近更新 更多