Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/462.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 优化最后一个元素减去第一个元素的算法_Javascript_Arrays_Algorithm - Fatal编程技术网

Javascript 优化最后一个元素减去第一个元素的算法

Javascript 优化最后一个元素减去第一个元素的算法,javascript,arrays,algorithm,Javascript,Arrays,Algorithm,我试图优化一个更大的算法的一个缓慢的部分 我有一个随机数数组: [295, 292, 208, 393, 394, 291, 182, 145, 175, 288, 71, 86, 396, 422] (实际数组要长得多),索引:N(N=5) 我想做的是,对于前N个较小的元素,从最后M个元素中减去1 So(伪代码): 但是我错过了一些东西 [编辑]我觉得自己像个白痴。我没有正确解释我想要什么,已修复。让我们重新组织循环: for b = 6..N for a = 1..5 if a

我试图优化一个更大的算法的一个缓慢的部分

我有一个随机数数组:

[295, 292, 208, 393, 394, 291, 182, 145, 175, 288, 71, 86, 396, 422]
(实际数组要长得多),索引:
N
N=5

我想做的是,对于前N个较小的元素,从最后M个元素中减去1

So(伪代码):

但是我错过了一些东西


[编辑]我觉得自己像个白痴。我没有正确解释我想要什么,已修复。

让我们重新组织循环:

for b = 6..N
  for a = 1..5
    if ary[a] < ary[b]
      ary[b] -= ary[a];

在我看来,Petr的解决方案并没有遵循问题的规范:我们应该为每个“命中”减去1(一),而不是ary[a]的值

这里有一个替代方案:

  • 将testvalues ary[j],j=0..N-1放入排序数组:sortedSmallAry[N]

  • 然后计算所有b,即b=N,…,总计-1,并针对每个ary[b]:

  • 在SortedStallary上运行j=0..N-1,测试SortedStallary[j]是否小于ary[b],计算命中次数,失败后立即退出(因为已排序)。如果N相对较大,则可以在sortedSmallAray中使用二进制搜索来确定有多少元素满足条件

  • 从ary[b]中减去命中率


  • 也许这更像是一个话题。如果一个“最后一个元素”大于两个“第一个元素”之和怎么办?@greybeard——不知道从哪里得到的和?如果第一个元素小于什么?或者你的意思是最少(最小)?@最后面——代码中的
    if
    应该更有意义。太棒了,谢谢!仅供参考,我编辑了原始需求,因为我是一个白痴,没有正确地键入它们,但这不会改变整体算法,我只需要一个带索引的touple。是的,我更改了规范,因为我不小心写错了。他的算法遵循我最初的要求,但它是相同的通用算法。非常感谢:)好的,欢迎。不过,我相信,对于目前所使用的规格(每种命中减去1),你可能想考虑我已经排好的排序“测试数组”的方法。成功!这基本上就是我现在正在做的:)。排序后的数组(
    [208、292、295、393、394]
    )将被二进制搜索,我只需减去
    索引+1
    for a = 1..5
      // ???
    for b = 6..N
      ary[b] -= ???
    
    for b = 6..N
      for a = 1..5
        if ary[a] < ary[b]
          ary[b] -= ary[a];
    
    sum[0] = 0
    for a = 1..5
        sum[a] = sum[a-1] + ary[a]
    for b = 6..N
        a_last = maximal a such that sum[a]<ary[b] // use binary search
        ary[b] -= sum[a_last]