2016-06-04 4 views
1

나는이 너 한테이 있고 그것이 더 나은 (덜 복잡) 할 수 있다면 내가 알고 싶은 :이 코드가 주어질 때 더 나은 알고리즘을 만드는 방법은 무엇입니까?

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는 [I] = A [J]

나는 그것이 더 나은 알고리즘을 존재할 수 모르겠습니다 ...

+3

이 알고리즘은 무엇입니까? 그것은 무엇을합니까? – EvilTak

+1

배열에 중간 점과 함께 두 점으로 구성된 트리플이 포함되어 있는지 확인하려고합니까? –

+0

또한, 'A [i] - A [k] |'이후의 '문장'또는 'A [i] = A [j]'인 주장은 거의 이해가되지 않습니다. === A [j] - A [k] |'는 [A [i] == A [j]' –

답변

1

당신은 차이의 수를 해싱에 의해 O(n^2) 시간 (그러나 증가 공간의 복잡성)을 감소시킬 수있다 .

1

당신은 배열을 미리 정렬 O (N^2 logN)O (N^3)에서 시간 복잡도를 가지고 이진 검색을 사용할 수있다.

의사 코드 -

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) 복귀 truex 경우 인덱스 ijA 사이에 존재한다.

해싱이 포함 된 다른 솔루션과 달리 추가 공간이 필요하지 않습니다.

+0

과 같지 않습니다. @Kittsil 우리는 절대 값에 관심이 있습니다. 절대 차이를 비교하려고한다면 , 당신은 두 조건을 모두 고려해야합니다. | p - q |에 대해 x를 찾아야 할 때를 상상해보십시오. == | q - x |. –

+0

@Kittsil 네 말이 맞아. 나는 내 대답을 업데이트하고있다. –

+0

@Kittsil 불행히도, 나는 편집 제안을 보지 못했습니다. 업데이트 된 색인을 사용하여 다른 편집 작업을한다면 기꺼이 받아 들일 것입니다. –