무더기. - 무더기.

25277 단어
두 갈래 나무의 저장 구조: 두 갈래 나무 구조를 수조로 저장하고 두 갈래 나무를 층차적으로 훑어보는 방식으로 수조에 넣는다.일반적으로 완전 두 갈래 나무만 표시하기에 적합하다. 왜냐하면 비완전 두 갈래 나무는 공간의 낭비가 있기 때문이다.이런 방식의 주요 용법은 바로 무더기의 표시이다.아래 표의 관계가 이미 알고 있는 양친(parent)의 아래 표는: 왼쪽 아이(left) 아래 표=2*parent+1;오른쪽 아이(right) 아래 표시 = 2 * parent + 2;이미 알고 있는 아이(좌우를 구분하지 않음)(child)는 아래에 표시하고, 양친(parent)은 아래에 표시하는 = (child-1)/2;하나의 개념을 쌓다
  • 더미는 논리적으로 완전한 두 갈래 나무이다
  • 더미는 물리적으로 수조에 저장된다
  • 임의의 결점을 만족시키는 값은 모두 그 자수에 있는 결점의 값보다 크다. 이를 무더기, 또는 큰 뿌리, 또는 무더기라고 한다
  • 반대로, 작은 무더기, 또는 작은 무더기
  • 더미의 기본적인 역할은 집합 중의 최치를 신속하게 찾는 것이다

  • 우리는 한 무더기를 지었다. 왜냐하면 우리는 수조로 이루어졌기 때문이다. 우리는 먼저 그것의 속성을 보완할 것이다
    import java.util.Arrays;
    
    public class TestHeap {
        public int[] elem;
        public int usedSize;
    
        public TestHeap() {
            this.elem = new int[20];
            this.usedSize = 0;
        }
    

    우리가 지금 해야 할 첫 번째 단계는 우리의 수조를 이용하여 무더기를 건설하는 것이다
        public void adjustDown(int root, int len) {
            // 
            int parent = root;
            int child = 2 * parent + 1;
            while (child < len) {
                if (child + 1 < len && elem[child] < elem[child + 1]) {
                    child = child + 1;
    
                }
                if (elem[child] > elem[parent]) {
                    int tmp = elem[child];
                    elem[child] = elem[parent];
                    elem[parent] = tmp;
                    parent = child;
                    child = 2 * parent + 1;
                } else {
                    break;
                }
            }
        }
    
        public void createHeap(int[] array) {
            for (int i = 0; i < array.length; i++) {
                this.elem[i] = array[i];
                this.usedSize++;
            }
            for (int i = (this.usedSize - 1 - 1) / 2; i >= 0; i--) {
                //    
                adjustDown(i, this.usedSize);
            }
        }
    

    지금 무더기가 이미 건설되었는데, 우리는 지금 삽입val을 진행합니다
        public void adjustUp(int child) {
            //   
            while (child > 0) {
                int parent = (child - 1) / 2;
                if (this.elem[child] > this.elem[parent]) {
                    int tmp = this.elem[child];
                    this.elem[child] = this.elem[parent];
                    this.elem[parent] = tmp;
                    child = parent;
                    parent = (child - 1) / 2;
    
                } else {
                    break;
                }
            }
        }
        public boolean isFull(){
            return this.usedSize==this.elem.length;
        }
        public void pushHeap(int val){
            // 
            if (isFull()){
                // 
                this.elem=Arrays.copyOf(this.elem, this.elem.length*2);
            }
            this.elem[usedSize]=val;
            this.usedSize++;
            // 
            adjustUp(this.usedSize-1);
        }
    

    저희가 지금 저희 최대치 팝을 나가도록 하겠습니다.
    public boolean isEmpty(){
            return this.usedSize==0;
        }
        public void popHeap(){
            // 
            if (isEmpty()){
                return;
            }
            int tmp=this.elem[0];
            this.elem[0]=this.elem[this.usedSize-1];
            this.elem[this.usedSize-1]=tmp;
            this.usedSize--;
            // 
            adjustDown(0, this.usedSize);
        }
    

    현재 최대값 가져오기 작업
     public int getPop(){
            // 
            if (isEmpty()){
                return -1;
            }else {
                return this.elem[0];
            }
        }
    

    이 조작을 완성하려면 우리는 인쇄된 함수를 써서 그들의 값을 인쇄해야 한다
    public void display(){
            for (int i = 0; i <this.usedSize ; i++) {
                System.out.print(this.elem[i]+" ");
            }
            System.out.println();
        }
    

    우리main 함수 제공
    public class TestDemo {
        public static void main(String[] args) {
            int []array={13,8,2,7,10,9,11,15,12,6};
            TestHeap testHeap=new TestHeap();
            testHeap.createHeap(array);
            testHeap.display();
            testHeap.pushHeap(14);
            testHeap.display();
            testHeap.popHeap();
            testHeap.display();
            int c=testHeap.getPop();
            System.out.println(c);
        }
    }
    
    

    좋은 웹페이지 즐겨찾기