Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.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
Algorithm 优化算法的技巧_Algorithm_Optimization - Fatal编程技术网

Algorithm 优化算法的技巧

Algorithm 优化算法的技巧,algorithm,optimization,Algorithm,Optimization,我会尽量表达这个问题,不要让它听起来像我在寻找家庭作业的答案(这只是一个算法的练习问题) 您有一个数字数组,其中每个值最多可以出现2x[1 3 5 2 5 1 2 3] 检查从一个值到另一个自身实例的总和(5+2+5)(2+5+1+2) 找到一个算法,找到这样的总和的最大值 我想出了一个非常简单的算法: iterate through the array (for i=1 to n) iterate through the remaining array (for j=i+1) if A[i]

我会尽量表达这个问题,不要让它听起来像我在寻找家庭作业的答案(这只是一个算法的练习问题)

您有一个数字数组,其中每个值最多可以出现2x[1 3 5 2 5 1 2 3] 检查从一个值到另一个自身实例的总和(5+2+5)(2+5+1+2)

找到一个算法,找到这样的总和的最大值

我想出了一个非常简单的算法:

iterate through the array (for i=1 to n)
iterate through the remaining array (for j=i+1)
if A[i] == A[j]
    s = 0
    iterate through the values between those two points (for k=i to j)
        s = s + A[k]
    maxVal = max(maxVal,s)
我可以采取哪些步骤来优化算法。(或该问题的任何算法)。显然,这个解决方案是我第一次想到的,但我很难想象更好的解决方案会更有效


编辑:为了解决这个问题,我只想说所有元素都是正的

计算累积和的数组:

C[0] = A[0]  
for i = 1 to n  
  C[i] = C[i - 1] + A[i]  
A[1 3 5 2 5 1 2 3]  
C[0 1 4 9 11 16 17 19 22]  
找到配对时使用这些值:

  Sum(i to j) = C[j] - C[i - 1]

p.S.所有元素都是正的吗?

计算累积和的数组:

C[0] = A[0]  
for i = 1 to n  
  C[i] = C[i - 1] + A[i]  
A[1 3 5 2 5 1 2 3]  
C[0 1 4 9 11 16 17 19 22]  
找到配对时使用这些值:

  Sum(i to j) = C[j] - C[i - 1]

p.S.所有元素都是正的吗?

您可以通过预先计算从索引1到索引i的所有和并将其存储到数组中,调用
sum
来摆脱最内部的循环。如果你想得到i和j之间的和,结果将是sum[j]-sum[i-1]

for(i = 1 to n)
  sum[i] = A[i];
  if(i - 1 > 1)
    sum[i] += sum[i - 1];
还要注意,数组中的每个值只有两次出现,我们可以使用地图/字典或数组
pos
(如果可能)记住该值的第一个位置,如果我们再次看到它,我们可以使用它来计算第一个位置和该位置之间的和

  pos[];
  for(i = 1 to n)
     if(pos[A[i]] ==0)
       pos[A[i]] = i;
     else
       result = max(result,sum[i] - sum[pos[A[i]] - 1])

因此,总的来说,这个过程的时间复杂度是O(n)

您可以通过预先计算从索引1到索引i的所有和并将其存储到一个数组中,调用
sum
来摆脱最内部的循环。如果你想得到i和j之间的和,结果将是sum[j]-sum[i-1]

for(i = 1 to n)
  sum[i] = A[i];
  if(i - 1 > 1)
    sum[i] += sum[i - 1];
还要注意,数组中的每个值只有两次出现,我们可以使用地图/字典或数组
pos
(如果可能)记住该值的第一个位置,如果我们再次看到它,我们可以使用它来计算第一个位置和该位置之间的和

  pos[];
  for(i = 1 to n)
     if(pos[A[i]] ==0)
       pos[A[i]] = i;
     else
       result = max(result,sum[i] - sum[pos[A[i]] - 1])

因此,总的来说,这个问题的时间复杂度将是O(n)

预期的O(n);)或者甚至可能是高概率的O(n),这取决于哈希表实现预期的O(n);)或者甚至是高概率的O(n),这取决于哈希表的实现哇,这真是太聪明了!我真希望我有这样创造性解决方案的诀窍。在尝试优化我的解决方案时,您首先考虑的是什么?(试图提高我的优化技能)如果你可以使用额外的内存,也可以看看Pham Trung关于hashmap的建议/dusctionary@CoderNinja从中缀聚合到前缀聚合的缩减是算法工程中的一个著名构造。学习这些东西需要一点练习。如果你想练习你的算法/问题解决技能,我可以推荐TopCoder或Codeforces这样的平台(但这需要努力,没有免费的午餐和简单的技巧可以神奇地让你更快地解决问题)。@CoderNinja你可能会注意到初始算法计算出几乎相似的总和(在稍微改变的时间间隔上)一次又一次。哇,这真聪明!我真希望我有这样创造性解决方案的诀窍。在尝试优化我的解决方案时,您首先考虑的是什么?(试图提高我的优化技能)如果你可以使用额外的内存,也可以看看Pham Trung关于hashmap的建议/dusctionary@CoderNinja从中缀聚合到前缀聚合的缩减是算法工程中的一个著名构造。学习这些东西需要一点练习。如果你想练习你的算法/问题解决技能,我可以推荐TopCoder或Codeforces这样的平台(但这需要努力,没有免费的午餐和简单的技巧可以神奇地让你更快地解决问题)。@CoderNinja你可能会注意到初始算法计算出几乎相似的总和(在稍微改变的时间间隔上)一次又一次。