これは学校の課題ですが、プログラムを「最大のパフォーマンスで実装する」必要がありました。これは、メモリが速度を上回るかどうかなどがわからないため、私の好みにはあいまいです。しかし、私が探しているのは入力データに対してスマートな操作を行うことで問題を解決する「トリッキーな」方法があるかどうかです。
したがって、ここに問題があります。AとBの2つの配列があると考えて、Bにそのような整数がある場合に1を返す関数を記述します。これは、Aの後続の2つの要素の合計に等しくなります。
以下は私の記事です。Hashmap<Integer>
スピードアップに必要なメモリは、O(n)ではなくO(n * m)の速度で動作するのに十分なほど強力な欠点であると考えたため、使用しなかったことに注意してください。
public static int arrayContainsSum(int[] a, int[] b)
{
int offsetA = a.length - 1;
int offsetB = offsetA;
int index = b.length - 1;
int result = 0;
int tested;
while (index >= 0)
{
if (offsetA > 0) a[offsetA] += a[--offsetA];
else if (offsetA == 0) // This has a danger of overflowing the int
a[offsetA--] = multiply(a);
tested = b[index];
if ((offsetA < 0 && tested != 0 && a[0] % tested != 0) ||
offsetB == 0)
{
// No point to test this element as it doesn't
//divide the product of sums
offsetB = a.length - 1;
index--;
}
if (tested == a[offsetB--])
{
result = 1;
break;
}
}
return result;
}
private static int multiply(int[] input)
{
int accumulator = input.length > 0 ? 1 : 0;
for (int i : input)
if (i != 0) accumulator *= i;
return accumulator;
}
私が気にしないことがいくつかあります:整数のオーバーフロー(乗算の結果として発生する可能性があります)。array.length
ローカル変数からの読み取りと同じくらい速いと思いました。
しかし、繰り返しになりますが、私の質問はむしろ「この問題を分析的に解決することはできなかったのか」ということです。これはより良い効率を意味しますか?
PS。この問題では、配列に一意のメンバーのみが含まれているかどうかについては言及されていません。制限はありません。また、が最小の要素よりも小さいか、最大の要素よりも大きい場合に、いくつかのルックアップを節約できるように並べ替えるa
ことで、最適化(そのような場合を検出した場合)が可能になると思いますが、これも複雑さが増すという犠牲を払うことになりますが、完全に正当化されるわけではありません。b[x]
a
a