문제

그래서 단순히 넣어,이것은 내가 무엇을 하려고:

나의 컬렉션 Range 체는 연속(비치와 함께 그들 사이에 공백),각각 포함 startend int,및 다른 오브젝트에 대한 참조 obj.이 범위는지의 고정 크기(첫 번째 수 1-49 을 두 번째 50-221,etc.).이 컬렉션 성장할 수 있는 아주 큽니다.

나는 희망을 찾을 수 있는 방법을 찾기 범위(또는 더 구체적으로 객체 참조)를 포함하는 번호가 부여하지 않고 반복을 통해 전체 컬렉션을 확인하는 각 범위를 보면 그것이 포함됩니다.이 검색이 될 것입니다을 자주 수행하도록 속도/성과는 열쇠입니다.

가 누구나 알고의 알고리즘/식 도움이 될 수 있는가?내가 쓰고 있습니다.I 할 수 있는 자세한 정보를 제공하는 경우,필요한 것 이라고 생각을 유지하려고 그것은 간단합니다.

감사합니다.

도움이 되었습니까?

해결책

은 경우 소리처럼 당신이 사용하고 싶 TreeMap, 는 열쇠는 하단의 범위 값입니다 Range 체입니다.

다음를 식별하는 올바른 범위,사용 floorEntry() 하는 방법이 매우 빠르게 가장 가까운(급) Range, 가 포함되어야 합니다 키,이렇게:

    TreeMap<Integer, Range> map = new TreeMap<>();
    map.put(1, new Range(1, 10));
    map.put(11, new Range(11, 30));
    map.put(31, new Range(31, 100));

    // int key = 0; // null
    // int key = 1; // Range [start=1, end=10]
    // int key = 11; // Range [start=11, end=30]
    // int key = 21; // Range [start=11, end=30]
    // int key = 31; // Range [start=31, end=100]
    // int key = 41; // Range [start=31, end=100]
    int key = 101; // Range [start=31, end=100]
    // etc.

    Range r = null;
    Map.Entry<Integer, Range> m = map.floorEntry(key);
    if (m != null) {
        r = m.getValue();
    }
    System.out.println(r);

이후 나는 항상 정렬에 의해 자연적인 순서의 밑바닥 범위,경계 모든 당신의 최악의 경 O(로그(n)).

를 추가할 것입니다 몇 가지 정신을 확인한 경우 키는 완전히 벗어났(예를 들면,그들은 키를 넘어지도의 끝,그것을 반환 마지막 Range 지도에서),이해 당신에게 아이디어를 제공하는 방법을 진행합니다.

다른 팁

정을 조회가 가장 중요성을 절약할 수 있 O(N)메모리고 약 O(N^2)전처리 시간,알고리즘이 될 것이다:

  • 을 소개하는 클래스 ObjectsInRange, 는 포함합니다:시작의 범위(int startOfRange 다)및 집합체(Set<Object> objects)
  • 소개 ArrayList<ObjectsInRange> oir, 가 포함됩니다 ObjectsInRange 에 의해 정렬 startOfRange
  • Range r, 이 있는지 확인 존재 ObjectsInRange (자 그들에게 전화 ab)등 a.startOfRange = r.startb.startOfRange = b.end.그 다음은 모든 ObjectsInRange xa, 까지(하지만 포함) b, 를 추가 r.objx.objects 설정

조회 후,다음과 같습니다:

  • integer x, 을 찾을 등 ioir[i].startOfRange <= xoir[i+1].startOfRange > x
  • 참고: i 에 발견될 수 있는 이분에 O(로그 N)시간!
  • 귀하의 개체 oir[i].objects

면 컬렉션가기 위해서는 다음을 구현할 수 있습 검색을 찾기 위해 올바른 범위에 O(로그(n))시간입니다.그것은 효율적으로 해싱에 대한 매우 큰 컬렉션이지만,적은 경우에는 1000 개 이상 또는 그 범위를,그것은 더 빠를 수 있습니다(때문에 그것은 간단합니다).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top