繁体   English   中英

优化代码以加快执行速度

[英]Optimising code to make execution quicker

问题陈述:-我在编码竞赛中遇到的问题是在数组中给出了queryIndex。 给定一个数组。 我们必须使用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 [j](循环中)的值,如果条件为true,则更新array [j] = 0的值

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

方法中的问题:-时间复杂度大的输入要花10秒,我想在2秒以内得到它,因此如何实现为o(n)^ 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的值进行比较:条件和动作每次看起来都相同。 您只需要找到将匹配在多次运行中已匹配的所有元素的条件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM