2016-06-04 2 views
1

у меня есть этот Algo и я хочу знать, если это возможно, чтобы сделать его лучше (меньше сложности):Как сделать лучший алгоритм с учетом этого кода?

for i = 3 to A.length 
    for j = 2 to i − 1 
    for k = 1 to j − 1 
     if |A[i] − A[j]| = = |A[j] − A[k]| or |A[i] − A[k]| = = |A[j] − A[k]| 
      return true 
return false 

Сложность должна быть O (N^3), и приговор после того, как «или» является просто A [я] = A [J]

Я не уверен, что может существовать лучший алгоритм ...

+3

Для чего этот алгоритм? Что оно делает? – EvilTak

+1

Вы пытаетесь определить, содержит ли массив тройку, состоящую из двух точек вместе со своей серединой? –

+0

Кроме того, ваше утверждение о том, что «предложение после» или «просто A [i] = A [j]» мало смысла, поскольку '| A [i] - A [k] | = = | A [j] - A [k] | 'не эквивалентен' A [i] == A [j] ' –

ответ

1

Вы могли бы свести к O(n^2) времени (но увеличение пространства сложности) путем хеширования отсчетов различий ,

1

Вы можете отсортировать массив заранее и использовать бинарный-поиск, чтобы сбить сложность времени от O (N^3) к O (N^2) LogN.

Псевдокод -

sort(A) 

for i = 1 to A.length - 2 
    for j = i + 1 to A.length - 1 
     //search for an element A[k] such that A[k]-A[j] == A[j]-A[i] 
     if binary_search(A, 2 * A[j] - A[i], j + 1, A.length) 
      return True 
return False 

binary_search(A, x, i, j) возвращает true если x присутствует в A между показателями i и j.

В отличие от другого решения, связанного с хешированием, вам не понадобится дополнительное пространство.

+0

@ Kittsil Нам интересны абсолютные значения, и если вы собираетесь сравнивать абсолютные различия , вы должны учитывать оба условия. Представьте себе, когда вам нужно найти x для | p - q | == | q - x |. –

+0

@ Китсил, ты прав. Я обновляю свой ответ. –

+0

@ Kittsil, к сожалению, я не видел предложения по редактированию. Если вы сделаете другое изменение с обновленными индексами, я с радостью приму его. –