Python/알고리즘공부

02_heap

728x90

heap은 비선형 자료구조이다. 가장 큰 값이나 가장 작은값이 항상 첫번째로 들어가게 한다. sorted와는 다르게 이진트리 방식으로 구성되어 있는것이 특징. 

 

 

class MaxHeap:
    def __init__(self):
        self.items = [None]

    def insert(self, value):
        # 구현해보세요!
        self.items.append(value)
        cur_index = len(self.items) -1

        while cur_index > 1:
            parent_index = cur_index // 2
            if self.items[cur_index] > self.items[parent_index]:
                self.items[cur_index] , self.items[parent_index] = self.items[parent_index] ,self.items[cur_index]
                cur_index = parent_index
            else :
                break

        return


max_heap = MaxHeap()
max_heap.insert(3)
max_heap.insert(4)
max_heap.insert(2)
max_heap.insert(9)
print(max_heap.items)  # [None, 9, 4, 2, 3] 가 출력되어야 합니다!

다음은 maxheap을 파이썬 모듈이 아닌 직접 구현해본 모습이다! 

class MaxHeap:
    def __init__(self):
        self.items = [None]

    def insert(self, value):
        self.items.append(value)
        cur_index = len(self.items) - 1

        while cur_index > 1:  # cur_index 가 1이 되면 정상을 찍은거라 다른 것과 비교 안하셔도 됩니다!
            parent_index = cur_index // 2
            if self.items[parent_index] < self.items[cur_index]:
                self.items[parent_index], self.items[cur_index] = self.items[cur_index], self.items[parent_index]
                cur_index = parent_index
            else:
                break

    def delete(self):
        # 구현해보세요!
        self.items[1], self.items[-1] = self.items[-1], self.items[1]
        prev_max = self.items.pop()

        cur_index = 1
        while cur_index <= len(self.items) -1:
            left_child_index = cur_index * 2
            right_child_index = cur_index *2 +1
            max_index = cur_index

            if left_child_index <= (len(self.items) - 1) and self.items[left_child_index] > self.items[max_index]:
                max_index = left_child_index
            if right_child_index <= len(self.items) - 1 and self.items[left_child_index] > self.items[max_index]:
                max_index = right_child_index

            if max_index == cur_index:
                break

            self.items[cur_index], self.items[max_index] = self.items[max_index],self.items[cur_index]
            cur_index = max_index


        return prev_max  # 8 을 반환해야 합니다.


max_heap = MaxHeap()
max_heap.insert(8)
max_heap.insert(6)
max_heap.insert(7)
max_heap.insert(2)
max_heap.insert(5)
max_heap.insert(4)
print(max_heap.items)  # [None, 8, 6, 7, 2, 5, 4]
print(max_heap.delete())  # 8 을 반환해야 합니다!
print(max_heap.items)  # [None, 7, 6, 4, 2, 5]

밑은 구현한 힙에서 지우는 과정이다

 

크게 어렵진 않았는데 일반적으로 정렬해주는 sort말고 이런구조를 사용하는게 더 괜찮은 경우가 있을 거 같단 생각이 들었다.

 

 

728x90

'Python > 알고리즘공부' 카테고리의 다른 글

05_catchme 문제! ( 상반기 line인턴채용문제)  (1) 2021.11.05
04_ 피보나치 수열 및 여러 문제들(hard)  (0) 2021.10.29
03_ DFS , BFS  (0) 2021.10.29
01_1week  (0) 2021.10.28
00_공부시작 배경  (0) 2021.10.28