我只是想知道printf()
功能的实际运行时间。无论是O(n)还是Ω(n),我可以在什么基础上决定printf
函数的运行时间?
就像它只是在屏幕上打印一行一样,它可以是O(1),因为它只需要特定数量的CPU周期来运行,但如果printf
用于未预定义的循环中,该怎么办?关于调用printf()
函数的次数,那么呢?它会是O(n)还是什么?
答案 0 :(得分:1)
print
所用的时间总是与要打印的字符数成正比,因此它是Θ(N)(因此是O(N)和Ω(N)),其中N是数字要打印的字符。
但它的N是不是字符的数量?
在评估对字符串列表进行操作的算法(例如排序算法)时,研究字符串长度增长时会发生什么通常是无趣的,因为它会对所有算法产生相同的影响。我们更感兴趣的是研究列表大小增长时会发生什么。为此,我们假设在这些情况下字符串的长度是恒定的。
例如,排序算法可能需要O((N log N)* M)其中N是元素的数量,M是字符串的长度。如果我们认为字符串的长度是常数,那么变为O(N log N),print
从Θ(M)变为Θ(1)。
答案 1 :(得分:0)
C标准没有说明printf
的运行时间;它只指定其行为。不同的实现可能比其他实现更高效或更低效。
您询问的是O(n)或Ω(n),而不是绝对运行时间。我想不出为什么printf
不应该是O(n)的原因,其中n是它打印的字符数。 (我不记得O(n)和Ω(n)之间的区别;从大学开始已经有一段时间了。)
虽然我想你可以用一个很长的%n
说明符序列构造一个格式字符串,这可能需要花费时间与格式字符串的长度成比例而不产生输出。因此,在最一般的情况下,我认为它是O(m + n),其中m是格式字符串的长度,n是打印的字符数。
printf
的实现将遍历格式字符串和其他参数,生成输出字符。我认为没有任何可能的复杂性超过O(n)的情况。
如果您在程序中循环调用printf
,则不再询问printf
的运行时间,而是询问 算法的运行时间这恰好叫printf
。没有更多信息,这是不可能回答的。