GoDasturchi
Breadth-First Search (BFS)

Breadth-First Search (BFS)

Kenglik bo'yicha qidiruv (BFS)

Suvga tosh tashlaganingizda hosil bo'lgan to'lqinlarni tasavvur qiling: markazdan boshlab, bir xil masofadagi hamma nuqtaga birdek tarqaladi, keyin bir qadam uzoqroqqa, va hokazo. Breadth-First Search (BFS, "kenglik bo'yicha qidiruv") — grafni aynan shu tarzda kezib chiqadi: avval boshlang'ich nuqtaning bevosita qo'shnilari, keyin ularning qo'shnilari, va hokazo — "qatlama-qatlam".

BFS'ning eng katta afzalligi: agar barcha bog'lanishlar "bir xil uzunlikda" deb hisoblansa, u ikkita uch orasidagi eng qisqa yo'lni kafolatlangan tarzda topadi — chunki u yaqinroq nuqtalarni uzoqroqlaridan oldin ko'radi.

example.go
package main

import "fmt"

func bfs(graph map[string][]string, start string) []string {
	visited := map[string]bool{start: true}
	queue := []string{start} // "Queue Implementation" darsidagi Queue tuzilmasi
	var order []string

	for len(queue) > 0 {
		node := queue[0]
		queue = queue[1:]
		order = append(order, node)

		for _, neighbor := range graph[node] {
			if !visited[neighbor] {
				visited[neighbor] = true
				queue = append(queue, neighbor)
			}
		}
	}
	return order
}

func main() {
	graph := map[string][]string{
		"A": {"B", "C"},
		"B": {"D"},
		"C": {"D"},
		"D": {},
	}
	fmt.Println(bfs(graph, "A"))
}

Diqqat qiling: bu yerda queue — aynan "Queue Implementation" darsida yasagan FIFO tuzilmaning o'zi (bu yerda oddiy slice bilan qisqartirilgan ko'rinishda). BFS'ning "qatlama-qatlam" tabiati aynan shu Queue tufayli ta'minlanadi: yangi qo'shnilar navbatning oxiriga qo'shiladi, va biz doim navbatning boshidan olamiz — shuning uchun yaqinroq (avvalroq qo'shilgan) uchlar birinchi ko'riladi.

visited xaritasi ham juda muhim: uni ishlatmasak, A -> B -> A -> B -> ... kabi cheksiz aylanaga tushib qolishimiz mumkin edi (agar grafda tsikl bo'lsa). Har bir uchni faqat bir marta navbatga qo'shish — bu muammoning oldini oladi.

>_ Exercise

BFS yordamida ikkita uch orasidagi masofani (qadamlar sonini) hisoblang.

  • bfsDistance(graph map[string][]string, start, target string) int yozing
  • visited xaritasida masofani ham saqlang (masalan map[string]int)
  • "A"dan "D"gacha bo'lgan masofani chop eting (yuqoridagi graf bilan)

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

BFS Queue (FIFO) yordamida grafni "qatlama-qatlam" kezadi va bir xil uzunlikdagi bog'lanishlar bo'lganda eng qisqa yo'lni kafolatlangan tarzda topadi.

NEXT UP

Depth-First Search (DFS)

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

Breadth-First Search (BFS)

Kenglik bo'yicha qidiruv (BFS)

Suvga tosh tashlaganingizda hosil bo'lgan to'lqinlarni tasavvur qiling: markazdan boshlab, bir xil masofadagi hamma nuqtaga birdek tarqaladi, keyin bir qadam uzoqroqqa, va hokazo. Breadth-First Search (BFS, "kenglik bo'yicha qidiruv") — grafni aynan shu tarzda kezib chiqadi: avval boshlang'ich nuqtaning bevosita qo'shnilari, keyin ularning qo'shnilari, va hokazo — "qatlama-qatlam".

BFS'ning eng katta afzalligi: agar barcha bog'lanishlar "bir xil uzunlikda" deb hisoblansa, u ikkita uch orasidagi eng qisqa yo'lni kafolatlangan tarzda topadi — chunki u yaqinroq nuqtalarni uzoqroqlaridan oldin ko'radi.

example.go
package main

import "fmt"

func bfs(graph map[string][]string, start string) []string {
	visited := map[string]bool{start: true}
	queue := []string{start} // "Queue Implementation" darsidagi Queue tuzilmasi
	var order []string

	for len(queue) > 0 {
		node := queue[0]
		queue = queue[1:]
		order = append(order, node)

		for _, neighbor := range graph[node] {
			if !visited[neighbor] {
				visited[neighbor] = true
				queue = append(queue, neighbor)
			}
		}
	}
	return order
}

func main() {
	graph := map[string][]string{
		"A": {"B", "C"},
		"B": {"D"},
		"C": {"D"},
		"D": {},
	}
	fmt.Println(bfs(graph, "A"))
}

Diqqat qiling: bu yerda queue — aynan "Queue Implementation" darsida yasagan FIFO tuzilmaning o'zi (bu yerda oddiy slice bilan qisqartirilgan ko'rinishda). BFS'ning "qatlama-qatlam" tabiati aynan shu Queue tufayli ta'minlanadi: yangi qo'shnilar navbatning oxiriga qo'shiladi, va biz doim navbatning boshidan olamiz — shuning uchun yaqinroq (avvalroq qo'shilgan) uchlar birinchi ko'riladi.

visited xaritasi ham juda muhim: uni ishlatmasak, A -> B -> A -> B -> ... kabi cheksiz aylanaga tushib qolishimiz mumkin edi (agar grafda tsikl bo'lsa). Har bir uchni faqat bir marta navbatga qo'shish — bu muammoning oldini oladi.

>_ Exercise

BFS yordamida ikkita uch orasidagi masofani (qadamlar sonini) hisoblang.

  • bfsDistance(graph map[string][]string, start, target string) int yozing
  • visited xaritasida masofani ham saqlang (masalan map[string]int)
  • "A"dan "D"gacha bo'lgan masofani chop eting (yuqoridagi graf bilan)

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

BFS Queue (FIFO) yordamida grafni "qatlama-qatlam" kezadi va bir xil uzunlikdagi bog'lanishlar bo'lganda eng qisqa yo'lni kafolatlangan tarzda topadi.

NEXT UP

Depth-First Search (DFS)