Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

do numbers in an array contain sides of a valid triange

Tags:

puzzle

Check if an array of n integers contains 3 numbers which can form a triangle (i.e. the sum of any of the two numbers is bigger than the third).

Apparently, this can be done in O(n) time.

(the obvious O(n log n) solution is to sort the array so please don't)

like image 804
MK. Avatar asked Oct 14 '11 02:10

MK.


1 Answers

It's difficult to imagine N numbers (where N is moderately large) so that there is no triangle triplet. But we'll try:

Consider a growing sequence, where each next value is at the limit N[i] = N[i-1] + N[i-2]. It's nothing else than Fibonacci sequence. Approximately, it can be seen as a geometric progression with the factor of golden ratio (GRf ~= 1.618).
It can be seen that if the N_largest < N_smallest * (GRf**(N-1)) then there sure will be a triangle triplet. This definition is quite fuzzy because of floating point versus integer and because of GRf, that is a limit and not an actual geometric factor. Anyway, carefully implemented it will give an O(n) test that can check if the there is sure a triplet. If not, then we have to perform some other tests (still thinking).

EDIT: A direct conclusion from fibonacci idea is that for integer input (as specified in Q) there will exist a garanteed solution for any possible input if the size of array will be larger than log_GRf(MAX_INT), and this is 47 for 32 bits or 93 for 64 bits. Actually, we can use the largest value from the input array to define it better.

This gives us a following algorithm:

Step 1) Find MAX_VAL from input data :O(n)

Step 2) Compute the minimum array size that would guarantee the existence of the solution:
N_LIMIT = log_base_GRf(MAX_VAL) : O(1)

Step 3.1) if N > N_LIMIT : return true : O(1)

Step 3.2) else sort and use direct method O(n*log(n))

Because for large values of N (and it's the only case when the complexity matters) it is O(n) (or even O(1) in cases when N > log_base_GRf(MAX_INT)), we can say it's O(n).

like image 119
ruslik Avatar answered Sep 30 '22 19:09

ruslik