我不明白如何计算算法中的原始操作。
交叉线是“2为写,4读,3运算符”
我的意思是,这里的幻灯片试图解释它,但我仍然没有得到他在结束时获得9n的方式。如果你能用白痴证明的方式向我解释这个可能吗?
答案 0 :(得分:1)
9被解释为4次读取(i
,a[i]
,x
,y
),3位运算符(+
,+
和+
)...但是2次写作没有任何意义。
如果我按照此粒度级别进行计数,则会进行五次读取(i
两次 - 一次在左侧查找a[i]
进行写入,一次查找a[i]
右侧阅读)和一个写(刚才提到的a[i]
)。我还要为两个[i]
添加两个索引操作(基本上是美化的加法操作)。
然后有一个循环,基本上是i = 1; while(i <= n) .... i = i + 1; end while
,所以这是循环前的一个赋值,一个比较和一个读取在循环的顶部和一个赋值,一个读取和一个添加在结尾循环(可能是一个额外的一个加载常量,但原始幻灯片忽略它们,这是一个有效的选择,我猜)。
“n用于创建数组”......我不相信它是如何工作的。取消数组确实对应于数组长度;但只是分配它实际上并不访问分配的内存。单个字节数组的空闲(或初始化)要比一个百万字节的数据要快得多,但前者的分配速度与后者一样快,只要有可用的存储器(和只要不需要执行清洁职责就可以这样做。 2*n
听起来像胡说八道。
然而,这些都不是真的有用。如果您正在测量算法的复杂性,那么您永远不会这样做 - 一个操作的复杂性与七个或一百万个相同。重要的是当一些外部参数(通常是数据大小,通常由n
表示)发生变化时,操作数量会增加。此代码段具有复杂性O(n)
,因为复杂性的增长速度与n
增长的速度相同。如果你有两个嵌套的循环,它被标记为O(n^2)
,这意味着复杂度缩放的速率是二次的:如果数据加倍,算法运行四倍或占用内存的四倍。无论循环的内容是一次操作还是百万次,或者它们需要一毫秒还是一小时,都不会影响算法的复杂性。幻灯片中用于计算时间复杂度的唯一重要事项是循环。
n
复杂性。但它通常是微不足道和可忽略的,因为我们通常使用固定精度的数字;这使得乘法成为可预测和固定的复杂性。如果你可以有任意精度的数字,一对两位数的数字比一对1000位的数字要少得多,如果你有这些,那么你需要考虑它。显然,如果你在循环中调用一个有循环的函数,它肯定会对复杂性产生影响。
这里的另一个问题是原始操作的定义是任意的。我之前已经暗示过:加载一个常量可能算作一个原始操作,但在这里它不是。如果是,x = 1
也将是两个操作,而不是幻灯片显示的操作。实际上,在8086汇编中,您必须编写mov ax, 1; mov offset x, ax
(将1
加载到寄存器中,将寄存器存储到内存中)(我可能搞砸了语法,已经有一段时间了)。但是,x = x + 1
经过优化后,只是许多微处理器中的一条指令。
但是,如果您尝试在Assembly或微指令中优化一些对时间要求严格的代码,则不能将所有操作集中在一起。每个操作都需要特定的长度,通常乘法将比添加更多。每个周期都很重要幸运的是,我们大多数人从不需要在这么低的水平上工作。
TL; DR:没有人计算伪代码中的操作。