准备技术面试,我用递归解决方案解决了练习题。
递归函数的运行时复杂性是什么?我更关心的是解释而不是答案。
根据我的分析,操作次数将是n的一半。也就是说,在最坏的情况下,一个10个字符的字符串将进行5次函数调用。但我从未见过O(n / 2)运行时。此外,我的分析排除了对辅助函数counterpartOf
的调用。有人可以给我一个正确的分析吗?
编写一个接受由括号({})组成的字符串的函数,并返回它是否是平衡的。
function checkBraces(input){
// start at the center and work outwards, recursively
var c = input.length / 2;
if (input.charAt(c) !== counterpartOf(input.charAt(c-1))) {
var match = false;
return match;
} else {
// if only 2 characters are left, all braces matched
if (input.length === 2){
var match = true;
return match;
} else {
input = input.substring(0,c-1) + input.substring(c+1,input.length);
return checkBraces(input);
}
}
return match;
}
function counterpartOf(brace){
closing = ['}', ')', ']'];
opening = ['{', '(', '['];
var i = opening.indexOf(brace);
var counterpart = closing[i];
return counterpart;
}
答案 0 :(得分:1)
常数是无关紧要的,这就是为什么你不会看到/ 2,* 2或类似的东西。
详细说明:
http://en.wikipedia.org/wiki/Big_O_notation#Multiplication_by_a_constant
如果k不为零,则O(k * g)= O(g)。
否则,正如Yevgeniy.Chernobrivets所提到的,你的算法并不准确。但除了他的评论,我认为还有其他问题。
通常对于类似的任务,他们使用下推自动机。关于这个问题有一些理论背景:http://people.cs.clemson.edu/~goddard/texts/theoryOfComputation/7.pdf
答案 1 :(得分:1)
只有在javascript O(n)
函数需要恒定时间的情况下,函数的复杂度才为substring
。如果substring
函数的复杂度为O(k)
,其中k
是子字符串的长度,则函数的复杂度将为O(n^2)
。您需要检查javascript substring
函数的实现以确保。
答案 2 :(得分:1)
有点偏离主题,不确定你是否需要使用递归,但我认为这是一种更有效的方法来获得结果:
function checkBraces( input )
{
// if the string is an odd number of characters, return immediately.
if( input.length % 2 !== 0 ) return false;
// split the string in half
var c = input.length / 2;
var r = input.substr( c );
var l = input.substr( 0, c );
// take the left side, reverse it, and swap each left bracket character with it's counterpart
l = l.split('').reverse().join('').replace(/\{|\(|\[/g, counterpartOf );
// strings should match
return r == l;
}