2014-02-05 3 views
2

С этого вопроса Java: get greatest common divisorJava: получите самый большой общий делитель, какой метод лучше?

В получении НОД данных любого типа ли int, long, Integer, Long, какой ответ лучше с точки зрения точности, скорости, использование процессора и т.д.?

А:

private static int gcdThing(int a, int b) { 
    BigInteger gcd = BigInteger.valueOf(a).gcd(BigInteger.valueOf((b))); 
    return gcd.intValue(); 
} 

Б:

public int GCD(int a, int b) { return b==0 ? a : GCD(b, a%b); } 
+0

Проверьте его. Создайте список или массив из множества чисел и проверьте время, которое каждый из них выполнит. Изменить: вероятно, это не BigInteger, потому что это имеет тенденцию быть медленным даже с настройками. – Xabster

+1

Если вы измените второй метод от рекурсивного к итеративному, это, вероятно, даст наилучшие результаты. – alfasin

+0

Ну, я еще не пробовал коды бенчмаркинга. Наверное, я просто испытаю это сам. – Marl

ответ

4
Random r = new Random(); 
    int[] ints = new int[500000]; 
    for (int i = 0 ; i < ints.length ; i++) 
     ints[i] = r.nextInt(); 

    for (int i = 0 ; i < ints.length-1; i++) 
     GCD(i,i+1); 
    for (int i = 0 ; i < ints.length-1; i++) 
     gcdThing(i, i + 1); 

    long start = System.currentTimeMillis(); 
    for (int i = 0 ; i < ints.length-1; i++) 
     GCD(i,i+1); 
    System.out.println("GCD: " + (System.currentTimeMillis() - start)); 

    start = System.currentTimeMillis(); 
    for (int i = 0 ; i < ints.length-1; i++) 
     gcdThing(i, i + 1); 
    System.out.println("gcdThing: " + (System.currentTimeMillis() - start)); 

Печать:

НОД: 13

gcdThing: 124

+0

Хорошо, что отвечает на него. – Marl

+1

Этого не достаточно для разминки, чтобы дать серьезный ответ для скорости пост-JIT ... но это результат, которого я ожидал бы. С другой стороны, я бы поставил, что итеративное решение будет еще быстрее, особенно после JITting. – keshlam

+0

@keshlam Думаю, я попробую итерацию, чтобы проверить лучшую производительность. – Marl

Смежные вопросы