【 더미 】 A013LC_데이터 흐름 의 중위 수 (데이터 양의 패 리 티 분석 + 데이터 흐름 의 좌우 부분 으로 추상 화)

6440 단어
중위 수 는 서열 표 중간의 수 이다.목록 길이 가 짝수 라면, 중위 수 는 중간 두 수의 평균 값 이다.예컨대
[2, 3, 4] 의 중위 수 는 3 이다 [2, 3] 의 중위 수 는 (2 + 3) / 2 = 2.5 이다.
다음 두 가지 조작 을 지원 하 는 데이터 구 조 를 설계 합 니 다.
  • void addNum (int num) - 데이터 흐름 에서 하나의 정 수 를 데이터 구조 에 추가 합 니 다.
  • double findMedian () - 현재 모든 요소 의 중위 수 를 되 돌려 줍 니 다.
  • addNum(1)
    addNum(2)
    findMedian() -> 1.5
    addNum(3) 
    findMedian() -> 2
    

    진급: 만약 데이터 흐름 중의 모든 정수 가 0 에서 100 범위 내 에 있다 면 당신 은 어떻게 당신 의 알고리즘 을 최적화 할 것 입 니까?만약 데이터 흐름 중 99% 의 정수 가 0 에서 100 범위 내 에 있다 면 당신 은 어떻게 당신 의 알고리즘 을 최적화 할 것 입 니까?
    방법 1: 더미
    사고의 방향
    폭력 서열 만 생각 하고 다른 사람의 생각 을 참고 하 라. 데 이 터 를 두 부분 으로 나 누 면 중위 수 는 ( maxVal + minVal) / 2 이 고 그 다음은 데이터 흐름 의 수량 에 대한 패 리 티 를 토론 하 는 것 이다.
  • 홀수 일 때 max힙 혹은 minhep 에서 하나의 꼭대기 요 소 를 취 하 는 것 이 모두 답 이다.
  • 이것 도 maxheap.size() + min_heap. size () 가 짝수 일 때 데 이 터 를 어느 더미 에 두 어도 됩 니 다
  • 짝수 일 때 우리 가 취해 야 할 것 은 중위 수 이기 때문에 우 리 는 어 릴 때 부터 꼭대기 (즉 데이터 흐름 의 오른쪽 부분) 에서 요 소 를 꺼 낼 때 최대한 큰 것 을 취하 고 싶 습 니 다.그리고 큰 더미 (즉 데이터 흐름 의 왼쪽 부분) 에서 요 소 를 꺼 낼 때 되도록 작은 것 을 취하 기 때문에:
  • 작은 뿌리 퇴적 > 중위수 의 수, 큰 뿌리 퇴적 ≤ 중위수 의 수
  • max_haep.size = min_headp.size / min_headp. size + 1, 이렇게 데이터 가 홀수 로 흐 를 때 작은 루트 에서 중위 수
  • 를 팝 업 할 수 있 습 니 다.
    class MedianFinder {
         
        Queue<Integer> minQ, maxQ;
        int tot;
        public MedianFinder() {
         
            minQ=new PriorityQueue<>();
            maxQ=new PriorityQueue<>(Collections.reverseOrder());
        }
        
        public void addNum(int num) {
         
            maxQ.add(num);
            minQ.add(maxQ.poll());
            if (minQ.size() > maxQ.size()) {
         
                maxQ.add(minQ.poll());
            }
            tot++;
        }
        
        public double findMedian() {
         
            return (tot&1)==1 ?  maxQ.peek() : (minQ.peek()+maxQ.peek())*0.5;
        }
    }
    

    복잡 도 분석
  • Time: O ( l o g n ) O(logn) O(logn),
  • Space: O ( l o g n ) O(logn) O(logn)
  • 좋은 웹페이지 즐겨찾기