【问题标题】:What is the Big O of function什么是函数的大 O
【发布时间】:2020-10-22 09:39:58
【问题描述】:

目前我正在学习数据结构和算法。我想知道如何计算空间复杂度和函数的大 O。我编写了一个程序,该程序将 Capabilities 数组的每个索引的第一个字母。请建议我更好的方法。

function capitalizeFirst(arr){
    let result = [];
    function helper(array) {
        if (array.length === 0) return;
        let upperCassed = array[0][0].toUpperCase();
        array[0].split(array[0][0])
        array[0] = array[0].split(array[0][0])
        array[0][0] = upperCassed
        result.push(array[0].join(''));
        helper(array.splice(1));
    }


    helper(arr);
    return result;
}
console.log(capitalizeFirst(['banana', 'orange', 'mango']));

// ['banana', 'orange', 'mango']
// ['Banana', 'Orange', 'Mango']

【问题讨论】:

  • 我认为这是 O(1),因为它从不循环,并且只访问过第一项。
  • @evolutionxbox 除了它在整个数组上递归。因此必须是O(n)(我想!)
  • @Jamiec 好地方。结果推送后我没有注意到调用。
  • 它是 O(n),因为它接触每个元素并且每个元素只接触一次。每个元素的运算是O(1),所以总体来说,它需要O(n)
  • 我明白了。非常感谢@evolutionxbox

标签: javascript arrays data-structures


【解决方案1】:

有多种方法可以解决这个问题。您可以使用箭头函数或 javascript 函数。以下是一种可能的解决方案:

function capitalizeFirstLetter(strArr) {
  strArr.forEach(function (item, index) {
   console.log(item.charAt(0).toUpperCase() + item.slice(1));
  });
}

capitalizeFirstLetter(['banana','mango']); 

关于空间复杂度,它是算法所需的最大内存空间,在这种情况下,我们没有使用任何额外的空间。因此它是 O(1)。

关于时间和空间复杂度的更多细节可以参考:https://www.hackerearth.com/practice/basic-programming/complexity-analysis/time-and-space-complexity/tutorial/

【讨论】:

  • 非常感谢 :)。我正在努力提高编程能力。
  • 您对空间复杂度的看法可能是对的(我不确定 TBH),但通常我们对时间复杂度感兴趣。
  • @Jamiec 你是对的。大多数时候考虑时间复杂度。由于该问题专门询问了该功能的空间复杂性,因此我仅强调了这一点。时间复杂度为 O(n)。
【解决方案2】:

您的方法有效,但为了计算 Big O,我认为它相当复杂。它倾向于隐藏这样一个事实,即它只循环一个数组一次,这将使它成为O(n)

更简单的方法是完全按照要求进行操作,并且仅此而已 - 循环遍历数组,将字符串的第一个字符大写

function capitalizeFirst(arr){
    for(var i=0;i<arr.length;i++){
      arr[i] = arr[i][0].toUpperCase() + arr[i].substring(1);
    }
    return arr;
}
console.log(capitalizeFirst(['banana', 'orange', 'mango']));

// ['banana', 'orange', 'mango']
// ['Banana', 'Orange', 'Mango']

当然,上面的写法有很多,但一个简单的循环,两个简单的字符串方法可能是最直接的。从这个例子中可以清楚地看出,循环是O(n),每个字符串操作都是O(1)——结果仍然是O(n)

【讨论】:

  • 非常感谢 :) 我正在努力提高编程能力。