C语言中主要指令的时间复杂性

时间:2019-06-17 16:24:33

标签: c time-complexity

我对算法复杂性有疑问。

C中的基本指令是否具有等效的复杂性,如果不相同,它们的顺序是: 如果,则写入/读取矩阵的单个单元格a + b,a * b,a = b ...

谢谢

2 个答案:

答案 0 :(得分:3)

不。 C中的基本指令不能以任何种类的时间或理论复杂性来排序。该标准未指定,可能无法指定。相反,这些属性来自代码,操作系统和底层体系结构的交互。

我认为您正在寻找有关cycles per instruction的信息。

但是,即使这还不是全部。现代CPU具有分层缓存。如果您的算法对主要在快速缓存中的数据进行运算,则它的运行速度将比程序对要从RAM,硬盘驱动器或通过网络重复访问的数据进行运算的程序快得多。 。每个负载完成的计算量是应用程序的算术强度Roofline models提供了用于思考这一问题的工具。尽管blocking and other techniques的子字段对此进行了深入探讨,但您可以通过communication avoiding algorithms获得更好的缓存利用率。

最终,C语言是处理器实际作用的高级抽象。在标准成本模型中,我们将所有指令视为花费相同的时间。在更准确但可能更难使用的缓存感知成本模型中,数据移动被视为更昂贵。

答案 1 :(得分:3)

执行“基本”代码行(如加法,乘法,除法等)所需的时间不是

即使这些表达式的执行时间不同,它们的复杂度均为O(1)。

复杂度是指一些可变图形发生变化时发生的情况。这个可变的数字可以有很多不同的东西。一些示例可能是“数组中的元素数”,“链表中的元素数”,“文件的大小”,“矩阵的大小”。

例如-如果编写的代码必须在整数数组中找到最大值,则执行时间取决于数组中元素的数量。该代码将必须访问每个数组元素,以检查它是否大于先前的元素。因此,复杂度为O(N),其中N是元素数。因此,我们不能说找到最大的元素需要多少时间,但是可以说,在1000个元素的数组上执行比在100个元素的数组上花费的时间长10倍。

现在,如果您对链接列表执行相同操作(即找到最大的元素),那么复杂度将再次为O(N)。但是,这并非表示链接列表的性能与数组相同。它只是说它的缩放方式与数组相同。

一种简化的表达方式-如果不涉及循环,则复杂度始终是  O(1)。