Вычисление GCD на отсортированном массиве - PullRequest
2 голосов
/ 09 июня 2019

Можно ли получить некоторую оптимизацию для любого алгоритма, используемого для получения gcd чисел в массиве, если массив отсортирован?Спасибо!

1 Ответ

1 голос
/ 12 июня 2019

Итак, посмотрим.Общий метод поиска GCD массива чисел:

result = a[0]
for i = 1 to length(a)-1
    result = gcd(result, a[i])

Так в чем же сложность алгоритма gcd?Ну, это довольно сложный вопрос.См., Например, Временная сложность алгоритма Евклида

Если мы сделаем вид, как положено в принятом ответе, что алгоритм GCD имеет постоянное время (т. Е. O (1)), тосложность цикла выше O (n).Это разумное предположение для чисел, которые вписываются в компьютерные регистры.И если это так, то потратить O (n log n) время на сортировку массива почти наверняка будет проигрыш.

Но в действительности вычисление GCD является линейным по количеству цифр в двух числах.Если ваши входные данные состоят из большого числа больших чисел, возможно , что сортировка массива в первую очередь даст вам преимущество.Причина в том, что результат gcd(a, b) по определению даст вам число, которое не больше, чем min(a,b).Таким образом, сначала получая GCD из двух наименьших чисел, вы ограничиваете количество цифр, с которыми вам приходится иметь дело.Преодолеет ли это ограничение стоимость сортировки массива, неясно.

Если числа больше, чем вписываются в компьютерный регистр (сотни цифр), то вычисление GCD обходится дороже.Но, опять же, сортировка тоже.

Итак, ответ на ваш вопрос заключается в том, что сортировка почти наверняка увеличит скорость вычисления GCD массива чисел, но будет ли повышение производительности компенсировать стоимость сортировкинеясно.

Я думаю, что единственный способ узнать наверняка - это проверить его на репрезентативных данных.

...