> 백엔드 개발 > Golang > Go 언어로 최소 힙을 구현하는 방법

Go 언어로 최소 힙을 구현하는 방법

PHPz
풀어 주다: 2023-03-30 09:48:13
원래의
1126명이 탐색했습니다.

Min-heap은 가장 작은 요소를 빠르게 찾을 수 있는 데이터 구조입니다. Go 언어에서는 힙 패키지를 사용하여 최소 힙을 구현할 수 있습니다. 이번 글에서는 Go 언어로 최소 힙을 구현하는 방법을 자세히 설명하겠습니다.

민힙이란 무엇인가요?

Min heap은 다음 두 가지 조건을 만족하는 이진 트리 구조입니다.

  1. 부모 노드의 값이 자식 노드의 값보다 작거나 같습니다.
  2. 각 레벨은 왼쪽에서 오른쪽으로 채워집니다.

예를 들어 다음은 최소 힙입니다.

      2
    /   \
   5     3
  / \   / \
 7   6 8   4
로그인 후 복사

최소 힙에서 루트 노드는 항상 가장 작은 요소이므로 최소값을 찾는 시간 복잡도는 O(1)입니다. 최소 힙의 삽입 및 삭제 작업의 시간 복잡도는 O(log n)입니다.

최소 힙을 구현하는 방법은 무엇인가요?

Go 언어에서는 힙 패키지를 사용하여 최소 힙을 구현할 수 있습니다. 힙 패키지는 최소 힙을 구현하기 위해 다음 세 가지 방법을 제공합니다.

  1. Init: 빈 최소 힙을 초기화합니다.
  2. 푸시: 최소 힙에 요소를 삽입합니다.
  3. Pop: 최소 힙에서 가장 작은 요소를 제거하고 반환합니다.

먼저 요소를 저장할 데이터 구조를 정의해야 합니다. 이 기사에서는 int 유형을 요소로 사용합니다. int 유형을 heap.Interface 유형으로 변환해야 하므로 heap.Interface 인터페이스의 세 가지 메소드인 Len, Less 및 Swap을 구현해야 합니다.

type MinHeap []int

func (h MinHeap) Len() int           { return len(h) }
func (h MinHeap) Less(i, j int) bool { return h[i] < h[j] }
func (h MinHeap) Swap(i, j int)      { h[i], h[j] = h[j], h[i] }
로그인 후 복사

위 코드에서는 MinHeap 유형을 정의하고 Len, Less 및 Swap 메서드를 구현했습니다. Len 메서드는 최소 힙의 요소 수를 반환하고, Less 메서드는 두 요소의 크기를 비교하며, Swap 메서드는 두 요소의 위치를 ​​교환합니다.

다음으로 최소 힙 초기화 방법을 구현해야 합니다. heap.Init 함수를 사용하여 빈 최소 힙을 초기화할 수 있습니다.

h := &MinHeap{}
heap.Init(h)
로그인 후 복사

이제 빈 최소 힙을 초기화했습니다. 다음으로 heap.Push 함수를 사용하여 요소를 삽입할 수 있습니다.

heap.Push(h, 2)
heap.Push(h, 5)
heap.Push(h, 3)
heap.Push(h, 7)
heap.Push(h, 6)
heap.Push(h, 8)
heap.Push(h, 4)
로그인 후 복사

위 코드에서는 heap.Push 함수를 사용하여 최소 힙에 요소를 삽입합니다.

heap.Pop 함수를 사용하여 가장 작은 요소를 제거하고 반환할 수도 있습니다.

for h.Len() > 0 {
     fmt.Printf("%d ", heap.Pop(h))
}
로그인 후 복사

위 코드에서는 루프와 heap.Pop 함수를 사용하여 최소 힙의 모든 요소를 ​​출력합니다.

전체 코드:

package main

import (
    "container/heap"
    "fmt"
)

type MinHeap []int

func (h MinHeap) Len() int           { return len(h) }
func (h MinHeap) Less(i, j int) bool { return h[i] < h[j] }
func (h MinHeap) Swap(i, j int)      { h[i], h[j] = h[j], h[i] }

func (h *MinHeap) Push(x interface{}) {
    *h = append(*h, x.(int))
}

func (h *MinHeap) Pop() interface{} {
    old := *h
    n := len(old)
    x := old[n-1]
    *h = old[0 : n-1]
    return x
}

func main() {
    h := &MinHeap{}
    heap.Init(h)

    heap.Push(h, 2)
    heap.Push(h, 5)
    heap.Push(h, 3)
    heap.Push(h, 7)
    heap.Push(h, 6)
    heap.Push(h, 8)
    heap.Push(h, 4)

    for h.Len() > 0 {
        fmt.Printf("%d ", heap.Pop(h))
    }
}
로그인 후 복사

위 코드에서는 Len, Less 및 Swap 메서드를 구현하는 것 외에도 Push 및 Pop 메서드도 구현합니다. Push 메서드는 최소 힙에 요소를 삽입하고, Pop 메서드는 최소 힙에서 가장 작은 요소를 제거하고 반환합니다.

Summary

이 글에서는 Go 언어에서 최소 힙을 구현하는 방법을 소개합니다. 힙 패키지에서 제공하는 기능을 사용하면 요소 삽입 및 삭제 시 O(log n) 시간 복잡도로 최소 힙을 빠르게 구현할 수 있습니다. 다른 유형의 힙을 구현해야 하는 경우 힙 패키지 설명서를 참조하세요.

위 내용은 Go 언어로 최소 힙을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿