我试图了解算法的时间复杂度,对此我有些麻烦。有人可以解释我如何数学计算该算法的复杂度吗?
fs.createReadStream('/tmp/important.dat')
.pipe(through2(
(chunk, enc, cb) => cb(null, chunk), // transform is a noop
function (cb) { // FLUSH FUNCTION
this.push('tacking on an extra buffer to the end');
cb();
}
))
.pipe(fs.createWriteStream('/tmp/wut.txt'));
答案 0 :(得分:2)
这是一个递归函数。当 m> n 时,它将再次使用参数(m-n,n)调用此函数。 因此,在最坏的情况下,假设当 m = 100 , n = 1 时,每个步骤中的parameter值为-
1. m = 100, n = 1
2. m = 99, n = 1 // because new m will be (m-n), and n remains same according to step 2 in your algorithm
3. m = 98, n = 1 // same as previous comment
4. m = 97, n = 1
.........
.........
.........
99. m = 2, n = 1
100. m = 1, n = 1
And then it executes steps 7 in your algorithm.
因此,总体来说,您的算法 100 乘以m和n之间的最大值。
当m 因此该算法的复杂度为 O(max(m,n)) 。
答案 1 :(得分:0)
在Faruk Hossain提供的东西之上。
上限可以另外减小
O(n,m) = a/b + b/gcd(a,b)
where a = max(n,m) and b = min(n,m)
通过观察此算法来计算gcd。并且a / b是第二个“ if语句启动”所需的步骤数,此后最多b/gcd(n,m)
一次还需要其他步骤