C++ printf的渐近复杂性

C++ printf的渐近复杂性,c++,c,printf,big-o,asymptotic-complexity,C++,C,Printf,Big O,Asymptotic Complexity,假设我正在打印一个字符串,如下所示: printf("%s", s); 我们可以假设这个函数的渐近复杂性是什么 是O(n)吗,其中n是strlen(s)-是长度?或者是O(1),恒定时间。还是别的什么?不过,我想您需要知道printf是如何实现的。任何洞察都将不胜感激 (我应该澄清我是在谈论C而不是C++),但我怀疑它们的实现方式不同) 编辑:将格式化字符串添加到printf()它的复杂性是O(m+n),其中m是输入的大小,n是输出的大小 如果不传递额外的参数,比如在你的例子中,时间复杂度是O

假设我正在打印一个字符串,如下所示:

printf("%s", s);
我们可以假设这个函数的渐近复杂性是什么

是O(n)吗,其中n是strlen(s)-是长度?或者是O(1),恒定时间。还是别的什么?不过,我想您需要知道printf是如何实现的。任何洞察都将不胜感激

(我应该澄清我是在谈论C而不是C++),但我怀疑它们的实现方式不同)

编辑:将格式化字符串添加到printf()

它的复杂性是O(m+n),其中m是输入的大小,n是输出的大小

如果不传递额外的参数,比如在你的例子中,时间复杂度是O(2*m)=O(m)


但是请注意,您的代码可能会失败,因为s本身可能包含格式化代码,这将产生未定义/未知/不可预测/可能非常糟糕的结果,正如Adriano所指出的。

正确的语法是
printf(“%s”,stringName)。有什么好的理由吗?毕竟,s已经是一个字符串,那么为什么它需要用printf格式化呢?@Miguel yes,因为它本身可能包含格式化代码,这将产生一个未定义/未知/不可预测/可能非常糟糕的结果。
s=“%d”;printf(s);将导致爆炸。复杂性显然是O(n)。正如@DmitryGalchinsky所说,复杂性将是O(n),因为它必须将每个字母打印到屏幕上,因为它必须进入它的内存位置,因此,它将是O(strlen(s))。所以你是说它在格式化每个字符时迭代一次,然后在输出时迭代一次?难道它不能将内存转储到输出流中,或者这是O(m)吗?我一直认为,
printf
只需按原样输出结果,当它遇到
%d
%s
时,它会取适当的参数并将其打印出来,因此,它的复杂性在第一个参数中是线性的。@Sukritkalla但打印出字符串不是O(1)。我的意思是在第一个参数的长度中是线性的。因此,O(n)@sukritkalla我不确定我是否理解您:整个函数的复杂性不仅取决于格式字符串,还取决于必须打印的其他参数的长度,这些参数是任意的,与格式字符串完全无关;可能会有很多争论。