Algorithm 在固定时间内复制字符串?

Algorithm 在固定时间内复制字符串?,algorithm,architecture,big-o,Algorithm,Architecture,Big O,我已经看到了复制一个被描述为O(n)的字符串的操作,其中n是字符串的长度,因为假设我们需要遍历字符串的每个字符并分别复制它。然而,编译器不可能生成可以在恒定时间内复制整个内存块的指令吗?这种功能是否存在于当今的通用体系结构中 如果使用一条复制任意大数据块的指令,则该条指令本身将占用O(n)个时间。如果使用一条复制任意大数据块的指令,则该条指令将占用O(n)时间本身。一些CPU体系结构使用一条指令将内存块从一个位置复制到另一个位置,但这条指令需要许多周期,因此仍然是O(n)。不管怎样,CPU都必须

我已经看到了复制一个被描述为O(n)的字符串的操作,其中n是字符串的长度,因为假设我们需要遍历字符串的每个字符并分别复制它。然而,编译器不可能生成可以在恒定时间内复制整个内存块的指令吗?这种功能是否存在于当今的通用体系结构中

如果使用一条复制任意大数据块的指令,则该条指令本身将占用O(n)个时间。

如果使用一条复制任意大数据块的指令,则该条指令将占用O(n)时间本身。

一些CPU体系结构使用一条指令将内存块从一个位置复制到另一个位置,但这条指令需要许多周期,因此仍然是O(n)。不管怎样,CPU都必须通过地址总线读取每个字符,因此无法绕过O(n)。

一些CPU体系结构使用一条指令将内存块从一个位置复制到另一个位置,但这条指令花费了许多周期,因此仍然是O(n)。不管怎样,CPU都必须通过地址总线读取每个字符,因此无法绕过O(n)。

据我所知不是这样

然而,要使O()符号有意义,必须首先定义每个基本操作的成本。这一点经常被忽略,因为“很明显”。大多数时候确实如此。您的(假设的)场景是定义成本至关重要的情况的一个很好的例子

另一个稍微有用的例子是分析磁盘或磁带存储搜索/排序算法。

据我所知不是这样

然而,要使O()符号有意义,必须首先定义每个基本操作的成本。这一点经常被忽略,因为“很明显”。大多数时候确实如此。您的(假设的)场景是定义成本至关重要的情况的一个很好的例子

另一个稍微有用的例子是分析磁盘或磁带存储搜索/排序算法

  • 我想你指的是常数时间,或者小于线性,因为O(n)是线性的

  • 这是不可能的,因为记忆是如何工作的。当你复制某些东西时,你必须访问内存中的每个单元,并将其复制到不同的单元。有可能制造出几个平行的细胞,但不是数量可变的细胞。最后,必须使用电线复制每个位,并且必须假设内存大于连接系统的电线数量。 它不一定要消耗计算时间,因为您有像DMI这样的独立元素,可以释放处理器时间,并允许您并行计算其他内容

  • 另外,你的问题混合了理论计算机科学、现实世界的技术和实现,因此很难按照问题的精神来回答,但我已经尝试解决你提出的问题

  • 我想你指的是常数时间,或者小于线性,因为O(n)是线性的

  • 这是不可能的,因为记忆是如何工作的。当你复制某些东西时,你必须访问内存中的每个单元,并将其复制到不同的单元。有可能制造出几个平行的细胞,但不是数量可变的细胞。最后,必须使用电线复制每个位,并且必须假设内存大于连接系统的电线数量。 它不一定要消耗计算时间,因为您有像DMI这样的独立元素,可以释放处理器时间,并允许您并行计算其他内容


  • 另外,您的问题将理论计算机科学与现实世界的技术和实现相结合,因此很难按照问题的精神来回答,但我已尝试解决您提出的问题。

    在.NET中,字符串是不可变的引用对象。它们是以固定时间“复制”的,因为只需要复制引用。

    在.NET中,字符串是不可变的引用对象。它们是以恒定时间“复制”的,因为只需要复制引用。

    在你倒数第二句话中,你的意思是“恒定”而不是“线性”,对吗?是的,我在这里指的是“恒定”。修正了。在你倒数第二句话中,你的意思是“常数”而不是“线性”,对吗?是的,我的意思是“常数”。在.NET中它是字符串复制。这是否真的是复制当然可以争论。我只是想给她一个不同的视角。如果某些系统将字符串表示为不可变的引用类型,则可以在恒定时间内“复制”它们。:)另一方面,更改字符串的第一个字母(c中的O(1)操作)是O(n),因为必须创建其余数据的副本。为了两全其美,请使用“写时复制”。@dmckee:是的,代价必须在某处支付。在.NET中,这是字符串复制。这是否真的是复制当然可以争论。我只是想给她一个不同的视角。如果某些系统将字符串表示为不可变的引用类型,则可以在恒定时间内“复制”它们。:)另一方面,更改字符串的第一个字母(c中的O(1)操作)是O(n),因为必须创建其余数据的副本。为了两全其美,请使用“写时拷贝”。@dmckee:是的,必须在某个地方付出代价。这取决于它在硬件中的实现方式。例如,64位计算机有足够的硬件,可以并行地一次复制8字节的“字符串”,如果您使用特殊的SIMD指令,并且只是将寄存器复制到寄存器,则会更多。想象指令和内存体系结构并不像复制更大的块那样牵强,特别是在图形处理器中。我们必须对每18个月安装在芯片上的额外晶体管做些什么