在学习数组操作时,我发现插入和删除很麻烦,需要将元素一一移位。我们是否可以设计一条专门的汇编指令,将一块内存在两个指定地址之间移动一定数量的位置(如果参数太多,则将地址和位置数量存储在专用寄存器中)?执行该指令后,CPU 将通知独立的内存移位硬件,然后该硬件可以快速完成内存移位。这种方法是否可以将数组插入和删除的复杂度降低到 O(1)?
我询问了一些AI但没有得到满意的答案
执行大量工作的指令(例如 x86
rep movsb
是 memmove)不会减少所需的缓存/内存带宽量。 使用专用状态机1,允许无序执行远远超过它(与实际的 Intel / AMD CPU 不同,它是微编码的,接管前端),是的,如果周围的代码,它可能会带来加速否则不会成为内存访问的瓶颈。
但是你不能说它的成本是 O(1) 时间;只有当您执行的频率足够低,以便无序执行程序与主要瓶颈并行执行时,这才是正确的。
大O复杂度模型并没有真正考虑指令级并行的可能性。 您只需计算操作并假设成本以某种方式增加。 但由于您忽略了恒定因素,这可能仍然有效。 如果副本数量是算法中比其他任何东西都大的复杂度类别,那么当
n
接近无穷大时,副本与其他工作的比率也将趋于无穷大,因此即使副本大小为小且固定。
或者,如果总副本大小除副本数量之和是一个更大的复杂性类别,那么您将再次比任何其他类型的工作拥有更多的复制工作,因此它将无法“隐藏”在其他操作。
但是,如果复制总量是比其他瓶颈更小的复杂性类别,那么由于
n
趋于无穷大,它将变得可以忽略不计。 如果您有 n^2 + n
副本和 n^2
其他工作,并行性可能会在 n
与 n^2
时间之间产生差异,但这些都属于 O(n^2)
复杂性类别,因为随着 n
的接近,较小的指数变得微不足道无穷大。
脚注 1:Andy Glew,英特尔 P6 微架构中的快速字符串微码架构师,后来后悔没有构建专用硬件来处理它。 (在 Pentium Pro 之前,第一个 P6 CPU,
rep
字符串操作一次只处理一个单元,就像实际上重复 movsd
一样,所以速度相当慢。如此快速的字符串微码,每 1 或 2 复制 8 个字节时钟周期(如果它命中缓存)仍然是一个很大的改进。)