GoDasturchi
Heap and Priority Queue

Heap and Priority Queue

Heap va ustuvorlik navbati

Shifoxona qabulxonasini tasavvur qiling: kim birinchi kelgan bo'lsa, o'sha birinchi ko'rilmaydi — eng og'ir holatdagi bemor birinchi ko'riladi, garchi u eng oxirida kelgan bo'lsa ham. Bu — ustuvorlik navbati (Priority Queue): navbat tartibi kelish vaqtiga emas, muhimlikka qarab belgilanadi.

Go'da bu tuzilmani qo'lda yozish o'rniga, standart kutubxonadagi container/heap paketi ishlatiladi. Siz esa faqat "qanday solishtirish kerak"ni (Less metodi orqali) aytib berasiz, qolgan murakkab ishni ("eng muhimini tepada saqlash") paket o'zi bajaradi.

example.go
package main

import (
	"container/heap"
	"fmt"
)

type IntHeap []int

func (h IntHeap) Len() int           { return len(h) }
func (h IntHeap) Less(i, j int) bool { return h[i] < h[j] } // kichikroq — muhimroq
func (h IntHeap) Swap(i, j int)      { h[i], h[j] = h[j], h[i] }

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

func (h *IntHeap) Pop() interface{} {
	old := *h
	n := len(old)
	item := old[n-1]
	*h = old[:n-1]
	return item
}

func main() {
	h := &IntHeap{5, 2, 8}
	heap.Init(h)
	heap.Push(h, 1)

	for h.Len() > 0 {
		fmt.Println(heap.Pop(h))
	}
}

heap.Init va heap.Push/heap.Pop — bu paketning "tashqi" funksiyalari, ular sizning IntHeapingizni ichkarida qayta tartiblab turadi. Sizning vazifangiz — beshta metod yozish: Len, Less ("kim muhimroq"), Swap ("ikkitasini almashtirish"), Push va Pop. Bu — Go'ning "interfeys orqali xatti-harakat belgilash" tamoyilining amaliy namunasi (heap.Interfaceni amalga oshirasiz).

Less(i, j int) bool — "kichikroq son muhimroq" deb belgilangan, shuning uchun bu min-heap: eng kichik son har doim birinchi chiqadi. Natijada 5, 2, 8, 1 qo'shilgan bo'lsa-da, chiqish tartibi 1, 2, 5, 8 — har doim eng kichigi tepada.

>_ Exercise

Max-heap (eng kattasi birinchi chiqadigan) yarating.

  • IntHeap'ning Less metodini o'zgartirib, kattaroq son muhimroq bo'lsin (max-heap)
  • {5, 2, 8} bilan boshlab, 10 ni Push qiling
  • barcha elementlarni Pop qilib, ketma-ket chop eting

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

Heap — eng muhim (eng kichik yoki eng katta) elementni har doim tez topish uchun ishlatiladi; Go'da container/heap paketiga faqat solishtirish qoidasini (Less) berish kifoya.

NEXT UP

Graph Representation

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

Heap and Priority Queue

Heap va ustuvorlik navbati

Shifoxona qabulxonasini tasavvur qiling: kim birinchi kelgan bo'lsa, o'sha birinchi ko'rilmaydi — eng og'ir holatdagi bemor birinchi ko'riladi, garchi u eng oxirida kelgan bo'lsa ham. Bu — ustuvorlik navbati (Priority Queue): navbat tartibi kelish vaqtiga emas, muhimlikka qarab belgilanadi.

Go'da bu tuzilmani qo'lda yozish o'rniga, standart kutubxonadagi container/heap paketi ishlatiladi. Siz esa faqat "qanday solishtirish kerak"ni (Less metodi orqali) aytib berasiz, qolgan murakkab ishni ("eng muhimini tepada saqlash") paket o'zi bajaradi.

example.go
package main

import (
	"container/heap"
	"fmt"
)

type IntHeap []int

func (h IntHeap) Len() int           { return len(h) }
func (h IntHeap) Less(i, j int) bool { return h[i] < h[j] } // kichikroq — muhimroq
func (h IntHeap) Swap(i, j int)      { h[i], h[j] = h[j], h[i] }

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

func (h *IntHeap) Pop() interface{} {
	old := *h
	n := len(old)
	item := old[n-1]
	*h = old[:n-1]
	return item
}

func main() {
	h := &IntHeap{5, 2, 8}
	heap.Init(h)
	heap.Push(h, 1)

	for h.Len() > 0 {
		fmt.Println(heap.Pop(h))
	}
}

heap.Init va heap.Push/heap.Pop — bu paketning "tashqi" funksiyalari, ular sizning IntHeapingizni ichkarida qayta tartiblab turadi. Sizning vazifangiz — beshta metod yozish: Len, Less ("kim muhimroq"), Swap ("ikkitasini almashtirish"), Push va Pop. Bu — Go'ning "interfeys orqali xatti-harakat belgilash" tamoyilining amaliy namunasi (heap.Interfaceni amalga oshirasiz).

Less(i, j int) bool — "kichikroq son muhimroq" deb belgilangan, shuning uchun bu min-heap: eng kichik son har doim birinchi chiqadi. Natijada 5, 2, 8, 1 qo'shilgan bo'lsa-da, chiqish tartibi 1, 2, 5, 8 — har doim eng kichigi tepada.

>_ Exercise

Max-heap (eng kattasi birinchi chiqadigan) yarating.

  • IntHeap'ning Less metodini o'zgartirib, kattaroq son muhimroq bo'lsin (max-heap)
  • {5, 2, 8} bilan boshlab, 10 ni Push qiling
  • barcha elementlarni Pop qilib, ketma-ket chop eting

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

Heap — eng muhim (eng kichik yoki eng katta) elementni har doim tez topish uchun ishlatiladi; Go'da container/heap paketiga faqat solishtirish qoidasini (Less) berish kifoya.

NEXT UP

Graph Representation