【问题标题】:Big O time efficiency for a quadratic function in JavaScriptJavaScript 中二次函数的大 O 时间效率
【发布时间】:2019-05-01 15:38:20
【问题描述】:

我正在尝试提高函数的效率。它目前是二次的,我想让它成为对数。

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

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;
 }

我该如何解决这个问题?

【问题讨论】:

  • 欢迎来到 Stackoverflow!请记住,SO 不是一个通用的帮助论坛,如果您有已经可以运行的代码,但您想改进/优化它,那么 SO 不是一个合适的地方。看看codereview.stackexchange.com,如果你想帮助改进一些有效的东西,而不是询问如何修复不起作用的代码(或者开始尝试自己重写这段代码,然后一旦你因为代码没有做什么而被卡住您认为应该这样做,请在此处询问)
  • 这可以在线性时间内解决。 let j = i + 1 确实已经大大提高了性能,线性时间你需要一个地图。
  • 到底是什么让你感到困惑?

标签: javascript big-o logarithm quadratic


【解决方案1】:

至少,您可以更改循环的索引并省略自检并再次检查相同的对。

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));

【讨论】:

    【解决方案2】:

    在上面的函数中,目标是从数组中找到最大的数。现在倒数第三行是result = Math.max(result, Math.abs(i - j));的意思,这里分两部分来解释,

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

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

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

    我希望它清除了这个程序的工作流程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-19
      • 1970-01-01
      • 2011-06-07
      相关资源
      最近更新 更多