2013-02-08 2 views
0

분리 세트를 사용하여 Kruskal 알고리즘의 구현을 작성하려고합니다. 나는 그것이 거의 작동한다고 생각하지만 코드 조각을 올바르게 작동시키는 것처럼 보이지 않습니다. 코드는 그래프의 노드가 추가하려고하는 집합에 이미 있는지 확인해야합니다. 그렇지 않으면 추가하지 않으려 고합니다. 다음은 내가 사용하고있는 코드입니다 :분리 세트 문제

public static boolean difSets(int index1, int index2, ArrayList<Node> sets[], Node nodes[]) 
{ 
    int setnum1 = 0; 
    int setnum2 = 0; 
    for(int i = 0; i < nodes.length; i++) 
    { 
     for(int j = 0; j < sets[i].size(); j++) 
     { 
      if(nodes[index1].getX() == sets[i].get(j).getX() && nodes[index1].getY() == sets[i].get(j).getY()); 
       setnum1 = i; 
      if(nodes[index2].getX() == sets[i].get(j).getX() && nodes[index2].getY() == sets[i].get(j).getY()); 
       setnum2 = i; 
     } 
    } 
    if(setnum1 == setnum2) 
     return false; 
    else 
     return true; 
} 

약간의 정보 :이 방법은 두 노드가 이미 동일한 세트에 있는지 여부를 결정합니다. 노드 배열은 그래프의 모든 점을 포함합니다 (Node는 x 및 y 값을 저장하고 검색 할 수있는 클래스입니다 .Set은 노드의 ArrayLists 배열입니다.) 문제가 시작될 때 모든 노드는 ArrayList 자체는 결국 모두 동일한 ArrayList에 있어야합니다. 인덱스 1과 2는 노드 배열의 노드에 해당합니다.

불행히도이 코드는 나에게 올바른 결과를 제공하지 않는 것 같습니다. 한 시간 동안 그것을 쳐다 봤는데 나는 문제가 무엇인지 알아낼 수 없습니다, 그래서 여기 누군가가 나를 도울 수있는 기대했다.

사전에 감사합니다.

+0

아마도이 코드를 사용하여 리팩터링하여 http://docs.oracle.com/javase/6/docs/api/java/util/Set.html – Luis

+0

코드에서 사용할 수 있습니다. nodes 배열은 항상 sets 배열 중 하나와 같습니다. 병합 세트를 시작하면 어떻게됩니까? 배열의 크기를 줄이지 않아야합니까? – Bogdan

+0

방금 ​​공간을 줄이기보다는 공간에 null 세트를 남겼습니다. 순환은 .size()가 0을 반환했기 때문에 무시했다. 되돌아 보면 이것은 아마도 분리 된 집합을 복잡하게 구현하는 방법이었을 것이다. – gmaster

답변

0

그것을 해결. 하나 자바에서 많은 것들을 sim 플라이는 나에게 이해가 가지 않는다.

public static boolean difSets(int index1, int index2, ArrayList<Node> sets[], Node nodes[]) 
{ 
    int setnum1 = 0; 
    int setnum2 = 0; 
    int x1 = nodes[index1].getX(); 
    int y1 = nodes[index1].getY(); 
    int x2 = nodes[index2].getX(); 
    int y2 = nodes[index2].getY(); 
    for(int i = 0; i < nodes.length; i++) 
    { 
     for(int j = 0; j < sets[i].size(); j++) 
     { 
      int x3 = sets[i].get(j).getX(); 
      int y3 = sets[i].get(j).getY(); 
      if(x1 == x3 && y1 == y3) 
       setnum1 = i; 
      if(x2 == x3 && y2 == y3) 
       setnum2 = i; 
     } 
    } 
    if(setnum1 == setnum2) 
     return false; 
    else 
     return true; 
} 

실제로 이전과 정확히 동일해야합니다. 그럼에도 불구하고 ...

+0

'Node' 클래스가 어떻게 생겼는지 모르겠지만'getX()'와'getY()'는'Integer'를 리턴합니다. 이 경우, 9 행과 11 행의'=='는 값의 동일성보다는 참조 평등을 테스트합니다. 이 경우, 대신에 equals 메소드를 사용하거나,이 솔루션에서와 같이, 각각의 비교에서 적어도 하나의 값을'int'에 언 박싱 할 수 있습니다. – Jakob