Arrays 打印数组真的是O(n)而不是O(1)吗?

Arrays 打印数组真的是O(n)而不是O(1)吗?,arrays,time-complexity,Arrays,Time Complexity,根据破解编码面试中的这个问题,打印数组是O(N),但我不明白为什么它不是O(1)。我们有以下代码: void permutation(String str) { permutation(str, ""); } void permutation(String str, String prefix) { if (str.length() == 0) { System.out.println(prefix); } else { for (int

根据破解编码面试中的这个问题,打印数组是O(N),但我不明白为什么它不是O(1)。我们有以下代码:

void permutation(String str) {
    permutation(str, "");
}

void permutation(String str, String prefix) {
    if (str.length() == 0) {
        System.out.println(prefix);
    } else {
        for (int i= 0; i < str.length(); i++) {
            String rem = str.substring(0, i) + str.substring(i + 1);
            permutation(rem, prefix + str.charAt(i));
        }
    }
}
为什么会这样?据我所知,印刷总是O(1)。当您打印一个数组时,它会一次完成所有操作,除非您使用for循环打印每个单独的字符


我遗漏了什么吗?

大O符号没有明确说明它测量的是什么。您可以讨论占用O(n)内存或O(n)系统调用的算法。但是这里的解释清楚地表明,我们在谈论O(n)时间。这是正确的-O(1)系统调用打印O(n)个字符需要O(n)个时间。

大O符号没有明确说明它测量的是什么。您可以讨论占用O(n)内存或O(n)系统调用的算法。但是这里的解释清楚地表明,我们在谈论O(n)时间。这是正确的-打印O(n)个字符的O(1)系统调用将花费O(n)个时间。

非常正确+1。。。也许可以为topicstarter提供更多的研究信息?->Java的
System.out.println
很可能直接映射到Java虚拟机中的C/C++
printf()
。。。当研究C/C++编译器如何将其编译成机器代码时,您会注意到(注意,在此之后简化)在汇编代码中设置计数器、递减(MOV/DEC)和循环(JMP)。。字符串越长,循环该字符串所需的汇编代码就越多,因此它是
O(n)
,因为更多的CPU指令意味着更多的执行时间。@RaymondNijland:我相当肯定它不是,只要
printf
相当慢。C大部分是编译的,但会解释
printf
格式字符串
puts
将是要调用的逻辑函数,如果不是直接调用操作系统的话。是的,可能是
puts
确实是Java虚拟机可能调用的最逻辑的调用good point。。。不管怎样,我确信Java虚拟机的源代码不是开源的?我的评论或多或少是为了让topicstarter(额外)更好地理解为什么
System.out.println(前缀)
is
O(n)
time wise“无论如何都知道Java VM源代码不是开源的,我相信?”。。。哦,我想我已经和他谈过了,事实上现在。非常正确+1。。。也许可以为topicstarter提供更多的研究信息?->Java的
System.out.println
很可能直接映射到Java虚拟机中的C/C++
printf()
。。。当研究C/C++编译器如何将其编译成机器代码时,您会注意到(注意,在此之后简化)在汇编代码中设置计数器、递减(MOV/DEC)和循环(JMP)。。字符串越长,循环该字符串所需的汇编代码就越多,因此它是
O(n)
,因为更多的CPU指令意味着更多的执行时间。@RaymondNijland:我相当肯定它不是,只要
printf
相当慢。C大部分是编译的,但会解释
printf
格式字符串
puts
将是要调用的逻辑函数,如果不是直接调用操作系统的话。是的,可能是
puts
确实是Java虚拟机可能调用的最逻辑的调用good point。。。不管怎样,我确信Java虚拟机的源代码不是开源的?我的评论或多或少是为了让topicstarter(额外)更好地理解为什么
System.out.println(前缀)
is
O(n)
time wise“无论如何都知道Java VM源代码不是开源的,我相信?”。。。哦,我想我已经和他谈过了,事实上现在。
Executing line 7 takes 0( n) time since each character needs to be printed.