2011-03-11 5 views
0

이것은 간단한 알고리즘 질문입니다.하지만 효율적이고 우아한 솔루션을 찾을 수없는 것 같습니다.배열 집합에서 가장 작은 데이터에 해당하는 인덱스를 확인하십시오.

우리는 해당 배열의 색인을 나타내는 3 개의 int (Aa, Ab, Ac) 및 3 개의 커서 (Ca, Cb, Cc) 배열을 가지고 있습니다. 가장 작은 값을 가리키는 커서를 식별하고 증가 시키려고합니다. 이 커서가 이미 배열 끝에 있으면 커서를 제외하고 두 번째로 작은 값을 가리키는 커서를 증가시킵니다. 배열의 끝 부분에 커서가 하나 밖에없는 경우이 커서가 증가합니다.

내가 올 수있는 유일한 해결책은 복잡하거나 최적이 아닙니다. 예를 들어, 나는 항상 거대한 if ... else로 끝납니다 ...

누구나이 문제에 대한 깔끔한 해결책을 볼 수 있습니까?

저는 C++로 프로그래밍하고 있지만 의사 코드 또는 원하는 언어로 자유롭게 토론 할 수 있습니다.

무엇이 솔루션에 대해 당신에게

+0

Aa [Ca] == Ab [Cb]> Ac [Cc]이고 Ca 또는 Cb가 해당 배열의 끝을 가리키지 않는다면 어떻게 될까요? Ca 또는 Cb를 증가합니까? – MarcoS

+0

그래프 문제가 아닌가요? Dijkstra 알고리즘은 최단 경로를 찾을 수 있습니까? – Bytemain

+0

여기에 세 개의 배열로부터 숫자의 스트림을 출력하는 것이 가장 낮은 순서로되어있는 경우 세 배열을 모두 큰 벡터에 넣고 std :: sort를 수행하면됩니다. – Patrick

답변

1

의사 자바 코드 :

int[] values = new int[3]; 
values[0] = aa[ca]; 
values[1] = ab[cb]; 
values[2] = ac[cc]; 
Arrays.sort(values); 

boolean done = false; 
for (int i = 0; i < 3 && !done; i++) { 
    if (values[i] == aa[ca] && ca + 1 < aa.length) { 
     ca++; 
     done = true; 
    } 
    else if (values[i] == ab[cb] && cb + 1 < ab.length) { 
     cb++; 
     done = true; 
    } 
    else if (cc + 1 < ac.length) { 
     cc++; 
     done = true; 
    } 
} 
if (!done) { 
    System.out.println("cannot increment any index"); 
    stop = true; 
} 

기본적으로 다음

  1. aa[ca], ab[cb]ac[cc]

  2. 정렬

    values

  3. 주사 values 증가 및 가능한 경우에 배열 values을 초기화 (즉, 아직받지 배열의 끝)에 해당하는 값 I 알

의 인덱스, 정렬)이 가장 O (N 엑스 N에 있지만 I은 3 개 요소의 배열을 정렬하고있다.

0

감사합니다

if (Ca != arraySize - 1) AND 
    ((Aa[Ca] == min(Aa[Ca], Ab[Cb], Ac[Cc]) OR 
    (Aa[Ca] == min(Aa[Ca], Ab[Cb]) And Cc == arraySize - 1) OR 
    (Aa[Ca] == min(Aa[Ca], Ac[Cc]) And Cb == arraySize - 1) OR 
    (Cc == arraySize - 1 And Cb == arraySize - 1)) 
{ 
    Ca++; 
} 
else if (Cb != arraySize - 1) AND 
     ((Ab[Cb] == min(Ab[Cb], Ac[Cc]) OR (Cc == arraySize - 1)) 
{ 
    Cb++; 
} 
else if (Cc != arraySize - 1) 
{ 
    Cc++; 
} 
0

의사 코드 : 편집 : 조금 그것을 정돈

class CursoredArray 
{ 
    int index; 
    std::vector<int> array; 

    int val() 
    { 
     return array[index]; 
    } 

    bool moveNext() 
    { 
     bool ret = true; 
     if(array.size() > index) 
      ++index; 
     else 
      ret = false; 
     return ret; 
    } 
}  

std::vector<CursoredArray> arrays; 
std::vector<int> order = { 0, 1, 2 };//have a default order to start with 

if(arrays[0].val() > arrays[1].val()) 
    std::swap(order[0], order [1]); 

if(arrays[2].val() < arrays[order[1]].val())//if the third is less than the largest of the others 
{ 
    std::swap(order[1], order [2]); 
    if(arrays[2].val() < arrays[order[0]].val())//if the third is less than the smallest of the others 
     std::swap(order[0], order [1]); 
} 
//else third pos of order is already correct 

bool end = true; 

for(i = 0; i < 3; ++i) 
{ 
    if(arrays[order[i]].MoveNext()) 
    { 
     end = false; 
     break; 
    } 
} 

if(end)//have gone through all the arrays 
관련 문제