Time complexity 分析该函数的时间复杂度
假设do_某物是O(1),我如何计算这个函数的时间复杂度Time complexity 分析该函数的时间复杂度,time-complexity,Time Complexity,假设do_某物是O(1),我如何计算这个函数的时间复杂度 function run(n) { for(var i = 1; i <= n; i++) { var counter = 1; while(counter <= n) { for (var j = counter; j >= 1; j--) { do_something(); } counter = counter * 2;
function run(n) {
for(var i = 1; i <= n; i++) {
var counter = 1;
while(counter <= n) {
for (var j = counter; j >= 1; j--) {
do_something();
}
counter = counter * 2;
}
}
}
函数运行(n){
对于(var i=1;i计算每件事情的复杂性并不简单,因为有些函数(例如collatz猜想)不知道精确的分析。在这种情况下,您可以进行经验分析,猜测哪种运行时类最匹配
与您的样品相关:
外部for循环被调用n次
while循环称为log(n)次
内部for循环称为计数器时间,其中计数器增长2^m。但计数器会重新计算日志(n)次
这意味着循环的内部指数(2^m)称为m=log(n)次。
所以你有2^(logn)=n log(2)=n
反之亦然。内部指数函数称为对数时间。表示对数(2^m)->(2^n=2^m)->m=n
您还可以简单地创建一个从m=0到m=log(n)的2^m之和,即2n-1->O(n)
然后你必须将外部for循环的线性时间乘以while循环的线性时间(包括内部for循环)。因此你有O(n*n)=O(n²)时间。可以计算出精确的步数
外部循环运行n次
while和最内部的循环是计数器的每个值的运行计数器时间,它们是1,2,4,8,…,2^(位长度(n)-1)
其总和为2^位长度(n)-1
其中位长度(n)=trunc(ln(n)/ln(2))+1
将这两个值相乘,即可得出精确的步数:
n*(2^位长度(n)-1)
近似复杂度为O(n2),因为O(2^位长(n)-1)=O(n)
您能详细说明一下如何得到nlog(n)吗?