0

によって保持されている長い値を出力しようとしていますelapsed。誰かがそれを行う方法のフォーマットを手伝ってくれますか?

これは印刷します0.0

しかし、私はそれがより有効な数字を持っていることを知っています(おそらく.0005324など)

System.out.println("It took " + (double)elapsed + " milliseconds to complete SELECTION_SORT algorithm.");

'

    System.currentTimeMillis();
    long start = System.currentTimeMillis();
    int sortedArr[] = selectionSort(arr1);
    long elapsed = System.currentTimeMillis() - start;


    System.out.println("\n///////////SELECTIONSort//////////////");
    System.out.println("\nSelection sort implemented below prints a sorted list:");
    print(sortedArr);
    System.out.printf("It took %.7f ms....", elapsed);

    //System.out.println("It took " + (double)elapsed + " milliseconds to complete SELECTION_SORT algorithm.");'

'

    private static int[] selectionSort(int[] arr) {

    int minIndex, tmp;
    int n = arr.length;
    for (int i = 0; i < n - 1; i++) {
        minIndex = i;
        for (int j = i + 1; j < n; j++)
            if (arr[j] < arr[minIndex])
                minIndex = j;
        if (minIndex != i) {
            tmp = arr[i];
            arr[i] = arr[minIndex];
            arr[minIndex] = tmp;
        }
    }
    return arr;

}'
4

4 に答える 4

2

フォーマットを変更しても、解像度が向上することはありません。これは、1ミリ秒を7桁で印刷すると、毎回1.0000000になるだけです。これはまったく役に立ちません。

必要なのは高解像度のタイマーです

long start = System.nanoTime();
int sortedArr[] = selectionSort(arr1);
long elapsed = System.nanoTime() - start;

System.out.println("\n///////////SELECTIONSort//////////////");
System.out.println("\nSelection sort implemented below prints a sorted list:");
print(sortedArr);
System.out.printf("It took %.3f ms....", elapsed / 1e6);

ただし、Java はコードを動的にコンパイルし、実行すればするほど高速になるため、一度これを行うとごまかされてしまいます。100 倍以上速くなり、最初に表示される数値が役に立たなくなる可能性があります。

通常、ループを何度も実行し、最初の 10,000 回以上は無視することをお勧めします。これにより結果が大きく変わり、最初の桁が完全に間違っていることがわかります。これを試すことをお勧めします

for(int iter = 1; iter<=100000; iter *= 10) {
    long start = System.nanoTime();
    int[] sortedArr = null
    for(int i=0;i<iter;i++) 
        sortedArr = selectionSort(arr1);
    long elapsed = System.nanoTime() - start;

    System.out.println("\n///////////SELECTIONSort//////////////");
    System.out.println("\nSelection sort implemented below prints a sorted list:");
    print(sortedArr);
    System.out.printf("It took %.3f ms on average....", elapsed / 1e6 / iter);
}

コードをより長く実行するだけで、結果が 10 倍、場合によっては 100 倍向上することがわかります。

于 2013-11-09T07:59:08.477 に答える
1

印刷フォーマットを使用できます。doubleまたはの場合float、小数点以下 7 桁を取得するには、次のようにします。

System.out.printf("It took %.7f ms....", elapsed);

EDIT :
実際には alongではなく aを使用しているため、整数値のみを使用するdoubleため、有効数字を使用できません。long

于 2013-11-09T06:33:05.570 に答える
0

これを試してください: String.format("%.7f",longvalue); 上記の行を使用すると、長いまたは任意の浮動小数点数をフォーマットできます。ここで 7 は、「.」の後に必要な桁数です。.

于 2013-11-09T06:44:05.000 に答える
0

Alongは整数値で、小数点以下の桁数はありません。

実行時間の概算を取得するには、ループで同じ並べ替えを実行し、たとえば 1000 回実行してから、測定された時間を 1000 で割ります。

例えば:

System.out.println("It took " + ((double)elapsed) / NUMBER_OF_ITERATONS);
于 2013-11-09T06:56:56.323 に答える