는 방법을 범위에서 설정의 연속 범위에 대한 준수
-
20-12-2019 - |
문제
그래서 단순히 넣어,이것은 내가 무엇을 하려고:
나의 컬렉션 Range
체는 연속(비치와 함께 그들 사이에 공백),각각 포함 start
고 end
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
(자 그들에게 전화a
고b
)등a.startOfRange = r.start
고b.startOfRange = b.end
.그 다음은 모든ObjectsInRange x
사a
, 까지(하지만 포함)b
, 를 추가r.obj
그x.objects
설정
조회 후,다음과 같습니다:
- integer
x
, 을 찾을 등i
그oir[i].startOfRange <= x
고oir[i+1].startOfRange > x
- 참고:
i
에 발견될 수 있는 이분에 O(로그 N)시간! - 귀하의 개체
oir[i].objects
면 컬렉션가기 위해서는 다음을 구현할 수 있습 검색을 찾기 위해 올바른 범위에 O(로그(n))시간입니다.그것은 효율적으로 해싱에 대한 매우 큰 컬렉션이지만,적은 경우에는 1000 개 이상 또는 그 범위를,그것은 더 빠를 수 있습니다(때문에 그것은 간단합니다).