자바 에서 Priority Queue 는 최소 더미 와 최대 더미 의 용법 을 실현 합 니 다.
5285 단어 JavaPriorityQueue최소 더미최대 더미
1.소개
많은 알고리즘 지식 을 배우 고 최선 을 다 하 는 학습 과정 에서 Priority Queue(우선 대기 열)를 만 날 때 가 많 습 니 다.우선 순위 더 미 를 기반 으로 한 무한 우선 순위 대기 열우선 순위 대기 열의 요 소 는 자연 순서에 따라 정렬 하거나 구조 대기 열 에서 제공 하 는 Comparator 에 따라 정렬 하 며 구체 적 으로 사용 하 는 구조 방법 에 달 려 있다.우선 순위 대기 열 에 서 는 null 요 소 를 사용 할 수 없습니다.자연 순서에 의존 하 는 우선 순위 대기 열 은 비교 할 수 없 는 대상 을 삽입 할 수 없습니다.이렇게 하면 ClassCastException 을 초래 할 수 있 습 니 다.
이 대기 열의 머리 는 지정 한 정렬 방식 에 따라 최소 요소 입 니 다.만약 여러 원소 가 모두 최소 치 라면 머리 는 그 중의 한 원소 인 선택 방법 은 임의의 것 이다.대기 열 에서 작업 poll,remove,peek,element 가 대기 열 헤더 에 있 는 요 소 를 가 져 옵 니 다.우선 순위 대기 열 은 무한 하지만 내부 용량 이 있어 대기 열 요 소 를 저장 하 는 배열 크기 를 제어 합 니 다.그것 은 보통 적어도 대열 의 크기 와 같다.우선 순위 대기 열 에 요 소 를 계속 추가 하면 서 용량 이 자동 으로 증가 합 니 다.용량 증가 정책 의 세부 사항 을 지정 할 필요 가 없습니다.
이러한 교체 기 는 Collection 과 Iterator 인터페이스의 모든 선택 방법 을 실현 합 니 다.방법 iterator()에서 제공 하 는 교체 기 는 우선 순위 대기 열 에 있 는 요 소 를 특정한 순서 로 옮 겨 다 니 는 것 을 보장 하지 않 습 니 다.순서대로 옮 겨 다 닐 필요 가 있다 면 Arrays.sort(pq.toArray()를 사용 하 는 것 을 고려 하 십시오.이 구현 은 동기 화 되 지 않 습 니 다.여러 스 레 드 의 임의의 스 레 드 가 대기 열 을 수정 하면 이 스 레 드 는 Priority Queue 인 스 턴 스 를 동시에 방문 해 서 는 안 됩 니 다.반면 스 레 드 가 안전 한 Priority BlockingQueue 류 를 사용 하 십시오.
Priority Queue 는 우선 대기 열 로 번역 되 었 습 니 다.'우선'은 요소 가 대기 열 에 일정한 순서(우선 순위)로 저장 되 는 것 을 말 합 니 다.'대기 열'은 선진 적 인 데이터 구 조 를 말 합 니 다.따라서 Priority Queue 는 일정한 우선 순위 에 따라 요 소 를 액세스 할 수 있 습 니 다.
2.용법
소스 코드 로 볼 때 Priority Queue 의 구조 방법:
// 11
private static final int DEFAULT_INITIAL_CAPACITY = 11;
//1、 ,
public PriorityQueue() {
this(DEFAULT_INITIAL_CAPACITY, null);
}
//2、
public PriorityQueue(int initialCapacity) {
this(initialCapacity, null);
}
//3、
public PriorityQueue(Comparator<? super E> comparator) {
this(DEFAULT_INITIAL_CAPACITY, comparator);
}
//4、
public PriorityQueue(int initialCapacity,
Comparator<? super E> comparator) {
// Note: This restriction of at least one is not actually needed,
// but continues for 1.5 compatibility
if (initialCapacity < 1)
throw new IllegalArgumentException();
this.queue = new Object[initialCapacity];
this.comparator = comparator;
}
위 에서 알 수 있 듯 이 Priority Queue 를 구성 할 때 초기 용량 과 요소 가 대기 열 에 있 는 정렬 방법 을 지정 할 수 있 습 니 다.지정 하지 않 으 면 기본 초기 용량 은 11 이 고 기본 정렬 방법 은 요 소 를 작은 것 에서 큰 것 으로 정렬 하 는 것 입 니 다.3.최소 더미
구조 최소 더미:
PriorityQueue<Integer> minheap = new PriorityQueue<>();
무 참 구 조 를 사용 합 니 다.요 소 는 대기 열 에서 기본적으로 작은 순서 로 배열 되 어 있 으 며,매번 대기 열 에서 나 오 는 요 소 를 대기 열 에서 가장 작은 요소 로 보장 할 수 있 습 니 다.4.최대 더미
PriorityQueue<Integer> maxheap = new PriorityQueue<>(Collections.reverseOrder());
정렬 방법 을 역순 으로 지정 합 니 다.즉,요 소 를 큰 것 에서 작은 것 으로 배열 하면 매번 대기 열 에 나 오 는 요 소 를 대기 열 에서 가장 큰 요소 로 보장 할 수 있 습 니 다.5,기타 우선 순위
다른 우선 순위 규칙 에 따라 정렬 하려 면 Comparable 인 터 페 이 스 를 실현 하고 compare To()방법 을 다시 써 야 합 니 다.
Comparable<Integer> comparable = new Comparable<Integer>() {
@Override
public int compareTo(Integer o) {
return 0;
}
};
상용 방법Integer 형식 을 예 로 들 면:
3.관련 연습 문제
【 검지 Offer 40.최소 k 개수 】
정수 배열 arr 를 입력 하여 가장 작은 k 개 수 를 찾 아 보 세 요.예 를 들 어 4,5,1,6,2,7,3,8 이라는 8 개의 숫자 를 입력 하면 가장 작은 4 개의 숫자 는 1,2,3,4 이다.
예시 1:
입력:arr=[3,2,1],k=2
출력:[1,2]또는[2,1]
예시 2:
입력:arr=[0,1,2,1],k=1
출력:[0]
제한:
0 <= k <= arr.length <= 10000
0 <= arr[i] <= 10000
[문제 풀이 사상]
먼저 k 개 수 를 최대 더미 에 넣 은 다음 에 k+1 개 수 를 비교 합 니 다.만약 에 큰 지붕 보다 작 으 면 더 미 를 넣 고 더 미 를 쌓 아 대열 을 만 들 고 더 크 면 아무것도 하지 않 습 니 다.
【코드】
class Solution {
public int[] getLeastNumbers(int[] arr, int k) {
int res[] = new int[k];
int len = arr.length;
if(len == 0 || k == 0)
return res;
PriorityQueue<Integer> maxHeap = new PriorityQueue<>(Collections.reverseOrder());
for(int i = 0; i < k; i++){
maxHeap.add(arr[i]);
}
for(int i = k; i < len; i++){
if(arr[i] < maxHeap.peek()){
maxHeap.add(arr[i]);
maxHeap.poll();
}
}
for(int i = 0; i < k; i++){
res[i] = maxHeap.poll();
}
return res;
}
}
시간 복잡 도:O(nlogn)자바 에서 Priority Queue 가 최소 더미 와 최대 무 더 기 를 실현 하 는 용법 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 자바 Priority Queue 에 관 한 최소 최대 무 더 기 는 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 저 희 를 많이 사랑 해 주세요!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.