通常阅读一些内容时,我想到了这个问题。如果我有一个像下面这样的字符数组初始化,那么这个语句的时间复杂度是多少?
char array[] = {'a','b','c','d','e'};
它是否真的会执行5次以赋值每个变量,就像我们在循环中做的一样。如果这个假设是正确的,为什么会这样呢?
char array[] = {'a','b','c','d','e'};
它是否真的会执行5次以赋值每个变量,就像我们在循环中做的一样。如果这个假设是正确的,为什么会这样呢?
const
限定的复合字面量。 - Jens Gustedtconst
,可能是必要的。但是一个真正聪明的编译器可以将其视为已声明为 const
,无论是否声明为 const
。 - LeleDumboconst
,对于两个不同的对象,使用 ==
测试它们的地址必须返回 false
。相应于两个不同递归调用的同一变量的两个实例满足该要求。 - Jens Gustedt这是O(N)的。它可能是快速或高效的O(N)。如果它是静态分配的数组,则初始化只会执行一次。
但无论如何,它都是O(N)。
请注意,即使它是一个放置在程序的二进制映像中的数组(因为编译器确定该数组永远不会被修改),初始化它仍然是一个O(N)操作,即使初始化可能发生在程序事件到达main()
之前或作为程序图像加载的一部分完成。
它是O(N),因为执行初始化的任何内容都必须写入数组的每个位置,因此长度比另一个数组长100倍的数组将有大约100倍的操作来完成初始化。
O(M)
,其中M
是数组各个位置的访问次数。因此,在大O符号表示法方面,根本没有开销。不过,大O符号中隐藏的常数是页面大小。 - Jens Gustedt正如其他人所说,它可以在O(n)时间内完成。
但它永远不可能是O(1)! 你怎么能在更短的时间内写入n个内存位置(无论我们有什么类型的内存)? O(1)意味着操作不取决于输入的大小。我不想把图灵机带到讨论中,但在运行时期间,上述语句总会有一个O(n)操作。
M
。请参见我对 Micheal Burr 回答的评论。 - Jens Gustedt时间复杂度将简单地为0,而不是O或o(n)。 数组的位置将在程序运行之前设置为起始值。位置和值将在编译阶段准备好,并在链接阶段设置。
没有任何命令来实现所提到的行。也没有时间花费。
O(n)
。如果决定进行矢量化,可能还可以更少。 - Mysticialarray
指向它。没有任何初始化或循环。 - Some programmer dudearray
在栈上,就需要在本地初始化。但标准中没有规定编译器应该如何处理,所以这个问题实际上无法回答——请检查编译器的输出。GCC 在此处执行 5 字节移动。 - Mat