Sobes.tech
Middle

Kā darbojas meža meklēšana?

sobes.tech AI

Atbilde no AI

Meža meklēšana ir atkarīga no tā struktūras un meklēšanas mērķa.

Galvenie meklēšanas veidi:

  1. Dziļuma meklēšana (DFS - Depth-First Search): dodas maksimāli dziļi vienā zarā, pirms pāriet uz blakus esošo. Realizē ar steku (tieši vai rekursijas veidā).

    • Priekšējā apmeklējuma (Pre-order): apmeklēt sakni, tad kreiso koku, tad labo koku.
    • In-order apmeklējums (In-order): apmeklēt kreiso koku, tad sakni, tad labo koku. Izmanto, lai iegūtu sakārtotu elementu sarakstu no binārajiem mežiem.
    • Pēcapmeklējums (Post-order): apmeklēt kreiso koku, tad labo koku, tad sakni.
  2. Plašuma meklēšana (BFS - Breadth-First Search): izpēta visus kaimiņus esošajā mezglā vienā līmenī, pirms pāriet uz nākamo līmeni. Realizē ar rindu.

Piemērs DFS (In-order) bināram kokam:

// TreeNode pārstāv bināro koku mezglu
type TreeNode struct {
	Val   int
	Left  *TreeNode
	Right *TreeNode
}

// InOrderTraversal veic in-order apmeklējumu
func InOrderTraversal(root *TreeNode) []int {
	var result []int
	if root == nil {
		return result
	}

	// Rekursīvs izsaukums kreisajam kokam
	result = append(result, InOrderTraversal(root.Left)...)
	// Apmeklēt pašreizējo mezglu
	result = append(result, root.Val)
	// Rekursīvs izsaukums labajam kokam
	result = append(result, InOrderTraversal(root.Right)...)

	return result
}

Piemērs BFS:

// TreeNode pārstāv bināro koku mezglu
type TreeNode struct {
	Val   int
	Left  *TreeNode
	Right *TreeNode
}

// BFSTraversal veic BFS apmeklējumu
func BFSTraversal(root *TreeNode) []int {
	var result []int
	if root == nil {
		return result
	}

	// rinda, kas satur mezglus pašreizējā līmenī
	queue := []*TreeNode{root}

	for len(queue) > 0 {
		// izņem pirmo elementu no rindas
		node := queue[0]
		queue = queue[1:]

		// pievieno mezgla vērtību rezultātam
		result = append(result, node.Val)

		// ja ir kreisais bērns, pievieno to rindai
		if node.Left != nil {
			queue = append(queue, node.Left)
		}
		// ja ir labais bērns, pievieno to rindai
		if node.Right != nil {
			queue = append(queue, node.Right)
		}
	}
	return result
}

Bināro mežu (BST), kur kreisais mazāks par sakni, bet labais lielāks:

  1. Binārā meklēšana: meklējot konkrētu vērtību, salīdzina to ar sakni. Ja vērtība ir mazāka, meklē kreisajā zarā; ja lielāka, labajā. Šī ir efektīvākā meklēšanas stratēģija BST.
// TreeNode pārstāv bināro meklēšanas koku
type TreeNode struct {
	Val   int
	Left  *TreeNode
	Right *TreeNode
}

// SearchBST veic bināro meklēšanu BST
func SearchBST(root *TreeNode, target int) *TreeNode {
	if root == nil || root.Val == target {
		return root // mezgls atrasts vai koks tukšs
	}

	if target < root.Val {
		// meklēt kreisajā zarā
		return SearchBST(root.Left, target)
	}
	// meklēt labajā zarā
	return SearchBST(root.Right, target)
}

Meklēšanas algoritma izvēle ir atkarīga no uzdevuma un koka īpašībām. DFS ir piemērots, ja nepieciešams dziļi izpētīt vienu zarojumu vai atrast ceļu līdz mērķim. BFS ir piemērots īsākā ceļa meklēšanai vai līmeņu pārskatīšanai. Binārā meklēšana ir efektīva, meklējot konkrētu vērtību sakārtotās struktūrās, piemēram, BST.