๊ด€๋ฆฌ ๋ฉ”๋‰ด

Daehyunii's Dev-blog

18 ์ด์ง„ ํž™ ๋ณธ๋ฌธ

๐Ÿ“š Language & CS knowledge/Algorithm & Data structure

18 ์ด์ง„ ํž™

Daehyunii 2022. 8. 16. 20:17

18.1 ์ด์ง„ ํž™

  ์ด์ง„ ํž™์€ ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํŠธ๋ฆฌ์˜ ํ•œ ์ข…๋ฅ˜์ด๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ํŠธ๋ฆฌ์— ์ ์šฉ๋˜๋Š” ๊ทœ์น™๋“ค์ด ๋‹ค ๋™์ผํ•˜๊ฒŒ ์ ์šฉ๋˜์ง€๋งŒ ์ถ”๊ฐ€์ ์œผ๋กœ ์ ์šฉ๋˜๋Š” ๊ทœ์น™๋“ค์ด ์žˆ๋‹ค. ํž™์—๋„ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ข…๋ฅ˜๊ฐ€ ์žˆ์ง€๋งŒ ์ง€๊ธˆ ์•Œ์•„ ๋ณผ ๋‚ด์šฉ์€ ํž™์˜ ํ•œ ์ข…๋ฅ˜์ธ ์ด์ง„ ํž™์ด๋‹ค. ์ด์ง„ ํž™์€ ๋‹ค์‹œ ์ตœ์†Œ ํž™๊ณผ, ์ตœ๋Œ€ ํž™์œผ๋กœ ๊ตฌ๋ถ„๋œ๋‹ค. 

 

  ์ตœ๋Œ€ ์ด์ง„ ํž™์—์„œ๋Š” ๋ถ€๋ชจ ๋…ธ๋“œ๊ฐ€ ํ•ญ์ƒ ์ž์‹ ๋…ธ๋“œ๋ณด๋‹ค ํฐ ๊ฐ’์„ ๊ฐ€์ง„๋‹ค. ์ž์‹ ๋…ธ๋“œ๋กœ ์ €์žฅ๋˜๋Š” ์™ผ์ชฝ/์˜ค๋ฅธ์ชฝ์˜ ์ˆœ์„œ๋Š” ์ƒ๊ด€์—†์ด ํ•œ ๋ ˆ๋ฒจ ์•„๋ž˜์— ์žˆ๋Š” ์ฆ‰, ์ž์‹ ๋…ธ๋“œ๋ณด๋‹ค๋Š” ํ•ญ์ƒ ๋ถ€๋ชจ ๋…ธ๋“œ๊ฐ€ ํฌ๋‹ค.(์˜ค๋ฅธ์ชฝ/์™ผ์ชฝ ์ˆœ์„œ๋Š” ์ค‘์š”ํ•˜์ง€ ์•Š๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ๋•Œ ์™ผ์ชฝ๋ถ€ํ„ฐ ๊ฐ’์ด ์ €์žฅ๋œ๋‹ค.)

 

  ์ตœ์†Œ ์ด์ง„ ํž™์€ ์ตœ๋Œ€ ์ด์ง„ ํž™๊ณผ ๋ฐ˜๋Œ€๋กœ ๋ถ€๋ชจ ๋…ธ๋“œ๋Š” ํ•ญ์ƒ ์ž์‹ ๋…ธ๋“œ๋ณด๋‹ค ์ž‘์€ ๊ฐ’์„ ๊ฐ€์ง„๋‹ค. ์ž์‹ ๋…ธ๋“œ๋กœ ์ €์žฅ๋˜๋Š” ์™ผ์ชฝ/์˜ค๋ฅธ์ชฝ์˜ ์ˆœ์„œ๋Š” ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ค‘์š”ํ•˜์ง€ ์•Š๋‹ค.

 

  ์ด์ง„ ํž™์€ ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊ฐ ๋…ธ๋“œ๋Š” ์–ธ์ œ๋‚˜ ์ตœ๋Œ€ ๋‘ ๊ฐœ์˜ ์ž์‹ ๋…ธ๋“œ๋ฅผ ๊ฐ–๋Š”๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด์ง„ ํž™์€ ์–ธ์ œ๋‚˜ ์ตœ์ ์˜ ์šฉ๋Ÿ‰์„ ๊ฐ–๋Š”๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ถ€๋ชจ ๋…ธ๋“œ์˜ ์ž์‹ ๋…ธ๋“œ๊ฐ€ ์—ฐ๊ฒฐ ๋  ๋•Œ์—๋Š” ์–ธ์ œ๋‚˜ ์™ผ์ชฝ ์ž์‹์ด ๋จผ์ € ์ฑ„์›Œ์ง„๋‹ค. ์ฆ‰, ์‹œ๋นŒ๋ง ๊ด€๊ณ„์— ์žˆ๋Š” ๋…ธ๋“œ๋“ค ์‚ฌ์ด์—์„œ๋Š” ํŠน๋ณ„ํ•œ ์ˆœ์„œ๊ฐ€ ์—†๋‹ค.

 

18.2 ํž™ ์ •๋ ฌ

  ์ด์ง„ ํž™์˜ ๊ตฌํ˜„์€ ๋ณดํ†ต ๋ฐฐ์—ด์˜ ์š”์†Œ๋“ค์„ ํŠธ๋ฆฌ ๊ตฌ์กฐ์— ๋งž๊ฒŒ ์œ„์น˜์‹œ์ผœ ๊ตฌํ˜„ํ•˜๊ฒŒ ๋œ๋‹ค. 

/* ์ตœ๋Œ€ ์ด์ง„ ํž™์˜ ๊ตฌ์„ฑ
๋ถ€๋ชจ ๋…ธ๋“œ๋Š” ํ•ญ์ƒ ์ž์‹ ๋…ธ๋“œ ๋ณด๋‹ค ์ปค์•ผํ•œ๋‹ค
ํ˜•์ œ ๋…ธ๋“œ๋“ค ์‚ฌ์ด์˜ ์ˆœ์„œ๋Š” ์ƒ๊ด€ ์—†๋‹ค

[15, 10, 8, 9, 7, 2, 3]

        15
      /    \
    10      8
   /   \   /  \  
  9    7  2    3
  
  
*/

  ์œ„์˜ ์ตœ๋Œ€ ์ด์ง„ ํž™์„ ์˜ˆ์‹œ๋ฅผ ๋ดค์„๋•Œ ๋ถ€๋ชจ ๋…ธ๋“œ์™€ ์ž์‹ ๋…ธ๋“œ์™€์˜ ์œ„์น˜ ๊ด€๊ณ„์—๋Š” ์ˆ˜ํ•™์  ๊ทœ์น™์ด ์กด์žฌํ•œ๋‹ค.

- ์ž์‹ ๋…ธ๋“œ ์ธ๋ฑ์Šค = 2n + 1(์™ผ์ชฝ ์ž์‹), 2n + 2(์˜ค๋ฅธ์ชฝ ์ž์‹)  //  (n = ๋ถ€๋ชจ ๋…ธ๋“œ์˜ ์ธ๋ฑ์Šค ๋ฒˆํ˜ธ)

- ๋ถ€๋ชจ ๋…ธ๋“œ ์ธ๋ฑ์Šค =  Math.floor((n - 1) / 2)  //  (n = ์ž์‹ ๋…ธ๋“œ์˜ ์ธ๋ฑ์Šค ๋ฒˆํ˜ธ)

 ์œ„์˜ ์ˆ˜ํ•™ ๊ณต์‹์„ ์ด์šฉํ•˜์—ฌ ๋ฐฐ์—ด์— ๋ฐ์ดํ„ฐ๋ฅผ ์ •๋ ฌํ•˜๊ณ  ์ด๋ฅผ ํ†ตํ•ด ์ด์ง„ ํž™ ์ž๋ฃŒ ๊ตฌ์กฐ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

18.3 ์ด์ง„ ํž™ ํด๋ž˜์Šค 

  ์ด์ง„ ํž™์„ ๊ตฌํ˜„ํ•˜๋Š” ์ดˆ๊ธฐ ์„ค์ •์ด ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ์™€๋Š” ๋‹ค๋ฅด๋‹ค. ์ด์ง„ ํž™ ์—์„œ๋Š” ๋…ธ๋“œ ์ธ์Šคํ„ด์Šค๋ฅผ ๋”ฐ๋กœ ์ƒ์„ฑํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. ์ด์ง„ ํž™ ๊ตฌํ˜„ ์ž์ฒด๋ฅผ ๋ฐฐ์—ด์„ ํ†ตํ•ด์„œ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ฆ‰ ํ•„์š”ํ•œ ๊ฒƒ์€ ๋น„์–ด ์žˆ๋Š” ๋ฐฐ์—ด ํ•˜๋‚˜๋กœ ์ดˆ๊ธฐ ์„ค์ •์„ ๋งˆ์นœ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์• ์ดˆ์— ์™ผ์ชฝ๋ถ€ํ„ฐ ์ž์‹ ๋…ธ๋“œ๊ฐ€ ์ฑ„์›Œ์ง€๋Š” ๊ฒƒ์ด๋‹ค. ๊ฒฐ๊ตญ ๋นˆ ๋ฐฐ์—ด์— ์ด์ง„ ํž™ ๊ตฌ์กฐ์— ๋งž๊ฒŒ ๋ฐฐ์—ด์„ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ์ด๋‹ค.

// ์ตœ๋Œ€ ์ด์ง„ ํž™์„ ๊ธฐ์ค€์œผ๋กœ ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„
class MaxBinaryHeap {
    constructor(){
        this.values = [];
    }
}

18.4 Insert ๋ฉ”์„œ๋“œ

  insert ๋ฉ”์„œ๋“œ๋Š” ์ด์ง„ ํž™ ์ž๋ฃŒ ๊ตฌ์กฐ์— ๊ฐ’์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ฆ‰, ๋ฐฐ์—ด์— ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์ด๋ฅผ ์ด์ง„ ํž™ ๊ตฌ์กฐ์— ๋งž๊ฒŒ ์ •ํ•ด์ง„ ์œ„์น˜๋กœ ์ •๋ ฌ์‹œํ‚ค๋Š” ๊ฒƒ์ด๋‹ค. ์ •๋ ฌ์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์šฐ์„  ์ถ”๊ฐ€ ํ•˜๊ณ ์ž ํ•˜๋Š” ์š”์†Œ๋ฅผ ๋ฐฐ์—ด์˜ ๋งจ ๋’ค์— push()๋ฅผ ํ™œ์šฉํ•ด์„œ ์ถ”๊ฐ€ํ•˜๊ณ  ์ƒˆ๋กญ๊ฒŒ ์ถ”๊ฐ€ ๋œ ๋…ธ๋“œ๊ฐ€ ํ˜„์žฌ ์„ค์ •๋˜์–ด ์žˆ๋Š” ๋ถ€๋ชจ ๋…ธ๋“œ๋ณด๋‹ค ๊ฐ’์ด ํฌ๋‹ค๋ฉด ๋ถ€๋ชจ ๋…ธ๋“œ์™€ ์ƒˆ๋กญ๊ฒŒ ์ถ”๊ฐ€๋œ ๋…ธ๋“œ์˜ ์ž๋ฆฌ๋ฅผ ๋ฐ”๊ฟ”์ค€๋‹ค. ์ด๋ฅผ ๋ฐ˜๋ณตํ•˜์—ฌ ์ •๋ ฌ์„ ์‹œ์ผœ์ค€๋‹ค. ์ด๊ฒŒ ๊ฐ€๋Šฅํ•œ ์ด์œ ๋Š” ๋ฃจํŠธ ๋…ธ๋“œ๋Š” ํ•ญ์ƒ ์ด์ง„ ํž™ ์ž๋ฃŒ ๊ตฌ์กฐ ๋‚ด์—์„œ ๊ฐ€์žฅ ํฐ ๊ฐ’์„ ๊ฐ€์ง€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.(์ž์‹๋“ค๊ฐ„์˜ ์ˆœ์„œ๋Š” ์ค‘์š”ํ•˜์ง€ ์•Š๊ณ  ๋ถ€๋ชจ ๋…ธ๋“œ๋Š” ํ•ญ์ƒ ์ž์‹ ๋…ธ๋“œ๋ณด๋‹ค ์ปค์•ผํ•œ๋‹ค๋Š” ๊ทœ์น™๋งŒ ์ง€์ผœ์ง€๋ฉด ๋œ๋‹ค.) ์ด๋ฅผ ๋ณดํ†ต '๋ฒ„๋ธ” ์—…' ์ด๋ผ๊ณ  ํ•œ๋‹ค.

 

โ—Ž์ˆ˜๋„ ์ฝ”๋“œ

1) insert ์ด๋ฆ„์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์ˆซ์ž ํ•˜๋‚˜๋ฅผ ์ธ์ˆ˜๋กœ ๋ฐ›๋Š”๋‹ค.

2) ํฌ์ธํ„ฐ ์—ญํ• ์„ ํ•  ์ธ๋ฑ์Šค ๋ณ€์ˆ˜๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค๊ณ  ์ƒˆ๋กญ๊ฒŒ ์ถ”๊ฐ€ํ•  ๋…ธ๋“œ์˜ ์ธ๋ฑ์Šค ๋ฒˆํ˜ธ๋ฅผ ํ• ๋‹นํ•œ๋‹ค. 

3) ์ผ๋‹จ ๋งˆ์ง€๋ง‰ ์ธ๋ฑ์Šค ์ž๋ฆฌ, ์ฆ‰ ๋ฐฐ์—ด์˜ ๋งจ๋’ค, ๋งจ ๋งˆ์ง€๋ง‰์— ์ƒˆ๋กญ๊ฒŒ ์ถ”๊ฐ€ํ•  ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

4) ๊ทธ ํ›„ ๋ถ€๋ชจ์˜ ์ธ๋ฑ์Šค๋ฅผ ์ฐพ๋Š”๋‹ค.(์ˆ˜ํ•™ ๊ณต์‹์„ ์ด์šฉ)

5) ๊ทธ๋ฆฌ๊ณ  ์–ด๋Š ๊ฒƒ์ด ๋” ํฐ์ง€ ๋น„๊ต ํ›„, ์ถ”๊ฐ€ํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฐ’์ด ๋” ํฌ๋‹ค๋ฉด ๋‘ ๊ฐ’์˜ ์ž๋ฆฌ๋ฅผ ๋ฐ”๊ฟ”์ค€๋‹ค.

6) ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ์˜ณ๋ฐ”๋ฅธ ์ž๋ฆฌ์— ์œ„์น˜ํ•œ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋Œ€๋กœ ๋ฉˆ์ถ”๋ฉด ๋œ๋‹ค.

7) ๋ฐ˜๋Œ€๋กœ ์ž๋ฆฌ๋ฅผ ๋ฐ”๊พธ๊ฒŒ ๋œ๋‹ค๋ฉด ํฌ์ธํ„ฐ ์—ญํ• ์„ ํ•˜๋Š” ์ธ๋ฑ์Šค ๋ณ€์ˆ˜์— ๋ฐ”๋€ ์ž๋ฆฌ์˜ ์ธ๋ฑ์Šค ๋ฒˆํ˜ธ, ์ฆ‰ ๋ฐ”๋€Œ๊ธฐ ์ „์— ์žˆ๋˜ ๋ถ€๋ชจ ๋…ธ๋“œ์˜ ์ธ๋ฑ์Šค ๋ฒˆํ˜ธ๋ฅผ ์žฌํ• ๋‹นํ•ด ์ค€๋‹ค.

8) ๊ฐ€์žฅ ์•ž ์ž๋ฆฌ ์ฆ‰, ๋ฃจํŠธ ๋…ธ๋“œ ์ž๋ฆฌ๋กœ ์˜ค๊ฒŒ ๋˜๋ฉด ๋” ์ด์ƒ ๋น„๊ตํ•˜์ง€ ์•Š๋„๋ก ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด ์ค˜์•ผ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.

 

// ์ตœ๋Œ€ ์ด์ง„ ํž™์„ ๊ธฐ์ค€์œผ๋กœ ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„
class MaxBinaryHeap {
    constructor(){
        this.values = [];
    }
    
    insert(element){
        this.values.push(element);
        this.bubbleUp();
    }
    
    bubbleUp(){
        let idx = this.values.length - 1;
        const element = this.values[idx];
        while(idx > 0){
            let parentIdx = Math.floor((idx - 1)/2); 
            let parent = this.values[parentIdx];
            if(element <= parent) break;
            this.values[parentIdx] = element;
            this.values[idx] = parent;
            idx = parentIdx;
        }
    }
}

18.5 ExtractMax ๋ฉ”์„œ๋“œ

  ExtractMax๋Š” ์ตœ๋Œ€ ์ด์ง„ ํž™์—์„œ ๋ฃจํŠธ ๋…ธ๋“œ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ธฐ๋Šฅ์„ ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋‹ค. ์ฆ‰, ์ตœ๋Œ€ ์ด์ง„ ํž™์—์„œ๋Š” ๊ฒฐ๊ตญ ์ตœ๋Œ“๊ฐ’์ธ ๋ฃจํŠธ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๊ณ , ์ตœ์†Œ ์ด์ง„ ํž™์—์„œ๋Š” ๊ฒฐ๊ตญ ์ตœ์†Ÿ๊ฐ’์ธ ๋ฃจํŠธ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ ๋Š” ๋ฃจํŠธ์— ์•Œ๋งž์€ ๊ฐ’์ด ์˜ฌ ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. ๋ณดํ†ต ์ด๋ฅผ '์‹ฑํฌ ๋‹ค์šด', '๋ฒ„๋ธ” ๋‹ค์šด'์ด๋ผ๊ณ  ํ‘œํ˜„ํ•œ๋‹ค. ์ „์ฒด์ ์ธ ๋ฐฉ๋ฒ•์€ ์šฐ์„  ๊ฐ€์žฅ ๋จผ์ € ๋ฃจํŠธ ๋…ธ๋“œ์™€ ๋ฐฐ์—ด์˜ ๋งˆ์ง€๋ง‰์— ์œ„์น˜ํ•œ ๋…ธ๋“œ์˜ ์œ„์น˜๋ฅผ ์Šค์™‘ํ•ด์ฃผ๊ณ , pop() ๋ฉ”์„œ๋“œ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๊ธฐ์กด ๋ฃจํŠธ ๋…ธ๋“œ๋ฅผ ์ œ๊ฑฐํ•ด ์ค€๋‹ค. ๊ทธ๋Ÿผ ๋ฐฐ์—ด์˜ ๋งจ ๋’ค์˜ ๋…ธ๋“œ๋Š” ๋ฃจํŠธ ๋…ธ๋“œ๊ฐ€ ๋œ๋‹ค. ๊ทธ ํ›„ ๋ฃจํŠธ์˜ ์ž์‹๋“ค ์ค‘(์™ผ์ชฝ/์˜ค๋ฅธ์ชฝ) ๋” ํฐ ๊ฐ’๊ณผ ๋น„๊ตํ•˜์—ฌ ๋ฃจํŠธ ๋…ธ๋“œ์˜ ๊ฐ’์ด ๋” ์ž‘๋‹ค๋ฉด ์Šค์™‘ํ•ด์ค€๋‹ค. ์ด๋ฅผ ๋ฐ˜๋ณตํ•˜์—ฌ ์ œ ์ž๋ฆฌ๋ฅผ ์ฐพ์•„๊ฐ€๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•œ๋‹ค.

 

โ—Ž์ˆ˜๋„ ์ฝ”๋“œ

1) ์ตœ๋Œ€ ์ด์ง„ ํž™ ํด๋ž˜์Šค์— ๋ฉ”์„œ๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์ธ์ˆ˜๋Š” ๋ฐ›์ง€ ์•Š๋Š”๋‹ค.

2) ์šฐ์„  ๋ฃจํŠธ์™€ ํž™์˜ ๊ฐ€์žฅ ๋ ์š”์†Œ์™€ ์Šค์™‘ํ•˜๊ณ  ์ œ์ผ ๋’ค๋กœ ๊ฐ„ ๊ฐ’์„ ์ œ๊ฑฐํ•œ๋‹ค(pop())

3) ์ƒˆ๋กœ์šด ๋ฃจํŠธ ๋…ธ๋“œ๋Š” ๋‹น์—ฐํžˆ 0๋ฒˆ ์ธ๋ฑ์Šค์— ์œ„์น˜ํ•˜๊ณ , ์ž์‹ ๋…ธ๋“œ๋“ค๊ณผ ๋น„๊ตํ•ด ๋‚˜๊ฐ€๋ฉด์„œ ๊ฐ€๋ผ์•‰๊ฒŒ ๋œ๋‹ค.

4) ์ธ๋ฑ์Šค ์นด์šดํ„ฐ๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค๊ณ  0์—์„œ ์‹œ์ž‘ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•ด๋‹น ์ธ๋ฑ์Šค ์š”์†Œ์˜ ์™ผ์ชฝ ์˜ค๋ฅธ์ชฝ ์ž์‹์„ ์ฐพ๋Š”๋‹ค(์ˆ˜ํ•™ ๊ณต์‹ ์ด์šฉ)

5) ๊ทธ ๋‹ค์Œ ๋‘ ์ž์‹๋“ค ์ค‘ ๋” ํฐ ์š”์†Œ๋ฅผ ๋ถ€๋ชจ ์œ„์น˜์˜ ์š”์†Œ์™€ ๋น„๊ตํ•œ๋‹ค.

6) ์ž์‹์ด ๋” ํฌ๋‹ค๋ฉด ๋ถ€๋ชจ์™€ ์ž์‹์˜ ์œ„์น˜๋ฅผ ๋ฐ”๊พผ๋‹ค.

7) ์ž๋ฆฌ๋ฅผ ๋ฐ”๊พผ ์ž์‹์˜ ์ธ๋ฑ์Šค๋ฅผ ์ƒˆ๋กœ์šด ๋ถ€๋ชจ ์ธ๋ฑ์Šค๋กœ ์„ค์ •ํ•ด ์ฃผ๊ณ , ์ƒˆ๋กœ์šด ์ž์‹์„ ์ฐพ์œผ๋ฉด์„œ ์ด ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜์—ฌ ๋ฃจํ”„๋ฅผ ๋Œ๊ณ  ์ž๋ฆฌ๋ฅผ ๋ฐ”๊พธ๋Š” ๊ฒƒ์ด๋‹ค. 

8) ์ด ๊ณผ์ •์„ ๋‘ ์ž์‹์ด ํ•ด๋‹น ์š”์†Œ๋ณด๋‹ค ๋” ํฌ์ง€ ์•Š์„ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•œ๋‹ค.

9) ๊ทธ๋ฆฌ๊ณ  ๋งˆ์ง€๋ง‰์— ์˜ˆ์ „ ๋ฃจํŠธ๋ฅผ ์ถœ๋ ฅํ•ด ์ค€๋‹ค.

class MaxBinaryHeap {
    constructor(){
        this.values = [];
    }
    insert(element){
        this.values.push(element);
        this.bubbleUp();
    }
    bubbleUp(){
        let idx = this.values.length - 1;
        const element = this.values[idx];
        while(idx > 0){
            let parentIdx = Math.floor((idx - 1)/2);
            let parent = this.values[parentIdx];
            if(element <= parent) break;
            this.values[parentIdx] = element;
            this.values[idx] = parent;
            idx = parentIdx;
        }
    }

    extractMax(){
        this.max = this.values[0];
        this.end = this.values.pop() // ์ œ๊ฑฐ๋œ ์š”์†Œ๊ฐ€ ๋ฐ˜ํ™˜๋จ
        if(this.values.length > 0){
            this.values[0] = end; // ๋ฐฐ์—ด์— ์š”์†Œ๊ฐ€ ํ•˜๋‚˜๊ฐ€ ๋‚จ์•˜์„๋•Œ๋ฅผ ๋ฐฉ์ง€! ์ด๊ฒŒ ์—†์œผ๋ฉด ๊ณ„์† ํ•˜๋‚˜๊ฐ€ ๋‚จ์•„ ์žˆ์Œ
            this.sinkDown();
        }
        return max;
    }
    sinkDown(){
        let idx = 0;
        const length = this.values.length;
        const element = this.values[0];
        while(true){
            let leftChildIdx = 2 * idx + 1;
            let rightChildIdx = 2 * idx + 2;
            let leftChild;
            let rightChild;
            let swap = null;

            if(leftChildIdx < length){
                leftChild = this.values[leftChildIdx];
                if(leftChild > element){
                    swap = leftChildIdx; // ์–ด๋””๋กœ ์ž๋ฆฌ๋ฅผ ๋ฐ”๊ฟจ๋Š”์ง€ ์ถ”์ ํ•˜๋Š”ํ•˜๊ธฐ ์œ„ํ•ด ํ• ๋‹น
                }
            }
            if(rightChildIdx < length){
                rightChild = this.values[rightChildIdx];
                if(
                    (swap === null && rightChild > element) || 
                    (swap !== null && rightChild > leftChild)
                    ) {
                        swap = rightChildIdx;
                    }
            }
            if(swap === null) break;
            this.values[idx] = this.values[swap]; //์ž๋ฆฌ ๋ฐ”๊พธ๊ธฐ
            this.values[swap] = element; // ์ž๋ฆฌ ๋ฐ”๊พธ๊ธฐ
            idx = swap; // ๊ทธ ๋‹ค์Œ ์ž์‹๋“ค์„ ์ฐพ๊ธฐ ์œ„ํ•ด์„œ ์ธ๋ฑ์Šค๋„ ๋ฐ”๊ฟ”์ค˜์•ผํ•จ

        }
    }

}

18.6 ์šฐ์„  ์ˆœ์œ„ ํ

  ์—ฌํƒœ๊นŒ์ง€ ์ด์ง„ ํž™์— ๋Œ€ํ•ด์„œ ๊ณต๋ถ€ํ•˜์˜€๋Š”๋ฐ ์ด์ง„ ํž™์„ ๋ฐฐ์šฐ๋Š” ์ด์œ  ์ค‘ ํ•˜๋‚˜๋Š” ๋ฐ”๋กœ ์šฐ์„  ์ˆœ์œ„ ํ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•จ์ด๋‹ค. ์šฐ์„  ํ๋Š” ์„ ์ž…์„ ์ถœ ๊ตฌ์กฐ์˜ ์ž๋ฃŒ ๊ตฌ์กฐ๋ผ๊ณ  ์•ž์„œ ๊ณต๋ถ€ํ–ˆ๋Š”๋ฐ ์šฐ์„  ์ˆœ์œ„ ํ๋Š” ๊ฐ ์š”์†Œ๊ฐ€ ๊ทธ์— ํ•ด๋‹นํ•˜๋Š” ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ฐ€์ง€๋Š” ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ๋งํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋” ๋†’์€ ์šฐ์„  ์ˆœ์œ„๋ฅผ ๊ฐ€์ง„ ์š”์†Œ๊ฐ€ ๋” ๋‚ฎ์€ ์šฐ์„  ์ˆœ์œ„๋ฅผ ๊ฐ€์ง„ ์š”์†Œ๋ณด๋‹ค ๋จผ์ € ์ฒ˜๋ฆฌ๊ฐ€ ๋œ๋‹ค. ์ฆ‰ ๋ฐ์ดํ„ฐ ๋ชจ์ž„์ด ์žˆ๊ณ  ๊ฐ ๋…ธ๋“œ๋‚˜ ์š”์†Œ๊ฐ€ ๊ฐ๊ฐ์˜ ์šฐ์„  ์ˆœ์œ„ ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ์ด๋‹ค. ์šฐ์„  ์ˆœ์œ„ ํ๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ์šฐ์„  ์ˆœ์œ„๋ฅผ ๊ฐ€์ง€๋Š” ๋ฐ์ดํ„ฐ๋‚˜ ์ •๋ณด๋ฅผ ๊ด€๋ฆฌํ•  ํ•„์š”๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ์— ํ™œ์šฉ๋œ๋‹ค.

 

  ํ•˜๋‚˜ ์ฃผ์˜ํ•ด์•ผ ํ•  ์ ์€ ์šฐ์„ ์ˆœ์œ„ ํ๊ฐ€ ํž™๊ณผ๋Š” ๋ณ„๊ฐœ์˜ ๊ฐœ๋…์ด๋ผ๋Š” ๊ฒƒ์ด๋‹ค. ์šฐ์„  ์ˆœ์œ„ ํ๋Š” ์ถ”์ƒ์ ์ธ ๊ฐœ๋…์— ๋ถˆ๊ณผํ•˜๋‹ค. ์šฐ์„  ์ˆœ์œ„ ํ๋Š” ๋ฐฐ์—ด์ด๋‚˜ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ฐ€์ง€๊ณ ๋„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰ ์šฐ์„  ์ˆœ์œ„ ํ๋„ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์— ์˜ํ•ด ์šฐ์„  ์ˆœ์œ„๋ฅผ ๊ฐ€์ง€๋Š” ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋งŒ ๊ฐ–์ถ˜๋‹ค๋ฉด ์šฐ์„  ์ˆœ์œ„ ํ๊ฐ€ ๋˜๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋ž˜์„œ ์ด์ง„ ํž™์„ ์‚ฌ์šฉํ•ด์„œ ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ๋„ ํ•˜๋‚˜์˜ ๋ฐฉ๋ฒ•์ผ ๋ฟ์ด๋‹ค. ์ด์ง„ ํž™์—์„œ ๋ฃจํŠธ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ์„ฑ์งˆ์„ ํ•ด์šฉํ•ด์„œ ๊ตฌํ˜„ํ•ด ๋ณด๋Š” ๊ฒƒ์ด๋‹ค. ๋ฃจํŠธ๊ฐ€ ์ œ๊ฑฐ๋˜๋ฉด ๋ฒ„๋ธ” ๋‹ค์šด์ด ๋˜๋ฉด์„œ ๋˜ ์ƒˆ๋กœ์šด ๋ฃจํŠธ๊ฐ€ ๊ฒฐ์ •๋˜๋Š” ๊ฒƒ์„ ์ด์šฉํ•  ๋ฟ์ด๋‹ค. 

 

18.7 ์šฐ์„  ์ˆœ์œ„ ํ & ๋…ธ๋“œ ํด๋ž˜์Šค

  ์šฐ์„  ์ˆœ์œ„ ํ ์ž์ฒด๋Š” ์ด์ง„ ํž™๊ณผ ๊ฐ™์ด ๋ฐฐ์—ด๋กœ ์ดˆ๊ธฐ ์„ค์ •์ด ๋˜์ง€๋งŒ, ์ด์ง„ ํž™๊ณผ ๋‹ค๋ฅด๊ฒŒ ์šฐ์„  ์ˆœ์œ„ ํ๋Š” ๋…ธ๋“œ ๊ฐ์ฒด๋กœ ๊ตฌ์„ฑ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐ ๋…ธ๋“œ๋“ค์€ value์™€ priority(์šฐ์„  ์ˆœ์œ„)๋ฅผ ํ”„๋กœํผํ‹ฐ๋กœ ๊ฐ–๋Š”๋‹ค.

class PriorityQueue{
    constructor(){
        this.values = [];
    }
}
//์—ฌ๊ธฐ๊นŒ์ง€๋Š” ์ด์ง„ ํž™๊ณผ ๋™์ผํ•จ
// ๋‹ค๋ฅธ ๋ถ€๋ถ„์€ ์šฐ์„ ์ˆœ์œ„ ํ๋Š” ๋…ธ๋“œ๋ฅผ ๊ฐ€์ง„๋‹ค

class Node{
    constructor(val, priority){
        this.val = val;
        this.priority = priority;
    }
}

  ์ฃผ์˜ ํ•ด์•ผํ•  ์ ์€ ๋…ธ๋“œ์˜ ๊ฐ’์€ ์šฐ์„  ์ˆœ์œ„ ํ์— ์˜ํ–ฅ์ด ์—†๋‹ค. ์šฐ์„  ์ˆœ์œ„ ๋น„๊ต๋Š” ์˜ค๋กœ์ง€ priority์˜ ๊ฐ’ ๋งŒ์„ ์‚ฌ์šฉํ•œ๋‹ค. ์ฆ‰, priority์˜ ๊ฐ’์ด ์‹ค์ œ๋กœ ํž™์„ ๊ตฌ์„ฑํ•˜๊ณ  ์žฌ์ •๋ ฌํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•  ๊ฐ’์ด๋‹ค. ์ตœ๋Œ€ ์ด์ง„ ํž™์˜ ๊ฒฝ์šฐ priority์˜ ๊ฐ’์ด ํด์ˆ˜๋ก ์šฐ์„  ์ˆœ์œ„๊ฐ€ ์˜ฌ๋ผ๊ฐ€๋Š” ๊ฒƒ์ด๊ณ  ์ตœ์†Œ ์ด์ง„ ํž™์˜ ๊ฒฝ์šฐ์—๋Š” priority์˜ ๊ฐ’์ด ์ž‘์„์ˆ˜๋ก ์šฐ์„  ์ˆœ์œ„๊ฐ€ ์˜ฌ๋ผ๊ฐ€๋Š” ๊ฒƒ์ด๋‹ค. ๋‹ค์‹œ ํ•œ ๋ฒˆ ๋งํ•˜์ง€๋งŒ, ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€ priority์˜ ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์ด์ง„ ํž™์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋‹ค.(value๊ฐ’์„ ๋น„๊ตํ•˜๋ฉด ์•ˆ๋œ๋‹ค.) ๊ทธ๊ฒƒ์„ ์ œ์™ธํ•˜๊ณ ๋Š” ์ด์ง„ ํž™์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฑฐ์˜ ๋™์ผํ•˜๋‹ค. ์‚ฌ์‹ค ์ด์ง„ ํž™์„ ์ด์šฉํ•ด์„œ ์šฐ์„  ์ˆœ์œ„ ํ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

// ์ตœ์†Œ ์ด์ง„ ํž™์„ ํ†ตํ•œ ์šฐ์„  ์ˆœ์œ„ ํ ๊ตฌํ˜„
class PriorityQueue {
    constructor(){
        this.values = [];
    }
    enqueue(val, priority){
        let newNode = new Node(val, priority);
        this.values.push(newNode);
        this.bubbleUp();
    }
    bubbleUp(){
        let idx = this.values.length - 1;
        const element = this.values[idx];
        while(idx > 0){
            let parentIdx = Math.floor((idx - 1)/2);
            let parent = this.values[parentIdx];
            if(element.priority >= parent.priority) break;
            this.values[parentIdx] = element;
            this.values[idx] = parent;
            idx = parentIdx;
        }
    }
    dequeue(){
        const min = this.values[0];
        const end = this.values.pop();
        if(this.values.length > 0){
            this.values[0] = end;
            this.sinkDown();
        }
        return min;
    }
    sinkDown(){
        let idx = 0;
        const length = this.values.length;
        const element = this.values[0];
        while(true){
            let leftChildIdx = 2 * idx + 1;
            let rightChildIdx = 2 * idx + 2;
            let leftChild,rightChild;
            let swap = null;

            if(leftChildIdx < length){
                leftChild = this.values[leftChildIdx];
                if(leftChild.priority < element.priority) {
                    swap = leftChildIdx;
                }
            }
            if(rightChildIdx < length){
                rightChild = this.values[rightChildIdx];
                if(
                    (swap === null && rightChild.priority < element.priority) || 
                    (swap !== null && rightChild.priority < leftChild.priority)
                ) {
                   swap = rightChildIdx;
                }
            }
            if(swap === null) break;
            this.values[idx] = this.values[swap];
            this.values[swap] = element;
            idx = swap;
        }
    }
}

class Node {
    constructor(val, priority){
        this.val = val;
        this.priority = priority;
    }
}

18.8 ์ด์ง„ ํž™ ๋น…์˜ค ํ‘œ๊ธฐ๋ฒ•

- Insertion : O(logN)

- Removal : O(logN)

- Search : O(N)

์ด์ง„ ํž™์€ ์ตœ๋Œ€ ํž™์ด๋“  ์ตœ์†Œ ํž™์ด๋“  ์‚ฝ์ž…๊ณผ ์‚ญ์ œ์— ์žˆ์–ด์„œ ์•„์ฃผ ์„ฑ๋Šฅ์ด ์ข‹๋‹ค.

'๐Ÿ“š Language & CS knowledge > Algorithm & Data structure' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

20 ๊ทธ๋ž˜ํ”„  (0) 2022.08.17
19 ํ•ด์‹œ ํ…Œ์ด๋ธ”  (0) 2022.08.16
17 ํŠธ๋ฆฌ ์ˆœํšŒ  (0) 2022.08.16
16 ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ  (0) 2022.08.14
15 ์Šคํƒ & ํ  (0) 2022.08.14