Kenglik bo'yicha qidiruv
Aylanib chiqish (traversal) — bu graf (Graph) yoki daraxtning barcha tugunlarini ziyorat qilishni anglatadi. Kenglik bo'yicha qidiruv (Breadth First Search - BFS) yoki kenglik bo'yicha aylanib chiqish — bu graf yoki daraxt ma'lumotlar tuzilmasining barcha cho'qqilarini qatlam-ba-qatlam ziyorat qilish uchun qo'llaniladigan navbatga (queue) asoslangan algoritm hisoblanadi.
Standart BFS algoritmi grafning har bir cho'qqisini ikkita toifadan biriga ajratadi:
Algoritmning asosiy maqsadi — sikllarga tushib qolmasdan har bir cho'qqini bir marta ziyorat qilingan deb belgilashdir.
BFS algoritmining ishlash tartibi:
[!NOTE] Agar graf bir-biri bilan tutashmagan bir nechta ajratilgan bo'laklardan iborat bo'lsa, barcha cho'qqilar qamrab olinishini ta'minlash uchun BFS har bir ziyorat qilinmagan cho'qqi uchun alohida ishga tushiriladi.
Keling, Breadth First Search algoritmining ishlashini 5 ta cho'qqidan iborat yo'naltirilmagan graf misolida tahlil qilaylik.

5 ta cho'qqiga ega yo'naltirilmagan graf
Biz 0-cho'qqidan boshlaymiz. BFS algoritmi uni ziyorat qilinganlar ro'yxatiga kiritadi va uning barcha qo'shni cho'qqilarini navbatga joylaydi.

Boshlang'ich cho'qqini ziyorat qilish va uning qo'shnilarini navbatga kiritish
Keyin navbat boshidagi birinchi elementni, ya'ni 1-cho'qqini navbatdan chiqaramiz va uning qo'shnilarini ko'rib chiqamiz. 0-cho'qqi allaqachon ziyorat qilingan, shuning uchun faqat yangi qo'shnilarni tekshiramiz.

0-tugunning birinchi qo'shnisi bo'lgan 1-cho'qqini ziyorat qilish
2-cho'qqi hali ziyorat qilinmagan 4-qo'shniga ega. Shuning uchun 4-cho'qqini navbatning orqa tomoniga qo'shamiz va navbatning boshida turgan 3-cho'qqini ziyorat qilamiz.

Navbatda turgan cho'qqilarni ketma-ket chiqarib ularning qo'shnilarini qo'shish

3-cho'qqining qo'shnilari allaqachon ziyorat qilingani sababli navbatda faqat 4 qoladi
Navbatda faqat 4-cho'qqi qoldi (chunki 3-cho'qqining yagona qo'shnisi 0 allaqachon ziyorat qilingan edi). Biz 4-cho'qqini ziyorat qilamiz:

Navbatdagi oxirgi qolgan elementni ziyorat qilish
Navbat bo'shab qolganligi sababli, graf bo'ylab kenglik bo'yicha aylanib chiqish muvaffaqiyatli yakunlandi.
create a queue Q
mark v as visited and put v into Q
while Q is non-empty:
remove the head u of Q
mark and enqueue all (unvisited) neighbours of u
// Go tilida Kenglik bo'yicha qidiruv (BFS) algoritmi
package main
import "fmt"
type Graph struct {
numVertices int
adjLists [][]int
}
func NewGraph(vertices int) *Graph {
return &Graph{
numVertices: vertices,
adjLists: make([][]int, vertices),
}
}
// Qirra qo'shish
func (g *Graph) AddEdge(src, dest int) {
g.adjLists[src] = append(g.adjLists[src], dest)
}
// Kenglik bo'yicha aylanib chiqish (BFS)
func (g *Graph) BFS(startVertex int) {
visited := make([]bool, g.numVertices)
queue := make([]int, 0)
visited[startVertex] = true
queue = append(queue, startVertex)
for len(queue) > 0 {
// Navbat boshidagi elementni olish
currVertex := queue[0]
queue = queue[1:]
fmt.Printf("%d ", currVertex)
// Barcha qo'shnilarini ko'rib chiqish
for _, neighbor := range g.adjLists[currVertex] {
if !visited[neighbor] {
visited[neighbor] = true
queue = append(queue, neighbor)
}
}
}
}
func main() {
g := NewGraph(4)
g.AddEdge(0, 1)
g.AddEdge(0, 2)
g.AddEdge(1, 2)
g.AddEdge(2, 0)
g.AddEdge(2, 3)
g.AddEdge(3, 3)
fmt.Println("2-cho'qqidan boshlangan BFS aylanib chiqish tartibi:")
g.BFS(2)
fmt.Println()
}O(V + E) ko'rinishida ifodalanadi, bu yerda V — grafning cho'qqilari soni, E — qirralar soni. Chunki har bir cho'qqi navbatga bir marta kiritiladi va chiqariladi, har bir qirra esa bir marta tekshiriladi.O(V). Eng yomon holatda navbatda barcha V ta cho'qqi saqlanishi mumkin.