Algorithm 优化算法的技巧
我会尽量表达这个问题,不要让它听起来像我在寻找家庭作业的答案(这只是一个算法的练习问题) 您有一个数字数组,其中每个值最多可以出现2x[1 3 5 2 5 1 2 3] 检查从一个值到另一个自身实例的总和(5+2+5)(2+5+1+2) 找到一个算法,找到这样的总和的最大值 我想出了一个非常简单的算法: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]
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你可能会注意到初始算法计算出几乎相似的总和(在稍微改变的时间间隔上)一次又一次。