[์ž๋ฃŒ๊ตฌ์กฐ] Heap (2)

2021. 9. 6. 08:01ใ†์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ ์ค€๋น„/์ž๋ฃŒ๊ตฌ์กฐ

728x90
๋ฐ˜์‘ํ˜•

 

์•ˆ๋…•ํ•˜์„ธ์š”? ์ฃผ๋‹ˆํ•˜๋ž‘ ์ž…๋‹ˆ๋‹ค.

์˜ค๋Š˜์€ ์ž๋ฃŒ๊ตฌ์กฐ์™€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ž๋ฃŒ๊ตฌ์กฐ์—์„œ Heap ๊ตฌ์กฐ์— ๋Œ€ํ•ด ๊ณต๋ถ€ ํ•ด ๋ณด๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด์—์š”.

์ด๋ฒˆ ํ”ผ๋“œ๋Š” Heap์˜ ๋‘๋ฒˆ์งธ ํ”ผ๋“œ ์ž…๋‹ˆ๋‹ค. 1ํŽธ์„ ์•ˆ ๋ณด์‹  ๋ถ„๋“ค์€ [์ž๋ฃŒ๊ตฌ์กฐ] Heap (1)์— ๊ด€์‹ฌ์„ ์ฃผ์„ธ์š”!

๋˜ํ•œ, ์†Œ์Šค ์ฝ”๋“œ์— ๋Œ€ํ•ด์„œ ํ™•์ธ ํ•˜๊ณ  ์‹ถ์œผ์‹  ๋ถ„๋“ค๊ป˜์„œ๋Š” ์ฃผ๋‹ˆํ•˜๋ž‘์˜ Git hub์— ๊ด€์‹ฌ์„ ์ฃผ์„ธ์š”!

 

 

 


 

 

 

๐Ÿ“Œ Heap ์‚ญ์ œ (Max Heap ์˜ˆ์‹œ)


    ๐Ÿ“ Heap Class ๊ตฌํ˜„

          ๐Ÿ‘‰ Delete ์ฒซ๋ฒˆ์งธ

ํž™์€ ์ตœ์ƒ๋‹จ Node (Root Node)๋ฅผ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ธ ๊ฒƒ์ด์—์š”.

์™œ๋ƒํ•˜๋ฉด ํž™์€ ๋ณธ๋ž˜ ์šฉ๋„๊ฐ€ ์ตœ๋Œ€๊ฐ’ ๋˜๋Š” ์ตœ์†Œ๊ฐ’์„ Root Node์— ๋†“์€ ๋’ค ์ตœ๋Œ€๊ฐ’๊ณผ ์ตœ์†Œ๊ฐ’์„ ๋ฐ”๋กœ ๊บผ๋‚ด ์“ธ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ธ ๊ฒƒ์ด์—์š”.

 

    def pop(self):  # heap์— ์žˆ๋Š” Data ๊บผ๋‚ด๊ธฐ(์‚ญ์ œ) Method
        if len(self.heap_array) <= 1:   # ๋ฐฐ์—ด์˜ ๊ธธ์ด๊ฐ€ 1๋ณด๋‹ค ์ž‘๋‹ค๋Š” ๊ฒƒ์€ Data๊ฐ€ ์—†๋‹ค๋Š” ์˜๋ฏธ
            return None                 # ๋ฐฐ์—ด์— Data๊ฐ€ ์—†์œผ๋ฏ€๋กœ, ์—ฐ์‚ฐ ๋ถˆ๊ฐ€ None์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

        returned_data = self.heap_array[1]  # 0์ธ๋ฑ์Šค๋ฅผ ์“ฐ์ง€ ์•Š๊ณ , 1๋ฒˆ์„ Root Node์˜ ์ธ๋ฑ์Šค๋กœ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์„ ์–ธ

        # Root Node์˜ Data๋ฅผ ๊บผ๋‚ด๋ฉด ์ตœ์ดˆ ๋งจ ๋งˆ์ง€๋ง‰ ์ธ๋ฑ์Šค์˜ ๊ฐ’์„ Root Node๋กœ ์˜ฌ๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ์•„๋ž˜์™€ ๊ฐ™์ด ๊ตฌํ˜„
        self.heap_array[1] = self.heap_array[-1]  # 0๋ฒˆ ์ธ๋ฑ์Šค๋Š” ์“ฐ์ง€ ์•Š๊ธฐ๋กœ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— 1๋ฒˆ ์ธ๋ฑ์Šค๋กœ ์˜ฎ๊ธด๋‹ค.
        retrun returned_data

 

 

          ๐Ÿ‘‰ Delete ๋‘๋ฒˆ์งธ

์ƒ๋‹จ Data ์‚ญ์ œ๊ฐ€ ๋˜๋ฉด ๊ฐ€์žฅ ์ตœํ•˜๋‹จ๋ถ€ ์™ผ์ชฝ์— ์œ„์น˜ํ•œ Node (์ผ๋ฐ˜์ ์œผ๋กœ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์— ์ถ”๊ฐ€๋œ Node)๋ฅผ Root Node๋กœ ์ด๋™ ์‹œํ‚จ๋‹ต๋‹ˆ๋‹ค!

Root Node์˜ ๊ฐ’์ด ์ž๊ธฐ ์ž์‹  ํ˜น์€ ์†์ž๋“ค ๋ณด๋‹ค ์ž‘๋‹ค๋ฉด Root Node์˜ Child Node ์ค‘ ๊ฐ€์žฅ ํฐ ๊ฐ’์„ ๊ฐ€์ง„ Node์™€ Root Node์˜ ์œ„์น˜๋ฅผ ๋ฐ”๊ฟ”์ฃผ๋Š” ์—ฐ์‚ฐ์ด ํ•„์š”ํ•œ ๊ฒƒ์ด์—์š”. (Swap)

 

 

heap = Heap(15)  # ์ตœ์ดˆ heap์— Heap๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ 15๋ฅผ ๋„ฃ์–ด์ค€๋‹ค.
heap.insert(10)  # heap๊ฐ์ฒด์— insert Method์— 10์„ ๋„ฃ์–ด์ค€๋‹ค.
heap.insert(8)  # heap๊ฐ์ฒด์— insert Method์— 8์„ ๋„ฃ์–ด์ค€๋‹ค.
heap.insert(5)  # heap๊ฐ์ฒด์— insert Method์— 5์„ ๋„ฃ์–ด์ค€๋‹ค.
heap.insert(4)  # heap๊ฐ์ฒด์— insert Method์— 4์„ ๋„ฃ์–ด์ค€๋‹ค.
heap.insert(20)  # heap๊ฐ์ฒด์— insert Method์— 20์„ ๋„ฃ์–ด์ค€๋‹ค.
print("heap ๋ฐฐ์—ด์— ์ž…๋ ฅ๋œ ๊ฐ’์€ \"" + str(heap.heap_array) + "\" ์ž…๋‹ˆ๋‹ค.\n")  # List์— ๋“ค์–ด์žˆ๋Š” ๊ฐ’๋“ค์„ ์ถœ๋ ฅํ•ด ๋ณธ๋‹ค.


# ๊ฒฐ๊ณผ : [None, 20, 10, 15, 5, 4, 8]


print("heap ๋ฐฐ์—ด์—์„œ ๊บผ๋‚ธ ๊ฐ’์€ \"" + str(heap.pop()) + "\" ์ž…๋‹ˆ๋‹ค.")   # heap ๊ฐ์ฒด์˜ pop Method๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ Root Node๋ฅผ ๊บผ๋‚ธ๋‹ค.

# ๊ฒฐ๊ณผ : heap ๋ฐฐ์—ด์—์„œ ๊บผ๋‚ธ ๊ฐ’์€ "20" ์ž…๋‹ˆ๋‹ค.

print("heap์—์„œ Root Node๋ฅผ ๋บ€ ๋’ค ๋“ค์–ด์žˆ๋Š” ๊ฐ’์€ \"" + str(heap.heap_array) + "\" ์ž…๋‹ˆ๋‹ค.")

# ๊ฒฐ๊ณผ : heap์—์„œ Root Node๋ฅผ ๋บ€ ๋’ค ๋“ค์–ด์žˆ๋Š” ๊ฐ’์€ "[None, 15, 10, 8, 5, 4]" ์ž…๋‹ˆ๋‹ค.

 

 

 

 

๐Ÿ“Œ Heap ์‹œ๊ฐ„ ๋ณต์žก๋„


ํŠธ๋ฆฌ์˜ ๋†’์ด (depth)๋ฅผ h๋ผ๊ณ  ํ‘œ๊ธฐ ํ–ˆ์„ ๋•Œ, n ๊ฐœ์˜ Node๋ฅผ ๊ฐ€์ง€๋Š” Heap์— Data ์‚ฝ์ž…, ์‚ฝ์ œ ์‹œ์— ์ตœ์•…์˜ ๊ฒฝ์šฐ Root Node์—์„œ Leaf (์ตœํ•˜๋‹จ Node)๊นŒ์ง€ ๋น„๊ต๋ฅผ ํ•ด์•ผํ•  ์ˆ˜๋„ ์žˆ๋Š” ๊ฒƒ์ด์—์š”! ์ด ๋•Œ๋ฌธ์— $h = log2n$์— ๊ฐ€๊น๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” $O(logn)$์ธ ๊ฒƒ์ด์—์š”.

 

๐Ÿ’ก์ฐธ๊ณ  :
๋น…์˜ค (Big O) ํ‘œ๊ธฐ๋ฒ•์—์„œ $logn$์—์„œ์˜ $log$์˜ ๋ฐ‘์€ 10์ด ์•„๋‹ˆ๋ผ 2์ด๋‹ค.
ํ•œ๋ฒˆ ์‹คํ–‰์‹œ๋งˆ๋‹ค, 50%์˜ ์‹คํ–‰ ํšŸ์ˆ˜๋ฅผ ์ค„์ธ๋‹ค๋Š” ๊ฒƒ์ด๊ณ , ๊ทธ ๋ง์ธ ์ฆ‰, 50%์˜ ์‹คํ–‰ ์‹œ๊ฐ„์„ ๋‹จ์ถ• ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
728x90
๋ฐ˜์‘ํ˜•