检查字符串是否是回文的javascript递归解决方案的最大优点是什么?

检查字符串是否是回文的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

我发现了一些非常有用的解决方案,可以编写一个Javascript函数,递归地检查字符串是否是回文。我想知道以下解决方案的时间和空间复杂性。你能解释一下每一行是如何构成大O的吗

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)
(空间和时间平均复杂度)。顺便说一句,您的空间复杂性计算似乎没有考虑垃圾收集。