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.
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.
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
$ go run main.go
Kodingizni ishga tushiring