본문 바로가기
TIL - 프로그래밍/개념, 설정

[Python] Tree3 - heap

by chaemj97 2022. 4. 5.
728x90
  • heap
    • 완전 이진 트리에 있는 노드 중에서 키 값이 가장 큰 노드나 키 값이 가장 작은 노드를 찾기 위해서 만든 자료구조
    • 최대 힙(max heap)
      • 키 값이 가장 큰 노드를 찾기 위한 완전 이진 트리
      • 부모 노드의 키 값 > 자식 노드의 키 값
    • 최소 힙(min heap)
      • 키 값이 가장 작은 노드를 찾기 위한 완전 이진 트리
      • 부모 노드의 키 값 < 자식 노드의 키 값

 

  • 힙 연산 - 삽입
    • 완전 이진 트리를 유지 하기 위해 마지막 노드 다음에 추가
    • 최대 힙 or 최소 힙에 따라 위치 조정
# 최대 힙 삽입
def enq(n):
	# 마지막 정점 번호
    global last
    # 완전이진트리 유지
    last += 1
    tree[last] = n
    
    # 위치 조정
    # 새로 추가된 정점을 자식으로
    c = last 
    p = c//2
    
    # 부모가 있고, 자식의 키 값이 더 크면 교환(최대 힙은 부모가 더 커야 함)
    while p>=1 and tree[p] < tree[c]: 
        tree[p], tree[c] = tree[c],tree[p]
        # 부모를 자식으로 하여 확인 반복
        c = p
        p = c//2
enq(3)
enq(2)
enq(4)
enq(7)
enq(5)
enq(1)
enq(9)

print(tree)
# 결과
# [0, 9, 5, 7, 2, 4, 1, 3, 0, 0]

 

  • 힙 연산 - 삭제
    • 루트 노드의 원소만을 삭제 가능
    • 마지막 노드를 루트 노드 위치에 올리고
    • 최대힙 or 최소힙에 따라 위치 조정
# 최대 힙 삭제
def deq():
	# 마지막 정점 번호
    global last
    # 루트의 key 값
    tmp = tree[1] 
    
    # 마지막 정점의 키를 루트에 복사
    tree[1] = tree[last] 
    # 마지막 정점 삭제
    last -= 1
    
    # 위치 조정
    # 부모 > 자식 규칙 유지
    p = 1
    # 왼쪽자식노드 번호
    c = p*2
    
     # 왼쪽자식이 존재하는가? : 존재하지 않으면 자식 없음(왼쪽부터 자식 둠, 완전 이진 트리)
    while c <= last:
    	# 오른쪽 자식노드도 있고 더 크면
        if c+1 <= last and tree[c] < tree[c+1]: 
        	#오른쪽 자식 선택
            c += 1 
            
        # 자식의 키 값이 더 크면 교환
        if tree[p] < tree[c]: 
            tree[p],tree[c] = tree[c],tree[p]
            # 부모를 자식으로 두어 확인 반복
            p = c
            c = p*2
        else:
            break
            
    return tmp
728x90
반응형

'TIL - 프로그래밍 > 개념, 설정' 카테고리의 다른 글

[Python] ORM aggregate  (0) 2022.04.16
[Python] 데이터베이스  (0) 2022.04.15
[Python] Tree2  (0) 2022.04.04
[Python] Tree1  (0) 2022.04.03
[Python] 재귀로 순열, 조합  (0) 2022.03.28

댓글