Java 使用确定的比较器,以指数方式增加的循环的运行时间是多少?
此循环的大O运行时间是多少:Java 使用确定的比较器,以指数方式增加的循环的运行时间是多少?,java,loops,time-complexity,big-o,Java,Loops,Time Complexity,Big O,此循环的大O运行时间是多少: for(int n=100; n <= 60000; n = n * 3){ ....inner loop code.... } for(int n=100;n它不是O(log n)。正如您所说,此循环的运行时间是恒定的,不依赖于某个变量n。如果循环运行的次数取决于外部提供的某个参数(例如数组的长度或此算法处理的某个参数),您可以在此处使用Big-O表示法假设循环中的代码是O(1),那么复杂度是O(log3n) 由于每次迭代都要乘以3,因此迭代的次数大致为x
for(int n=100; n <= 60000; n = n * 3){
....inner loop code....
}
for(int n=100;n它不是O(log n)。正如您所说,此循环的运行时间是恒定的,不依赖于某个变量n。如果循环运行的次数取决于外部提供的某个参数(例如数组的长度或此算法处理的某个参数),您可以在此处使用Big-O表示法假设循环中的代码是O(1),那么复杂度是O(log3n)
由于每次迭代都要乘以3,因此迭代的次数大致为x
,其中100*3^x=60000
要按照x
重新排列公式,您将得到3^x=600
,因此x=log3(600)
现在我假设60000
是这里的输入n
,你想知道当你增加这个数字时所需的时间是如何变化的,你得到了一个log3关系
正确答案是O(1),因为循环运行一定次数,在这种情况下,它总是线性时间。是O(1),因为没有变量输入。@ElliottFrischn
的值是按指数递增的。外循环是O(对数n)。不是O(1)“它每次运行的时间都是恒定的……”markspace在他的帖子正文中说,“但我不确定,因为它运行的次数是确定的。”这让我相信他是认真的。我不认为这个问题应该被标记下来。这是一个非常好的练习,可以仔细阅读和仔细思考。即使是一些有经验的程序员也被这个问题绊倒了,所以我认为这是值得问和回答的。我也有同样的想法,但我认为聪明的安迪·特纳·斯库恩markspace如果这是一个诡计问题,那么是的,我想他是对的。即使这不是一个诡计问题,你通常也不会在O中写log_3,因为log_3(n)与log(n)/log(3)相同,而1/log(3)是一个常量。@ChaiT.Rex这是非常正确的。