字符数组初始化的时间复杂度是多少?

时间:2011-12-30 06:59:33

标签: c time-complexity

通常阅读的内容我都记得这个问题。 如果我有一个如下所示的字符数组初始化,那么这个语句的时间复杂度是多少?

char array[] = {'a','b','c','d','e'};

它实际上会执行5次分配每个变量吗?就像我们在循环中一样。如果假设是真的,为什么会这样呢?

4 个答案:

答案 0 :(得分:3)

取决于声明发生的位置和编译器的智能,它可以是O(1)或O(n)。有些情况:

  1. 全局声明,智能编译器会把它放在数据部分,已经初始化,因此O(1)
  2. 本地声明,如果被证明只能由智能编译器读取,它可能就像上面一样,加上对数组的引用赋值,但仍然是O(1)
  3. 本地声明,读写,可以是存储分配+5分配(显然O(n)OR存储分配+数组数据复制(如2,但数据被复制而不是仅仅参考)。后者可能是O (1)带有矢量化代码(好吧......或多或少,因为它取决于很多东西)

答案 1 :(得分:1)

是O(N)。它可能是一个快速或有效的O(N)。如果它是一个静态分配的数组,初始化只会执行一次。

但无论如何,这是O(N)。

请注意,即使它是一个放在程序二进制映像中的数组(因为编译器确定数组永远不会被修改),它仍然是一个O(N)操作来初始化它,即使初始化可能发生在程序事件到达main()之前或作为程序图像加载的一部分完成。

它是O(N),因为无论初始化必须写入数组的每个位置,所以一个100倍于另一个的数组将执行大约100倍的操作来完成初始化。

答案 2 :(得分:0)

正如其他人所说,它可以在O(n)时间内完成。

但它永远不会是O(1)!! 如何在更短的时间内写入n个内存位置(我们拥有的任何类型的内存)? O(1)表示操作不依赖于输入的大小。我不想把图灵机带到讨论中,但是在运行期间的某个地方总会有上述语句的O(n)操作。

答案 3 :(得分:0)

时间复杂度将简单为0.不是O或o(n)。 在程序运行之前,将使用起始值设置数组的位置。地点和数值将在编制阶段准备,并在链接阶段设置。

没有用于实现所述线路的命令。没有时间。