сделать числа в массиве сторонами допустимого треугольника - PullRequest
6 голосов
/ 14 октября 2011

Проверьте, содержит ли массив целых чисел n 3 числа, которые могут образовывать треугольник (т. Е. Сумма любого из двух чисел больше третьего).

По-видимому, это можно сделать за O(n) время.

(очевидное решение O(n log n) состоит в сортировке массива, поэтому не надо)

1 Ответ

3 голосов
/ 14 октября 2011

Трудно представить N чисел (где N умеренно велико), чтобы треугольника не было.Но мы попробуем:

Рассмотрим растущую последовательность, где каждое следующее значение находится на пределе N[i] = N[i-1] + N[i-2].Это не что иное, как последовательность Фибоначчи.Приблизительно это можно рассматривать как геометрическую прогрессию с коэффициентом золотого сечения (GRf ~ = 1.618).
Можно видеть, что если N_largest < N_smallest * (GRf**(N-1)), то обязательно будет треугольный триплет.Это определение является довольно нечетким из-за числа с плавающей точкой в ​​сравнении с целым числом и из-за GRf, это предел, а не фактический геометрический фактор.В любом случае, тщательно выполненный тест даст тест O (n), который может проверить, есть ли триплет.Если нет, то мы должны выполнить некоторые другие тесты (все еще размышляя).

EDIT : Прямой вывод из идеи Фибоначчи состоит в том, что для целочисленного ввода (как указано в Q) будут существоватьгарантированное решение для любого возможного ввода , если размер массива будет больше, чем log_GRf(MAX_INT), а это 47 для 32 бит или 93 для 64 бит.На самом деле, мы можем использовать наибольшее значение из входного массива, чтобы определить его лучше.

Это дает нам следующий алгоритм:

Шаг 1) Найти MAX_VAL из входных данных: O(n)

Шаг 2) Вычислить минимальный размер массива, который гарантировал бы существованиерешения:
N_LIMIT = log_base_GRf(MAX_VAL): O(1)

Шаг 3.1), если N> N_LIMIT: вернуть true: O(1)

Шаг 3.2), иначе сортировать и использовать прямыеМетод O(n*log(n))

Поскольку для больших значений N (и это единственный случай, когда сложность имеет значение), это O(n) (или даже O(1) в случаях, когда N > log_base_GRf(MAX_INT)), мы можем сказать, что этоO(n).

...