GoDasturchi
Implementing a Trie

Implementing a Trie

Trie'ni amalga oshirish

Oldingi darsda ko'rgan g'oyani endi Go kodiga aylantiramiz. Har bir tugun — bolalar xaritasi (map[rune]*TrieNode, chunki har bir "bola" muayyan bir harfga mos keladi) va isEnd bayrog'idan iborat bo'ladi.

example.go
package main

import "fmt"

type TrieNode struct {
	children map[rune]*TrieNode
	isEnd    bool
}

func newTrieNode() *TrieNode {
	return &TrieNode{children: make(map[rune]*TrieNode)}
}

type Trie struct {
	root *TrieNode
}

func NewTrie() *Trie {
	return &Trie{root: newTrieNode()}
}

func (t *Trie) Insert(word string) {
	node := t.root
	for _, ch := range word {
		if node.children[ch] == nil {
			node.children[ch] = newTrieNode()
		}
		node = node.children[ch]
	}
	node.isEnd = true
}

func main() {
	t := NewTrie()
	t.Insert("go")
	t.Insert("gopher")
	fmt.Println(t.root.children['g'].children['o'].isEnd)
}

Insert so'zning har bir harfi (rune) bo'yicha yuradi: agar joriy tugunda shu harf uchun "bola" hali yo'q bo'lsa, yangisini yaratadi; bor bo'lsa, borini ishlatadi. Sikl tugagach (barcha harflar "bosib o'tilgach"), oxirgi tugunga isEnd = true belgilanadi — "aynan shu yergacha bo'lgan yo'l to'liq bir so'z" deb belgilash.

"go" va "gopher" qo'shilgach, g -> o yo'li ikkalasida ham bir xil, umumiy tugunlardan iborat — Trie ularni ikki marta emas, bir marta saqlaydi. Shuning uchun root.children['g'].children['o'].isEndtrue, chunki "go" aynan shu yerda tugaydi (garchi undan keyin ham "gopher" uchun yo'l davom etsa ham).

>_ Exercise

Trie'ga Search va StartsWith metodlarini qo'shing.

  • Search(word string) bool — so'z to'liq mavjudligini tekshiring (isEnd true bo'lishi shart)
  • StartsWith(prefix string) bool — biror so'z shu prefiks bilan boshlanishini tekshiring (isEnd shart emas)
  • "go" va "gopher"ni qo'shib, Search("go"), Search("gop") va StartsWith("gop") natijalarini chop eting

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

Search va StartsWith bir xil "yo'l bosib o'tish" mantig'iga asoslanadi — farqi faqat oxirida isEnd bayrog'i tekshiriladimi yo'qmi.

NEXT UP

Race Conditions in Data Structures

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

Implementing a Trie

Trie'ni amalga oshirish

Oldingi darsda ko'rgan g'oyani endi Go kodiga aylantiramiz. Har bir tugun — bolalar xaritasi (map[rune]*TrieNode, chunki har bir "bola" muayyan bir harfga mos keladi) va isEnd bayrog'idan iborat bo'ladi.

example.go
package main

import "fmt"

type TrieNode struct {
	children map[rune]*TrieNode
	isEnd    bool
}

func newTrieNode() *TrieNode {
	return &TrieNode{children: make(map[rune]*TrieNode)}
}

type Trie struct {
	root *TrieNode
}

func NewTrie() *Trie {
	return &Trie{root: newTrieNode()}
}

func (t *Trie) Insert(word string) {
	node := t.root
	for _, ch := range word {
		if node.children[ch] == nil {
			node.children[ch] = newTrieNode()
		}
		node = node.children[ch]
	}
	node.isEnd = true
}

func main() {
	t := NewTrie()
	t.Insert("go")
	t.Insert("gopher")
	fmt.Println(t.root.children['g'].children['o'].isEnd)
}

Insert so'zning har bir harfi (rune) bo'yicha yuradi: agar joriy tugunda shu harf uchun "bola" hali yo'q bo'lsa, yangisini yaratadi; bor bo'lsa, borini ishlatadi. Sikl tugagach (barcha harflar "bosib o'tilgach"), oxirgi tugunga isEnd = true belgilanadi — "aynan shu yergacha bo'lgan yo'l to'liq bir so'z" deb belgilash.

"go" va "gopher" qo'shilgach, g -> o yo'li ikkalasida ham bir xil, umumiy tugunlardan iborat — Trie ularni ikki marta emas, bir marta saqlaydi. Shuning uchun root.children['g'].children['o'].isEndtrue, chunki "go" aynan shu yerda tugaydi (garchi undan keyin ham "gopher" uchun yo'l davom etsa ham).

>_ Exercise

Trie'ga Search va StartsWith metodlarini qo'shing.

  • Search(word string) bool — so'z to'liq mavjudligini tekshiring (isEnd true bo'lishi shart)
  • StartsWith(prefix string) bool — biror so'z shu prefiks bilan boshlanishini tekshiring (isEnd shart emas)
  • "go" va "gopher"ni qo'shib, Search("go"), Search("gop") va StartsWith("gop") natijalarini chop eting

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

Search va StartsWith bir xil "yo'l bosib o'tish" mantig'iga asoslanadi — farqi faqat oxirida isEnd bayrog'i tekshiriladimi yo'qmi.

NEXT UP

Race Conditions in Data Structures