JavaScript二次函数的O效率高

时间:2019-05-01 15:38:21

标签: javascript big-o logarithm quadratic

我正在尝试提高功能的效率。它目前是二次方的,我想使它为对数。

当前功能的倒数第三行也使我有些困惑,我想澄清一下。

function solution(arr){
   let result = 0
    for ( let i = 0; i < arr.length; i++)
        for (let j = 0; j < arr.length; j++)
            if (arr[i] == arr[j])
                result = Math.max(result, Math.abs(i - j));
         return result;
 }

如何解决此问题?

2 个答案:

答案 0 :(得分:2)

至少,您可以更改索引以进行循环,并省略自我检查,并再次检查同一对。

function solution(arr){
    let result = 0
    for (let i = 0; i < arr.length - 1; i++)
        for (let j = i; j < arr.length; j++)
            if (arr[i] === arr[j])
                result = Math.max(result, Math.abs(i - j));
    return result;
}

最短的方法是通过获取用于存储第一个找到的索引值的哈希表的O(n)。

function solution(array) {
    var hash = {};
    return array.reduce(
        (m, v, i) => Math.max(m, i - (hash[v] = v in hash ? hash[v] : i)),
        0
    );
}

var array = [1, 3, 4, 5, 1, 3, 4, 5, 6, 2, 3];

console.log(solution(array));

答案 1 :(得分:0)

在上面的函数中,目标是从数组中找到最大数目。现在倒数第三行的含义是result = Math.max(result, Math.abs(i - j));,我将其分为两部分进行解释,

首先,将执行Math.abs(i-j)并从ij之间的差中提供绝对值。

此后,将调用外部函数Math.max()方法,该方法将为您提供第一步获得的resultabsolute value之间的最大值。现在,最大值将存储在result中。该功能的工作方式就是这样。

现在此语句是基于条件的,这意味着它将仅在arr[i]==arr[j]时执行。

我希望它可以清除该程序的工作流程。