a<=b
的性能也类似于a<b
或两倍。
请考虑以下三种情况:
for (int i =0; i <= 10; i++) {
// Some operations here
}
for (int i =0; (i < 10) OR (i == 10); i++) {
// Some operations here
}
for (int i =0; i <10; i++) {
// Some operations here
}
您如何比较这三个?
答案 0 :(得分:4)
这取决于编程语言,硬件和编译器,但是,如果您要使用无法优化此语句的通用x86 CPU和编译器上的C ++,则区别在于可轻松生成代码。
在汇编程序级别,比较是通过进一步的标志检查来进行的。 a <= b
可能会变成这样:
cmp eax, ebx
jle a_le_b
为了简化示例,我们假设变量已经在寄存器中。你看,我们只需要2条指令。
(a<b) | (a==b)
的字面意思是:
cmp eax, ebx
jl a_le_b
cmp eax, ebx
je a_le_b
同样,在这里我没有进行任何优化就将C ++转换为汇编程序,只是“按原样”进行。如果编译器启用了优化功能,则很可能会为两个语句生成相同的代码。
现在,在C ++中,运算符可能会过载。这意味着<=
(理论上)可以执行与<
和=
不同成本的完全不同的操作。但是,实际上,通常<=
的实现方式与对<
的调用,随后对==
的调用完全相同,反之亦然。
结论:实际上,对于在常见处理器类型和调用比较运算符的语义正确类上的优化编译器,您不会有任何可观察到的差异。但是,这两个语句的语义并不完全相同,因此从理论上讲,a <= b
可能会与a < b | a == b
给出不同的结果。
答案 1 :(得分:4)
从字面上回答您的问题,答案都是O(1)
。
但是,假设您对执行时间更感兴趣,答案取决于代码是否被编译。任何现代的编译器都会将它们优化为相同的代码。解释程序将花两次时间检查相等性和大于情况,因为第一个测试将失败,并且需要测试第二个。
答案 2 :(得分:1)
复杂度通常用big-O表示法表示。即使第二种情况是O(2)
(编译器可能会不同意),但复杂度仍然是相同的,因为O(2)
与O(1)
完全相同。
答案 3 :(得分:1)
无论是复杂度无关的一个,是否花费两倍之多,它们都具有恒定的复杂度,因为与a
或b
的值无关,它们都执行固定数量的操作。
如果您担心性能,请注意,编译器知道哪些表达式是等效的,并且选择人类最便宜的表达式可能比人类更好。
答案 4 :(得分:1)
“
a<=b
”和“(a<b) OR (a==b)
”之间的时间复杂度有何不同?
复杂度分析适用于算法。关系比较不是算法,因此无法分析其复杂性。我们只能分析用于实现这种比较的算法。可以使用哪种算法取决于要比较的类型。答案还取决于我们是考虑最坏情况,最好情况还是平均情况。
<=
可以通常实施为(a<b) OR (a==b)
。在这种情况下,<=
的复杂度不会比(a<b) OR (a==b)
的复杂性差,除非它不是以最佳方式实现的。 <=
的复杂度通常与a<b
或a==b
的较差复杂度相同。最常见的是,这三个都具有相同的渐进复杂度。但这取决于所比较对象的类型。
int i =0; (i < 10) OR (i == 10) int i =0; i <= 10
这些比较的渐近复杂度完全相同:它是恒定的。实际上,int
的大小对于任何系统都是恒定的,因此没有可以增长的输入,因此渐近分析将毫无意义。