Go verwendet die Standardbibliothek, um den Heap, die ersten K Hochfrequenzelemente und die Maximalwertlösung des Schiebefensters zu implementieren

0.Vorwort

Heap ist eine baumförmige Datenstruktur (vollständiger Binärbaum), die in Big-Top-Heap und Small-Top-Heap unterteilt ist. Wie der Name schon sagt, ist der Big-Top-Heap der obere Teil des Heaps (das erste Element), in dem immer das größte Element gespeichert ist in dieser Gruppe von Elementen, und der kleine obere Heap speichert immer das größte Element in dieser Gruppe von Elementen. Das oberste Element des Heaps ist das kleinste Element. Wenn Sie den Maximal- oder Minimalwert aus einer Reihe von Objekten ermitteln müssen und die Elemente dynamisch hinzugefügt werden , können Sie den Heap verwenden, um die Anforderung effizient abzuschließen. Die Standardbibliothek in GO stellt die Heap-Funktion bereit. Schauen wir uns an, wie man sie verwendet.

1. So verwenden Sie das Heap-Paket in der GO-Sprache

Die Verwendung von Heap ist hauptsächlich in drei Schritte unterteilt:

  • Definieren Sie die Heap-Struktur
  • Implementieren Sie die Interface-Schnittstelle im Heap
  • Initialisieren und verwenden Sie den Heap

Gehen Sie direkt zum Code:

package main

import (
	"container/heap"
	"fmt"
)
//定义堆结构体
type HeapInts []int

// 实现Interface接口
// 其中包含 sort中的Interface接口 和push、pop接口
// 注意 push和pop接口的接收者必须是指针
func (h HeapInts) Len() int {
    
    
	return len(h)
}
//此处是大顶堆,如果是 < 即变成小顶堆
func (h HeapInts) Less(i, j int) bool {
    
    
	return h[i] > h[j]
}

func (h HeapInts) Swap(i, j int) {
    
    
	h[i],h[j]=h[j],h[i]
}

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

func (h *HeapInts) Pop() interface{
    
    } {
    
    
	temp:=(*h)[len(*h)-1]
	*h=(*h)[:len(*h)-1]
	return temp
}
func main()  {
    
    
	var h HeapInts
	h=append(h,2,1,3)
	fmt.Println(h)
    //初始化堆
	heap.Init(&h)
	fmt.Println(h)
    //向堆中插入元素
	heap.Push(&h,9)
	heap.Push(&h,5)
	fmt.Println(h)
    //弹出堆顶元素
	x:=heap.Pop(&h)
	fmt.Println(x)
	fmt.Println(h)
}

2. Einige algorithmische Probleme werden mithilfe von Heaps gelöst

Es gibt viele Fragen zu Leetcode, die mithilfe von Heaps gelöst werden können. Hier sind zwei Fragen:

347. Top-K-Hochfrequenzelemente – LeetCode

239. Maximalwert des Schiebefensters – LeetCode

2.1 Die ersten K Hochfrequenzelemente

Bei dieser Frage speichert jeder Knoten im Heap den Wert einer Zahl und die Anzahl der Vorkommen dieser Zahl. Die Anzahl der Vorkommen wird zum Sortieren verwendet und der Wert wird zum Erhalten der Antwort verwendet.

Verwenden Sie zuerst die Karte, um die Anzahl der Vorkommen aller Elemente aufzuzeichnen, und erstellen Sie dann gemäß den obigen Schritten einen Heap, um die Daten in der Karte zu speichern. Was hier erstellt wird, ist ein großer oberer Heap. Zum Schluss Pop-out K Elemente, das ist die Antwort. Code wie folgt:

type mm  struct {
    
    
	k int
	v int
}
type ms []mm

func (m ms) Len() int {
    
    
	return len(m)
}
//根据v值进行排序
func (m ms) Less(i, j int) bool {
    
    
	return m[i].v > m[j].v
}

func (m ms) Swap(i, j int) {
    
    
	m[i],m[j]=m[j],m[i]
}

func (m *ms) Push(x interface{
    
    }) {
    
    
	 *m=append(*m,x.(mm))
}

func (m *ms) Pop() interface{
    
    } {
    
    
	temp:= (*m)[len(*m)-1]
	*m=(*m)[:len(*m)-1]
	return temp
}

func topKFrequent(nums []int, k int) []int {
    
    
	var result []int
	m:=make(map[int]int)
	for _,v:=range nums{
    
    
		m[v]++
	}

	var h ms
	for k,v:=range m{
    
    
		h=append(h,mm{
    
    k: k,v: v})
	}
    //初始化堆
	heap.Init(&h)
    //得到答案
	for i:=0;i<k;i++{
    
    
		result=append(result,heap.Pop(&h).(mm).k)
	}
	return result
}

2.2 Maximalwert des Schiebefensters

In dieser Frage speichert jeder Knoten in der Heap-Datenstruktur den Index einer Zahl und den Wert der Zahl. Der Wert wird zur Sortierung verwendet und anhand des Indexes wird ermittelt, ob er sich im Schiebefenster befindet. Der spezifische Prozess ist wie folgt:

  • Der Heap wird zunächst mit den Werten des ersten Schiebefensters erstellt.
  • Verschieben Sie das Fenster um eine Stelle nach rechts und fügen Sie den neu hinzugefügten Knoten zum Heap hinzu. Erkennen Sie dann das oberste Element des Heaps (mithilfe von k). Wenn sich dieses Element im Schiebefenster befindet, speichern Sie es im Ergebnis und verschieben Sie das Fenster weiter. Wenn es nicht im Fenster ist, öffnen Sie das Element und erkennen Sie das nächste oberstes Element des Heaps, bis Sie ein Element im Heap finden. .
  • Wiederholen Sie den zweiten Schritt, bis das gesamte Array durchlaufen ist, und geben Sie das Ergebnis zurück

Code wie folgt anzeigen:

type mm  struct {
    
    
	k int
	v int
}
type ms []mm

func (m ms) Len() int {
    
    
	return len(m)
}

func (m ms) Less(i, j int) bool {
    
    
	return m[i].v > m[j].v
}

func (m ms) Swap(i, j int) {
    
    
	m[i],m[j]=m[j],m[i]
}

func (m *ms) Push(x interface{
    
    }) {
    
    
	 *m=append(*m,x.(mm))
}

func (m *ms) Pop() interface{
    
    } {
    
    
	temp:= (*m)[len(*m)-1]
	*m=(*m)[:len(*m)-1]
	return temp
}

func maxSlidingWindow(nums []int, k int) []int {
    
    
	var h ms
	var result []int
	for i := 0; i < k; i++ {
    
    
		h=append(h,mm{
    
    k: i,v: nums[i]})
	}
	heap.Init(&h)
	result=append(result,h[0].v)
	for i := k; i < len(nums); i++ {
    
    
		heap.Push(&h, mm{
    
    k: i, v: nums[i]})
		for {
    
    
			if h[0].k >= i - k + 1 {
    
    
				result = append(result, h[0].v)
				break
			}else{
    
    
				heap.Pop(&h)
			}
		}
	}
	return result
}

Acho que você gosta

Origin blog.csdn.net/doreen211/article/details/125812183
Recomendado
Clasificación