From 795b11664f844ccf95b89324787f852890527507 Mon Sep 17 00:00:00 2001 From: Shevchenko Alexey Date: Wed, 20 Mar 2024 00:26:24 +0300 Subject: [PATCH] forced in-order nodes iteration --- go.mod | 2 +- node.go | 5 +++++ trie.go | 17 +++++++++++------ 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/go.mod b/go.mod index da9cdf7..364463f 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,3 @@ module github.com/s0rg/trie -go 1.21.0 +go 1.22 diff --git a/node.go b/node.go index 472fdf7..f846fbd 100644 --- a/node.go +++ b/node.go @@ -1,7 +1,10 @@ package trie +import "slices" + type node[T any] struct { childs map[rune]*node[T] + order []rune parent *node[T] value T ok bool @@ -37,6 +40,8 @@ func (n *node[T]) AddChild(r rune) (rv *node[T]) { rv.parent = n n.childs[r] = rv + n.order = append(n.order, r) + slices.Sort(n.order) return rv } diff --git a/trie.go b/trie.go index d0f6182..0f30f41 100644 --- a/trie.go +++ b/trie.go @@ -18,7 +18,9 @@ type Trie[T any] struct { // New creates empty Trie. func New[T any]() *Trie[T] { - return &Trie[T]{root: makeNode[T](rootNode)} + return &Trie[T]{ + root: makeNode[T](rootNode), + } } // Add inserts new key/value pair. @@ -61,8 +63,7 @@ func (t *Trie[T]) Del(key string) (ok bool) { } for ; n != nil; n = p { - p = n.Parent() - if p == nil { + if p = n.Parent(); p == nil { break } @@ -142,7 +143,7 @@ func (t *Trie[T]) Common(prefix string, minLength int) (rv []string) { return true }) - slices.SortStableFunc(rv, func(a, b string) int { + slices.SortFunc(rv, func(a, b string) int { sa, _ := t.Suggest(a) sb, _ := t.Suggest(b) @@ -193,7 +194,9 @@ func dfsValues[T any]( prefix string, handler func(key string, value T), ) { - for r, c := range n.childs { + for _, r := range n.order { + c := n.childs[r] + key := prefix + string(r) if c.HasValue() { @@ -209,7 +212,9 @@ func dfsKeys[T any]( prefix string, handler func(string, *node[T]) bool, ) { - for r, c := range n.childs { + for _, r := range n.order { + c := n.childs[r] + key := prefix + string(r) if !handler(key, c) {