优化代码以加快执行速度

时间:2019-09-09 20:39:12

标签: javascript node.js

问题陈述:- 我遇到的问题是在编码竞赛中,queryIndex是在array中给出的。给定一个数组。我们必须使用queryIndexArray获取每个索引并在主数组中执行以下操作:-

    for k = queryIndex[i] + 1 to array.length 
         if (array[k] < array[queryIndex[i]]){
            array[queryIndex[i]] = 0  
          }

我已经编写了JavaScript代码,但问题是运行10.03秒需要10秒,准确地说,由于问题是基于时间的,我如何将运行时降低到2秒

我使用的方法:-

let arrayLength = 5 ;
let array = [4,3,4,2,1]
let queryIndex = [3,2]
let queryIndexLength = 2

for (let i =0 ; i <queryIndexLength ; i ++ ){
  let forwardIndex = queryIndex[i] + 1
   for (let j = forwardIndex ; j< arrayLength ; j++){
     if (array[forwardIndex] < array[j]  ){
        array[j] = 0 
      }
   }
}

此代码通过了测试用例,但问题是执行需要10秒,而该问题的运行时间仅为2秒。我是否应该使用其他数据结构(如集合)?由于阵列需要更长的时间,因此请提出解决方案?

代码简要说明:-

  1. 它从查询索引中获取值。(第一个循环在查询索引上运行)
  2. 将queryindex值的值从1递增
  3. 第二个内部循环从queryIndex + 1运行到array.length
  4. 在内部检查array [queryIndex + 1] 的值

这只是一个示例代码,原始测试用例的值对于array和queryIndex来说足够大,因此花费了10.03秒

问题所在:-时间复杂度大的输入要花10秒,我想在2秒以内得到它,因此如何实现它作为o(n)^ 2解决方案。

1 个答案:

答案 0 :(得分:2)

您可以使用以下算法在O(array.length + queryIndex.length*log(queryIndex.length))中进行此操作:

sort(queryIndex)
minQuery = Infinity
foreach i in queryIndex:
  minQuery = minimum(array[queryIndex[i]], minQuery)
  foreach j of (queryIndex[i] .. queryIndex[i+1]):
    if array[j] > minQuery
      array[j] = 0

无需多次遍历大数组的某些部分(从每个queryIndex到数组的末尾),只需将每个元素与queryIndex上的值进行比较:条件和操作每次看起来都相同。您只需要找到与多个运行中已匹配的所有元素匹配的条件即可。