Skip to content

Latest commit

Β 

History

History
124 lines (98 loc) Β· 4.88 KB

Heap.md

File metadata and controls

124 lines (98 loc) Β· 4.88 KB

Heap

Priority Queue(μš°μ„ μˆœμœ„ 큐)

  • λ“€μ–΄κ°„ μˆœμ„œμ— 상관없이 μš°μ„ μˆœμœ„κ°€ 높은 데이터가 λ¨Όμ € λ‚˜μ˜€λŠ” 자료ꡬ쑰
  • queue에 μš°μ„ μˆœμœ„ κ°œλ…μ„ λ„μž…ν•œ 자료ꡬ쑰
  • μš°μ„ μˆœμœ„ νλŠ” Array, LinkedList, Heap으둜 κ΅¬ν˜„ κ°€λŠ₯ β†’ Heap으둜 κ΅¬ν˜„ν•˜λŠ”κ²Œ κ°€μž₯ 효율적
    • Array
      • μš°μ„ μˆœμœ„κ°€ 높은 μˆœμ„œλŒ€λ‘œ λ°°μ—΄μ˜ κ°€μž₯ μ•žλΆ€λΆ„λΆ€ν„° μ‚½μž… β†’ O(1)
      • μš°μ„ μˆœμœ„κ°€ 쀑간인 데이터λ₯Ό μ‚½μž…ν•˜λŠ” κ³Όμ •μ—μ„œ μœ„μΉ˜λ₯Ό νƒμƒ‰ν•˜κ³  ν•œμΉΈμ”© λ’€λ‘œ 밀어야함 β†’ O(N)
    • LinkedList
      • μš°μ„ μˆœμœ„κ°€ 높은 데이터λ₯Ό head에 μœ„μΉ˜ν•˜λ„λ‘ μ‚½μž… β†’ O(1)
      • μš°μ„ μˆœμœ„κ°€ 쀑간인 데이터λ₯Ό μ‚½μž…ν•˜λŠ” κ³Όμ •μ—μ„œ μœ„μΉ˜λ₯Ό 탐색해야 함 β†’ O(N)
    • Heap
      • 데이터 μ‚½μž…, μ‚­μ œ λͺ¨λ‘ β†’ O(log2N)

Heap

  • νž™μ€ μ™„μ „ 이진 트리의 일쒅이닀.
    • μ™„μ „ 이진 νŠΈλ¦¬λŠ” 쀑볡을 ν—ˆμš©ν•˜μ§€ μ•ŠμŒ, νž™μ€ 쀑볡을 ν—ˆμš©ν•¨
  • λͺ¨λ“  λ…Έλ“œμ˜ μš°μ„ μˆœμœ„(λ…Έλ“œμ˜ κ°’)은 μžμ‹ λ…Έλ“œμ˜ μš°μ„ μˆœμœ„λ³΄λ‹€ ν¬κ±°λ‚˜ κ°™λ‹€
    • μš°μ„ μˆœμœ„μ˜ λŒ€μ†Œκ΄€κ³„λŠ” λΆ€λͺ¨-μžμ‹ κ°„μ—λ§Œ 성립됨. ν˜•μ œκ°„μ—λŠ” μ„±λ¦½λ˜μ§€ μ•ŠμŒ
  • νž™μ˜ μ’…λ₯˜ : μ΅œλŒ€ νž™, μ΅œμ†Œ νž™
    • μ΅œλŒ€ νž™ : λ…Έλ“œμ˜ 값이 클수둝 μš°μ„ μˆœμœ„κ°€ λ†’λ‹€, λ£¨νŠΈλ…Έλ“œμ˜ 값이 κ°€μž₯ 크닀
    • μ΅œμ†Œ νž™ : λ…Έλ“œμ˜ 값이 μž‘μ„μˆ˜λ‘ μš°μ„ μˆœμœ„κ°€ λ†’λ‹€, λ£¨νŠΈλ…Έλ“œμ˜ 값이 κ°€μž₯ μž‘λ‹€
  • νž™μ˜ μ‚­μ œ κ³Όμ •
    1. 루트 λ…Έλ“œλ₯Ό μ‚­μ œ
    2. λ§ˆμ§€λ§‰ λ…Έλ“œλ₯Ό 루트 λ…Έλ“œλ‘œ 이동
    3. Heapify μ‹œμž‘ (λΆ€λͺ¨λ…Έλ“œμ™€ μžμ‹λ…Έλ“œ 쀑 큰 λ…Έλ“œμ™€ λŒ€μ†Œ 비ꡐ)
  • νž™μ˜ μ‚½μž… κ³Όμ •
    1. λ§ˆμ§€λ§‰ λ…Έλ“œμ— μ‚½μž…
    2. Heapify μ‹œμž‘ (λΆ€λͺ¨λ…Έλ“œμ™€ μžμ‹λ…Έλ“œμ˜ λŒ€μ†Œ 비ꡐ)
  • νž™ μžλ£Œκ΅¬μ‘°λŠ” λŒ€μ²΄μ μœΌλ‘œ λ°°μ—΄λ‘œ κ΅¬ν˜„λœλ‹€.
    • μ™„μ „ 이진 트리λ₯Ό 기본으둜 ν•˜κΈ° λ•Œλ¬Έμ— 빈 곡간이 μ—†μ–΄ λ°°μ—΄λ‘œ κ΅¬ν˜„ν•˜κΈ° μš©μ΄ν•¨
    • λ…Έλ“œ λ²ˆν˜Έκ°€ i인 경우
      • λΆ€λͺ¨ λ…Έλ“œ : arr[i // 2]
      • μ™Όμͺ½ μžμ‹ λ…Έλ“œ : arr[2 * i]
      • 였λ₯Έμͺ½ μžμ‹ λ…Έλ“œ : arr[2 * i + 1]
μ΅œλŒ€ νž™μ˜ μ‚½μž…, μ‚­μ œ κ³Όμ •

μ‚½μž… κ³Όμ • μ‚½μž… κ³Όμ •

μ‚­μ œ κ³Όμ • μ‚­μ œ κ³Όμ •

μ΅œμ†Œ νž™ κ΅¬ν˜„
public class minHeap{
        private ArrayList<Integer> heap;

        //μ΅œμ†Œνž™ μƒμ„±μž
        public minHeap() {
            heap = new ArrayList<Integer>();
            heap.add(0); // 0번째 μΈλ±μŠ€λŠ” μ‚¬μš© μ•ˆν•©
        }

        //μ‚½μž…
        public void insert(int val) {
            heap.add(val);
            int p = heap.size()-1;    //pλŠ” μƒˆλ‘œ μ‚½μž…ν•œ λ…Έλ“œμ˜ 인덱슀 정보
            while(p>1 && heap.get(p/2)>heap.get(p)) {
                //μƒˆλ‘œ μ‚½μž…ν•œ λ…Έλ“œμ˜ μœ„μΉ˜κ°€ 1 초과이고 λΆ€λͺ¨κ°€ μžμ‹λ³΄λ‹€ 크면 μ§„ν–‰ ->μƒˆλ‘œ μ‚½μž…ν•œ λ…Έλ“œμ˜ μœ„μΉ˜κ°€ λ£¨νŠΈκΉŒμ§€ κ°€κ±°λ‚˜ μƒˆλ‘œ μ‚½μž…ν•œ λ…Έλ“œκ°€ λΆ€λͺ¨λ³΄λ‹€ ν΄λ•ŒκΉŒμ§€ μ§„ν–‰
                int tmp = heap.get(p/2);//λΆ€λͺ¨ λ…Έλ“œμ˜ κ°’
                heap.set(p/2, val);
                heap.set(p, tmp);

                p /= 2;    //μƒˆλ‘œ μ‚½μž…ν•œ λ…Έλ“œκ°€ ν•œ 레벨 μƒμŠΉν–ˆμœΌλ‹ˆ 인덱슀 λΆ€λͺ¨ λ…Έλ“œ 인덱슀 κ°’μœΌλ‘œ λ³€κ²½
            }
        }
        //μ‚­μ œ
        public int delete() {
            //νž™ 이 λΉ„μ–΄μžˆμœΌλ©΄ 0리턴
            if(heap.size()-1 < 1) {
                return 0;
            }

            //μ‚­μ œν•  λ…Έλ“œ, 루트 λ…Έλ“œ
            int deleteitem = heap.get(1);

            //λ§ˆμ§€λ§‰ λ…Έλ“œλ₯Όroot에 μ‚½μž…ν•˜κ³  λ§ˆμ§€λ§‰ λ…Έλ“œ μ‚­μ œ
            heap.set(1,heap.get(heap.size()-1));
            heap.remove(heap.size()-1);

            int pos = 1; //λ£¨νŠΈμ— μƒˆλ‘œ μ‚½μž…ν•œ λ…Έλ“œμ˜ 인덱슀 정보

            //pos*2λŠ” μ™Όμͺ½μžμ‹μ˜ 인덱슀 κ°’, μžμ‹μ˜ 인덱슀 값이 νž™μ˜ μ‚¬μ΄μ¦ˆ 값보닀 ν¬λ‹€λŠ”κ²ƒμ€ 더이상 μ‚½μž…ν•  μœ„μΉ˜λ₯Ό λ²—μ–΄λ‚¬λ‹€λŠ”λœ» 
            while((pos*2)<heap.size()) {
                int min = heap.get(pos*2);//μ™Όμͺ½ μžμ‹μ˜ κ°’
                int minPos = pos*2;// μ™Όμͺ½ μžμ‹μ˜ 인덱슀 κ°’

                //였λ₯Έμͺ½ μžμ‹μ˜ μΈλ±μŠ€κ°€ μ‚¬μ΄μ¦ˆλ³΄λ‹€ μž‘κ³  μ™Όμͺ½ 보닀 더 μž‘μ„λ•Œ 였λ₯Έμͺ½ μžμ‹μ„ λΆ€λͺ¨μ™€ 바꿔쀄 μžμ‹μœΌλ‘œ μ§€μ •
                if(((pos*2+1)<heap.size()) && min > heap.get(pos*2+1)) {    
                    min = heap.get(pos*2 +1);
                    minPos = pos*2 +1;
                }

                //λΆ€λͺ¨κ°€ 더 μž‘μœΌλ©΄ 그만
                if(min > heap.get(pos))
                    break;

                //λΆ€λͺ¨ μžμ‹ κ΅ν™˜
                int tmp = heap.get(pos);
                heap.set(pos,heap.get(minPos));
                heap.set(minPos, tmp);
                pos = minPos;
            }

            return deleteitem;
        }

    }