检查字符串是否是回文的javascript递归解决方案的最大优点是什么?
我发现了一些非常有用的解决方案,可以编写一个Javascript函数,递归地检查字符串是否是回文。我想知道以下解决方案的时间和空间复杂性。你能解释一下每一行是如何构成大O的吗检查字符串是否是回文的javascript递归解决方案的最大优点是什么?,javascript,recursion,time-complexity,big-o,palindrome,Javascript,Recursion,Time Complexity,Big O,Palindrome,我发现了一些非常有用的解决方案,可以编写一个Javascript函数,递归地检查字符串是否是回文。我想知道以下解决方案的时间和空间复杂性。你能解释一下每一行是如何构成大O的吗 function isPalindrome(string) { if (string.length < 2) return true; if (string[0] === string[string.length - 1]) { return isPalindrome(string.s
function isPalindrome(string) {
if (string.length < 2) return true;
if (string[0] === string[string.length - 1]) {
return isPalindrome(string.slice(1, string.length - 1))
}
return false;
}
函数isAlindrome(字符串){
if(string.length<2)返回true;
if(字符串[0]==string[string.length-1]){
返回isAlindrome(string.slice(1,string.length-1))
}
返回false;
}
递归调用函数n/2次,其中n是字符串的长度,因为每次迭代都会删除字符串的第一个和最后一个条目
因此,复杂性将是O(n/2)
=O(n)
,并且每个函数调用最多有3个操作。这将乘以一个常数,这个常数不会改变复杂性
编辑:如注释和另一个答案中所述,这些操作之一是string.slice
。您需要检查它的复杂性,因为它也会成倍增加,并且会改变总体复杂性。如果slice
是O(1)常数,那么总体上就是O(n)。如果slice
是O(n),那么总的来说就是O(n^2)
对于空间复杂性,您可以创建许多数组。我会告诉你细节,但我想说的是,乍一看是O(n^2)
计算示意图:第一个数组是大小n
,然后是n-2
,n-4
,用一些数学求和公式求和
提示:
n+(n-1)+(n-2)+……
是n*(n+1)/2
,它是O(n^2)
,这应该给人足够的“感觉”,这也是O(n^2)
。递归调用函数n/2次,其中n是字符串的长度,因为每次迭代都会删除字符串的第一个和最后一个条目
因此,复杂性将是O(n/2)
=O(n)
,并且每个函数调用最多有3个操作。这将乘以一个常数,这个常数不会改变复杂性
编辑:如注释和另一个答案中所述,这些操作之一是string.slice
。您需要检查它的复杂性,因为它也会成倍增加,并且会改变总体复杂性。如果slice
是O(1)常数,那么总体上就是O(n)。如果slice
是O(n),那么总的来说就是O(n^2)
对于空间复杂性,您可以创建许多数组。我会告诉你细节,但我想说的是,乍一看是O(n^2)
计算示意图:第一个数组是大小n
,然后是n-2
,n-4
,用一些数学求和公式求和
提示:
n+(n-1)+(n-2)+…
是n*(n+1)/2
,它是O(n^2)
,这应该会给人足够的“感觉”,这也是O(n^2)
。起初,你的函数似乎是O(n)),因为你递归地调用它n/2次。但是,在每次调用中,您还使用复杂度为O(n)的string.slice
。因此,您的函数实际上是O(n^2)起初,您的函数似乎是O(n),因为您递归调用它n/2次。但是,在每次调用中,您还使用复杂度为O(n)的string.slice
。因此,函数实际上是O(n^2)取决于string.slice
的实现效率。它可能介于O(n)
和O(n²)
之间。不,我们不能详细解释大O。您能否向我们展示您在推导函数的大O方面的尝试,以便我们能够填补空白?@Bergi是基于JS引擎实现的slice
,O(n)
和O(n²)
之间的差异?@Abdul Yes。(另外,重要的是指出这是最坏的情况复杂度,而不是平均情况复杂度)取决于string.slice
的实现效率。它可能介于O(n)
和O(n²)
之间。不,我们不能详细解释大O。您能否向我们展示您在推导函数的大O方面的尝试,以便我们能够填补空白?@Bergi是基于JS引擎实现的slice
,O(n)
和O(n²)
之间的差异?@Abdul Yes。(另外,重要的是要说明它是最糟糕的案例复杂度,而不是平均案例复杂度)“它的复杂度为O(n)”-你怎么知道?我完全忘了考虑slice
!然而,Bergi的评论仍然有效:你怎么知道它是O(n)?好吧,我很快检查了一下,因为它被接受了,我认为它是正确的。然而,你是对的,根据实现情况,情况可能会更糟。“它的复杂性为O(n)”-你怎么知道?我完全忘了考虑slice
!然而,Bergi的评论仍然有效:你怎么知道它是O(n)?好吧,我很快检查了一下,因为它被接受了,我认为它是正确的。然而,你是对的,根据实现情况,情况可能会更糟。“你创建了很多数组”-我假设string
变量包含字符串,而不是数组:-)对于数组,我们知道slice
是O(n)
(空间和时间平均复杂度)。顺便说一句,您的空间复杂度计算似乎没有考虑垃圾收集。“您创建了很多数组”-我假设string
变量包含字符串,而不是数组:-)对于数组,我们知道slice
是O(n)
(空间和时间平均复杂度)。顺便说一句,您的空间复杂性计算似乎没有考虑垃圾收集。