๋ฐ๋ธŒ์ฝ”์Šค_๋ฐ์ดํ„ฐ์—”์ง€๋‹ˆ์–ด๋ง

[Week2 ์ž๋ฃŒ๊ตฌ์กฐ/์•Œ๊ณ ๋ฆฌ์ฆ˜] TIL 4์ผ์ฐจ - ํž™๊ณผ ์ถ”๊ฐ€๋ฌธ์ œ

๐Ÿช„ํ•˜๋ฃจ๐Ÿช„ 2023. 10. 19. 21:32
728x90

1) ํž™(Heap)

ํž™์€ ์™„์ „ ์ด์ง„ํŠธ๋ฆฌ ์ค‘ ํ•˜๋‚˜๋กœ ๋ฃจํŠธ ๋…ธ๋“œ๊ฐ€ ์ „์ฒด ํŠธ๋ฆฌ์˜ ์ตœ์†Ÿ๊ฐ’(=์ตœ์†Ÿ๊ฐ’ ํž™)์ด๋‚˜ ์ตœ๋Œ“๊ฐ’(=์ตœ๋Œ“๊ฐ’ ํž™)์„ ๊ฐ–๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค.

์–ด๋–ค ๋…ธ๋“œ์—์„œ๋„ ์™ผ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ, ์˜ค๋ฅธ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ๋„ ๋ชจ๋‘ ์ตœ์†Œ ํ˜น์€ ์ตœ๋Œ€ ํž™์ด์—ฌ์•ผ ํ•˜๋ฏ€๋กœ ์žฌ๊ท€์ ์œผ๋กœ ์ •์˜ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์ €๋ฒˆ ์‹œ๊ฐ„์— ๋ฐฐ์› ๋˜ ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ์™€ ๋น„๊ตํ•ด ๋ณด๋ฉด

  • ํ‚ค์˜ ํฌ๊ธฐ์ˆœ์œผ๋กœ ์ •๋ ฌ๋˜์–ด ์žˆ์ง€ ์•Š๊ณ 
  • ์ด ๋•Œ๋ฌธ์— ๋น ๋ฅธ ํƒ์ƒ‰๋„ ์–ด๋ ค์šฐ๋ฉฐ
  • ์™„์ „์ด์ง„ํŠธ๋ฆฌ์ด๊ธฐ ๋•Œ๋ฌธ์— ์‚ฝ์ž…, ์‚ญ์ œ๊ฐ€ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ์—์„œ ์ด๋ฃจ์–ด์ ธ์•ผ ํ•œ๋‹ค.

 

์ž๋ฃŒ๊ตฌ์กฐ์˜ ํ•ด๋‹น ํŠน์„ฑ์—์„œ ๋น„๋กฏํ•˜์—ฌ ์ •์˜๋˜๋Š” ํ•จ์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • insert(item) : item์„ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ์— ์‚ฝ์ž…ํ•œ๋’ค, ๋ฃจํŠธ ๋…ธ๋“œ์™€์˜ ํฌ๊ธฐ๋น„๊ต๋ฅผ ํ†ตํ•ด ์ ์ ˆํ•œ ์œ„์น˜๋ฅผ ์ฐพ์•„๋‚˜๊ฐ„๋‹ค.
  • remove() : ๋ฃจํŠธ ๋…ธ๋“œ๋ฅผ ์‚ญ์ œํ•œ ๋’ค, ์•Œ๋งž์€ ๋…ธ๋“œ๋ฅผ ํ•ด๋‹น ์ž๋ฆฌ๋กœ ์ด๋™์‹œํ‚จ๋‹ค.

 

๊ตฌํ˜„

๋ฐฐ์—ด์„ ์ด์šฉํ•ด์„œ ๊ตฌํ˜„ํ•ด ๋ณด์ž

→ ์™„์ „ ์ด์ง„ํŠธ๋ฆฌ์ด๊ธฐ ๋•Œ๋ฌธ์— ์‚ฝ์ž… ์‚ญ์ œ๊ฐ€ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ์—์„œ๋งŒ ์ด๋ฃจ์–ด์ง€๋ฏ€๋กœ ๋ฐฐ์—ด ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

 

์ธ๋ฑ์Šค 0์˜ ์›์†Œ๋ฅผ None์œผ๋กœ ์ดˆ๊ธฐํ™” ํ•˜๋ฉด, ๋ถ€๋ชจ๋…ธ๋“œ, ์ž์‹๋…ธ๋“œ์˜ ์ธ๋ฑ์Šค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • ๋ถ€๋ชจ ๋…ธ๋“œ์˜ ์ธ๋ฑ์Šค : n
  • ์™ผ์ชฝ ์ž์‹ ๋…ธ๋“œ์˜ ์ธ๋ฑ์Šค : 2n
  • ์˜ค๋ฅธ์ชฝ ์ž์‹ ๋…ธ๋“œ์˜ ์ธ๋ฑ์Šค : 2n+1

 

ํ•จ์ˆ˜

  • insert(item) : item์„ ์‚ฝ์ž…
    • ์šฐ์„  item๊ฐ’์€ ๋งˆ์ง€๋ง‰ ์œ„์น˜์— ์‚ฝ์ž…ํ•œ๋’ค → ๋ถ€๋ชจ ๋…ธ๋“œ๋ณด๋‹ค ํฌ๋ฉด ์œ„๋กœ ์ด๋™์‹œํ‚จ๋‹ค.
    • ์ตœ์•… ๋ณต์žก๋„ O(log n) 

cf) ํŒŒ์ด์ฌ์—์„œ๋Š” ๋‘ ๋ณ€์ˆ˜์˜ ๊ฐ’์€ ๋ฐ”๊ฟ€๋•Œ ํ•œ๋ฒˆ์— ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค.

  • a, b=b, a

์ฝ”๋“œ

class MaxHeap:

    def __init__(self):
        self.data = [None]
    def insert(self, item):
        self.data.append(item)
        nowidx = len(self.data) -1
        while nowidx >1:
            if self.data[nowidx] > self.data[nowidx//2]:
                self.data[nowidx],self.data[nowidx//2] = self.data[nowidx//2],self.data[nowidx]
                nowidx=nowidx//2
            else:
                break
  • remove() : ์‚ญ์ œ
    • ๋ฃจํŠธ ๋…ธ๋“œ ์‚ญ์ œํ•œ๋’ค, ์•Œ๋งž์€ ๋…ธ๋“œ๋ฅผ ์ฐพ์•„ ํ•ด๋‹น ์ƒˆ๋กœ์šด ๋ฃจํŠธ ๋…ธ๋“œ๋กœ ์‚ผ๋Š”๋‹ค.
      • ํŠธ๋ฆฌ์˜ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๋ฅผ ์ž„์‹œ๋กœ ๋ฃจํŠธ ๋…ธ๋“œ์— ์œ„์น˜ํ•˜๊ณ  ์ž์‹ ๋…ธ๋“œ์™€ ๋น„๊ต(๋‘˜์ค‘์— ๋” ํฐ ๊ฐ’๊ณผ ๋ฐ”๊พธ๊ธฐ)
    • ์ตœ์•… ๋ณต์žก๋„ 2*O(log n)

์ฝ”๋“œ

class MaxHeap:

    def __init__(self):
        self.data = [None]


    def remove(self):
        if len(self.data) > 1:
            self.data[1], self.data[-1] = self.data[-1], self.data[1]
            data = self.data.pop(-1)
            self.maxHeapify(1)
        else:
            data = None
        return data


    def maxHeapify(self, i):
        # ์™ผ์ชฝ ์ž์‹ (left child) ์˜ ์ธ๋ฑ์Šค๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.
        left = 
i*2

        # ์˜ค๋ฅธ์ชฝ ์ž์‹ (right child) ์˜ ์ธ๋ฑ์Šค๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.
        right = 
i*2+1

        smallest = i
        # ์™ผ์ชฝ ์ž์‹์ด ์กด์žฌํ•˜๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ์™ผ์ชฝ ์ž์‹์˜ (ํ‚ค) ๊ฐ’์ด (๋ฌด์—‡๋ณด๋‹ค?) ๋” ํฐ์ง€๋ฅผ ํŒ๋‹จํ•ฉ๋‹ˆ๋‹ค.
        if 
len(self.data)-1>left
 and 
self.data[smallest]<self.data[left]
:
            # ์กฐ๊ฑด์ด ๋งŒ์กฑํ•˜๋Š” ๊ฒฝ์šฐ, smallest ๋Š” ์™ผ์ชฝ ์ž์‹์˜ ์ธ๋ฑ์Šค๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค.
            
smallest=left

        # ์˜ค๋ฅธ์ชฝ ์ž์‹์ด ์กด์žฌํ•˜๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ์˜ค๋ฅธ์ชฝ ์ž์‹์˜ (ํ‚ค) ๊ฐ’์ด (๋ฌด์—‡๋ณด๋‹ค?) ๋” ํฐ์ง€๋ฅผ ํŒ๋‹จํ•ฉ๋‹ˆ๋‹ค.
        if 
len(self.data)-1>right
 and 
self.data[smallest]<self.data[right]
:
            # ์กฐ๊ฑด์ด ๋งŒ์กฑํ•˜๋Š” ๊ฒฝ์šฐ, smallest ๋Š” ์˜ค๋ฅธ์ชฝ ์ž์‹์˜ ์ธ๋ฑ์Šค๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค.
            
smallest=right

        if smallest != i:
            # ํ˜„์žฌ ๋…ธ๋“œ (์ธ๋ฑ์Šค i) ์™€ ์ตœ๋Œ“๊ฐ’ ๋…ธ๋“œ (์™ผ์ชฝ ์•„๋‹ˆ๋ฉด ์˜ค๋ฅธ์ชฝ ์ž์‹) ๋ฅผ ๊ต์ฒดํ•ฉ๋‹ˆ๋‹ค.
            
self.data[i], self.data[smallest]=self.data[smallest], self.data[i]

            # ์žฌ๊ท€์  ํ˜ธ์ถœ์„ ์ด์šฉํ•˜์—ฌ ์ตœ๋Œ€ ํž™์˜ ์„ฑ์งˆ์„ ๋งŒ์กฑํ•  ๋•Œ๊นŒ์ง€ ํŠธ๋ฆฌ๋ฅผ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
            self.maxHeapify(smallest)


def solution(x):
    return 0

 

 

 

728x90