2014-02-27 2 views
3

여러 개의 정렬 된 목록을 하나의 TreeSet으로 병합하려고합니다. 그런 다음이 TreeSet의 이진 검색 알고리즘을 적용하여 O (log n) 시간 복잡도의 요소를 검색하려고합니다.바이너리 검색을 사용하여 정렬 된 TreeSet에서 요소를 검색하는 방법은 무엇입니까?

아래 코드는 내 코드입니다 있는 내가 duplicacy을 피하기 위해 TreeSet로 내 방법 중 하나에 목록의 목록을 전달하고 결합하고 ... inputs 내부의 모든 목록이 분류되어 있습니다 - 모든

private TreeSet<Integer> tree = new TreeSet<Integer>(); 

public void mergeMultipleLists(final List<List<Integer>> inputs) { 
    tree = new TreeSet<Integer>(); 
    for (List<Integer> input : inputs) { 
     for(Integer ii : input) { 
      tree.add(ii); 
     } 
    } 
} 

public List<Integer> getItem(final Integer x) { 
    // extract elements from TreeSet in O(log n) 
} 
  • 첫째, 올바른 방법입니다 여러 개의 정렬 된 목록을 TreeSet으로 병합 하시겠습니까? TreeSet의 여러 정렬 된 목록을 효율적으로 병합하는 직접적인 방법이 있습니까?
  • 둘째, O (log n) 시간 복잡도에서 TreeSet의 요소를 어떻게 추출 할 수 있습니까? 요소가 TreeSet에있는 경우 x을 찾고 싶으면 거기에있는 경우 반환하고,없는 경우에는 TreeSet에서 다음으로 큰 값을 반환하고 싶습니다.

아니면 현재 다른 데이터 구조를 사용하고있는 것이 좋을까요?

업데이트 된 코드 : -

개인 TreeSet의 나무 = 새로운 TreeSet의(); 그것의에 의해

public SearchItem(final List<List<Integer>> inputs) { 
    tree = new TreeSet<Integer>(); 
    for (List<Integer> input : inputs) { 
     tree.addAll(input); 
    } 
} 

public Integer getItem(final Integer x) { 
    if(tree.contains(x)) { 
     return x; 
    } else { 
     // now how do I extract next largest 
     // element from it if x is not present 
    } 
} 
+0

각 요소를 개별적으로 추가하는 대신'TreeSet.addAll()'을 사용할 수 있습니다. 그것은 몇 가지 LOC를 구할 것이지만 그것이 더 이상 성능이 있는지 나는 모른다. –

+0

@MikeB :'addAll'에 대한 팁 주셔서 감사합니다 .. 나는 그것을 완전히 잊어 버렸습니다. 그리고 이제 제 두 번째 질문에 관해서 .. 어떤 생각을하고 있습니까? –

+0

여기의 토론과 관련있는 것 같습니다 : http://stackoverflow.com/questions/3390449/computational-complexity-of-treeset-operations-in-java – JLewkovich

답변

3

TreeSet을 할 수는 TreeMap 특히, NavigableMap에 의해 백업됩니다.TreeSet에 을 호출하면 이진 검색 구현 인 TreeMap.containsKey()에 대한 대리자가됩니다.

TreeSet.contains()을 사용하여 개체가 집합에 포함되어 있는지 확인할 수 있지만 먼저 개체를 가져야합니다. 객체를 검색하여 검색 할 수있게하려면 Map 구현이 더 좋습니다.

+0

Thanks Mike .. 나는 최신 코드로 질문을 업데이트했다. 이전에 나는 오해했다. 그러나 당신의 제안 후에, 몇 가지 것들이 정리되었다. 그러나 나는 나의 else 문장에 의심의 여지가있다 .. 내 코드를 보아라. –

+0

'TreeSet'에서'higher()'메쏘드일까요? 나는 그것을 사용한 적이 없지만 당신이 원하는 것처럼 보입니다. 나중에 참조 할 수 있도록 javadoc을 먼저 살펴보고 대답이 있는지 확인하십시오. http://docs.oracle.com/javase/7/docs/api/java/util/TreeSet.html –

+0

binarysearch imp? TreeMap에서'Entry getEntry'를 보시면 저에게 위치 기반의 '링크 된'기반 검색처럼 보입니다. – JBoy

0

TreeSet의가, 자연 가 정렬 된이을 설정하고

기본적으로 백업하는 것 같은 트리 맵을 통해 빨간색 트리 - 블랙 트리을 사용하는 것입니다 : TreeSet.add (E)를 -> 트리 맵 .put (E, NULL);

이미 바이너리이므로 정렬 된 트리 구조로 'get'또는 'contains'가 있으면 O (log n) 연산이 수행됩니다.

귀하의 코드와 질문은 일치하지 않지만 정렬됩니다.

List<List<Integer>>을 병합하고 모두 고유 한 요소를 얻으려면 모두 입력해야합니다 (또는 적어도이 코드가 수행하는 것입니다).

그러나 다음 다음 방법은 위의 코드

그래서에서 달성하지 않습니다 "이 정수 주어, 나에게 List<Integer>을주고"말한다, 저를 위해 여러분의 질문에 답할 수 있도록 :

  1. 물론/예 Y
  2. 번호 당신은 당신이 Set.contains (e)를 할 수 있다면 다음 요소를 가지고 무엇을
를 추출 할 필요가 없다 (당신이 디자인에 의해 추출 할 수 없습니다) 세트 오해

당신이 "설정 추출"그런 짓을해야하는 경우 다음 트리 맵을 사용하거나 목록에 다시 세트를 켜고 myList.get(Collections.binarySearch(myElement));

관련 문제