在算术运算中,加法和减法运算的复杂度较低,而除法的复杂度较高。对于< =和> =操作,所有关系操作是否具有相同的复杂性或不同。
答案 0 :(得分:3)
对于< =和> =操作,所有关系操作是否具有相同的复杂性或不同。
这些(对于内置的整数和浮点类型)的性能不是由C ++语言标准决定的,而是由特定编译器实现发出的CPU指令决定的,当然这受到CPU提供的限制。您可以研究您感兴趣的编译器(例如g++ -S program.cc
将使用汇编生成program.s
),然后研究您感兴趣的CPU模型和他们的表现。对于x86系列处理器,您可以轻松地在线找到指令时序列表(例如here),并且 - 与大多数CPU一样 - 所有比较操作都需要一个CPU周期< / EM> 即可。某些更复杂的指令(如条件移动或跳转)可能会在某些CPU模型上支持更有限的条件,但这对您来说不太可能是一个实际问题。
答案 1 :(得分:2)
计算复杂性至少在两个背景下讨论,理论和实践。
在理论上下文中,程序的输入是 n 位的字符串,我们研究理论计算机必须花多长时间才能产生作为 n <的函数的答案/ em>的。在这样的计算机中,比较两个二进制数字所花费的时间是O( n ),因为在找到差异之前,您可能必须比较两个数字的每个位直到结束。无论操作是否小于,小于或等于,大于,大于或等于,等于或不等于,都是如此。只要找到两个数字之间不同的最重要位,就可以立即确定任何这些顺序关系。它找到了最重要的位(或确定所有位是相同的),它占用了不同的时间,即O( n )。
在实际环境中,计算机具有固定大小的单词,并且我们关注实际程序所花费的时间,因为它们保持在那些固定大小的单词的范围内。在通用的当前通用处理器中,比较两个标量数(一个字或更少的数字表示的数字,例如64位整数或更窄或64位浮点值)通常具有固定的延迟,通常是单个CPU周期,有时几个周期。实际上,复杂性是O(1)。有时,对于正常情况,延迟可能是固定的,但对于诸如次正规或NaN的特殊情况则需要更长的时间。对于正在评估的关系,延迟通常没有差异。实际上,许多处理器具有返回所有排序信息的单个通用比较指令,并且第二信息用于基于订单是否小于,大于,等于或无序(NaN未被排序)来分支。
如果编译器或库实现任意大小的数字,例如多精度浮点数或大整数,那么它的行为将更像理论问题:具有更多数字的数字将需要更长的时间来进行比较。在数字的正常表示中,所有比较都将具有相同的复杂性。但是,有一些特殊的表示形式,比较可能会有所不同。例如,我们可以通过以模数选择的除数存储其余数来表示整数,而不是存储表示特定量值的位。很容易比较两个这样的整数是否相等(它们的所有残基是否相同?),但是对于顺序进行比较可能很困难(哪个更大是残差的复杂函数)。