2

同じ問題に対して 2 つのアルゴリズムを実装しましたが、どちらが専門的な方法で最適かを調べたいと考えています。

基本的なアイデアは次のとおりです。

final static int LOOP_COUNT = 500;
long totaTime = 0;

worm-up();
for(int i =0, i<LOOP_COUNT, i++)
{
    long startTime = System.currentTimeMillis();
    myMethod();
    long endTime= System.currentTimeMillis();
    totalTime += endTime - startTime;
 }

 return totalTime / LOOP_COUNT;

そして、両方のアルゴリズムに対してそれを行います。

しかし:

  • Androidシステムがバックグラウンドでシステム計算を行わず、データを歪めないことをどのように達成できますか

  • 使用済みメモリを比較する方法はありますか?両方の方法が必要ですか?

4

2 に答える 2

1

専門的な統計結果と関連性のある結果が必要で、Android のバックグラウンド プロセスの影響を最小限に抑えたい場合は、アルゴリズムを何度も実行して平均を比較する必要があります。そうすれば、大数の法則により、正しい結果が得られます。

どのくらいの時間は、実行時間の標準偏差と、どの程度確実になりたいかによって異なります。基本的な統計知識に精通している場合は、いくつかの基本的な式を使用してサンプル サイズを決定できます。たとえば、サンプル分布が正規分布している場合は t 検定を実行して、両方のアルゴリズムの平均を比較できます。これにより、バックグラウンド プロセスの影響を最小限に抑えたいという事実が自動的に組み込まれます。ランダムに出現するので、何回か繰り返すとAndroidの影響が打ち消されます。

ガベージ コレクターも見てください。アルゴリズムの実行中に多くのオブジェクトが作成されると、結果に影響しますが、実際のアルゴリズムの使用にも影響するため、そうすべきです。

于 2012-10-30T18:16:33.923 に答える
0

コードを分析して、時間の複雑さを見つけることができます。ネストされたループがある場合:

for(int i = 0; i< max; i++){
  for(int j = 0; j< max; j++){
      c = i + j;
   }
 }

これは、時間計算量が O(n^2) になります。スペースの複雑さは O(1) です

別の例は次のとおりです。

for(int i = 0; i< max; i++){
   list[i] = "hello";
}

for(int j = 0; j< max; j++){
   list2[j] = "hello";
}

これは、O(n) と同じ O(2n) の時間の複雑さと、O(n) である O(2n) の空間の複雑さを持ちます。

後者の方が実行時間は長くなりますが、より多くのメモリを使用します。

于 2012-10-30T18:19:56.233 に答える