2011-02-01 2 views
-1

은 O (log n)에서 배열의 길이를 결정할 수있는 알고리즘을 설명합니다.배열의 길이를 결정하는 알고리즘

+0

어떤 가정이 있습니까? – jason

+2

질문이 너무 힘들어서 숙제하는 기분이 들게합니다. –

+0

배열의 길이는 O (1)에서 찾을 수 있습니다. 우리는 이것을 대답하기 위해 더 많은 배경이 필요합니다. – Olhovsky

답변

0

C를 감지 할 수 있습니다 것이 분명 댓글로 게시 된 조각을 기반으로

스타일 의사 코드 :

int lengthOfArray(p){ 
    int j = 1; 
    try{ 
     while(j < Integer.MaxValue){ 
      p[j]; // Might need to do something more with p[i] 
        // to test bound. 
      j *= 2; 
     } 
    }catch(ArrayIndexOutOfBounds e){ 
    } 
    j = searchArrayHelper(p, j/2, j); 

    try{ 
     while(1){ 
      // This loop is guaranteed to run O(log n) times or less. 
      p[j]; 
      j++; 
     } 
    }catch(ArrayIndexOutOfBounds e){ 
     j--; 
    } 

    return j; 
} 

int searchArrayHelper(p, int i, int j){ 
    try{ 
     p[j]; 
    } catch (ArrayIndexOutOfBounds e){ 
     int mid = (i + j)/2; 
     return searchArrayHelper(p, i, mid); 
    } 
    return i; 
} 
+0

두 번째 함수에서 _ArrayIndexOutOfBounds_를 트리거하지 않는 첫 번째 p [j]를 반환하는 것처럼 보이지만 p [j + 1]이 트리거 할 것이므로 j는 배열입니다 길이? –

+0

@ belisarius, 바로 거기에 작은 버그가있을 수 있습니다. 나는 빠른 수정을 게시 대답을 편집 할 수 있습니다. – Olhovsky

+0

더티 해킹처럼 느껴지더라도 수정했습니다. 다른 버그를 발견하면 알려주십시오. – Olhovsky

2

확인. 귀하의 질문은 다소 모호하지만 제가 위에 답변 한 의견을 게시하겠습니다.

ArrayIndexOutofBounds 오류가 발생할 때까지 i = 1, 2^1, 2^2, ... 2^m을 통해 단계를 밟습니다.

그런 다음 오류가 발생한 국경을 찾을 때까지 2^(m-1)과 2^m 사이의 이진 검색을하십시오. 그건 n이야.

이 (logn) O의

편집이 제안은 당신이 당신이 ArrayIndexOutofBounds

관련 문제