在复杂性分析中,为什么 ++ 被认为是 2 个操作?
-
22-07-2019 - |
题
在我的计算机科学 II 课上,教授考虑了 ++、--、*= 等。为2次操作。然而,在程序集级别,这实际上并不是两个操作。有人可以解释一下还是这只是为了简单起见?
解决方案
其实我认为这是3个操作:阅读,增量(或其他),写。这是假设它是从某种共享存储器的读入某种本地存储(例如寄存器或堆栈),在本地存储工作,则写回。
有多少业务是在装配水平将取决于你什么增加,平台,硬件等。
其他提示
由于++(例如:乙++)是的简化
b = b + 1
有两个操作那里,除了(B + 1),然后将除了原有的变量的值的分配。
为什么这样做的复杂性分析时,烦恼呢?它仅仅是O(1): - )
编辑:请让我知道,当你将其否决原因。由于这个问题被标记的复杂的,我认为大O字的概念是最重要的,而不是实际的常量。此外,由于已经在其他的答案中提到,有多少业务,这是取决于很多的因素:你算操作,平台,编译器等方式
我将提出一些猜测。
- 您的教授指的是解释语言吗?
- ++i 与 i++ 不同,也许他指的是那个?
也许他选择的汇编语言需要中间存储变量?
add reg_temp, reg_i, 1 mov reg_i, reg_temp
是不是加成加一个setter?
类似于I + = 1?
在教授可能是单指具有取的值,把它加1,然后分配回该变量。
在组件级别一切都在这样具有一个可变的寄存器来实现
ADD AX,1
然而,在编译语言一切必须被存储,所以我++变为(在伪组件)
MOV AX,i
ADD AX, 1
MOV i, AX
这是三个操作......除非我已经忘记了我的基本架构完全...
你让我想起了一个“陪审团尚未出炉“我很久以前就听说过的问题。
“预增量比后增量快”
我刚刚做了一个快速的谷歌搜索。
- 许多人仍然认为这是事实。
- 其他人则认为编译器经过如此优化,无法对比较高级的代码进行基准测试。
- 然而 其他人 认为没有区别。
应该在我看来超过2因为它取决于具体的环境两层方面的含义,我总是提醒他们自己,当我看到它。
a = b++
相同a = b; b = b + 1
和
a = ++b
相同b = b + 1; a = b
这是一个足以混淆发送大多数一年级学生下悬崖的。
不隶属于 StackOverflow