我已经看到了复制描述为O(n)的字符串的操作,其中n是字符串的长度,因为我们假设我们需要遍历字符串的每个字符并单独复制它。但是,编译器是否无法生成可以在恒定时间内复制整个内存块的指令?这种能力是否存在于当今的通用架构中?
答案 0 :(得分:1)
如果使用复制任意大块数据的指令,那么该单指令必然会占用O( n )时间。
答案 1 :(得分:1)
有些CPU架构只有一条指令可以将一块内存从一个位置复制到另一个位置,但是这条指令需要很多周期,因此它仍然是O(n)。无论如何,CPU都必须通过地址总线读取每个字符,因此无法绕过O(n)。
答案 2 :(得分:1)
据我所知。
但是,要使O()表示法有意义,必须首先定义每个基本操作的成本。这经常被省略,因为“很明显”。而且大多数时候它确实如此。您的(假设的)情景是定义成本至关重要的一个很好的例子。
另一个稍微有用的例子是分析磁盘或磁带存储搜索/排序算法。
答案 3 :(得分:1)
我认为你的意思是恒定时间,或者小于线性,因为O(n)是线性的。
由于记忆的运作方式,这是不可能的。复制某些内容时,必须访问内存的每个单元格并将其复制到另一个单元格。有可能制造出几个并行的细胞,但不是可变数量的细胞。最后,必须使用电线复制每一位,并且您必须假设您的存储器大于连接系统的电线的数量。 它不一定需要消耗计算时间,因为你有像DMI这样的独立元素,可以节省处理器时间,让你可以并行计算其他东西。
P.S。你的问题混合了理论计算机科学,现实世界的技术和实现,所以很难回答问题的精神,但我试图解决你提出的问题。
答案 4 :(得分:0)
在.NET中,字符串是不可变的引用对象。它们在固定时间内被“复制”,因为只需要复制参考。