0

我试图通过 Go 语言制作 Trie 数据结构,但不知何故它遇到了引用问题,就是这样。http://play.golang.org/p/ASSGF5Oe9R

// Package main provides ...
package main

import "fmt"

type RootTrie []Trie

type Trie struct {
    subtrie []Trie
    index   byte
}

func (trie *Trie) Insert(data string) *Trie {
    if data != "" {
        if trie.index == 0 {
            trie.index = data[0]
        }
        if next := trie.containsIndex(data[1:]); next != nil {
            //Problem Point
            fmt.Println(string(data[1]), "found follwing", string(data[0]))
            next.Insert(data[1:])
        } else {
            nt := &Trie{}
            trie.subtrie = append(trie.subtrie, *nt.Insert(data[1:]))
        }
    }

    return trie
}
func (trie *Trie) containsIndex(next string) *Trie {
    if next != "" {
        for _, st := range trie.subtrie {
            if st.index == next[0] {
                return &st
            }
        }
    }
    return nil
}

func main() {
    t := &Trie{}
    t = t.Insert("hanyang")
    fmt.Println("result:", t)
    t = t.Insert("hanyKk")
    fmt.Println("result:", t)
    t.Insert("hanyK")
}

在我放置的第二个“插入”中发生以下问题,//Problem Point

我制作containsIndex了搜索下一个链接的特里树的方法,它实际上搜索得很好。但是当我更新给定的next属性时containsIndex,它并没有影响它的母结构trie

我不明白的是我在返回时给了它引用类型containsIndex,但它仍然像“复制值”一样,为什么它不影响它的母结构(trie)?

谢谢!

4

1 回答 1

3

问题出在方法 containsIndex 中。Golangrange默认情况下会在 slice 中创建每个元素的副本,并将该值的副本分配给st(在您的示例中)。通常要保留对切片中元素的引用,您应该使用原始切片及其索引。在您的情况下,方法 containsIndex 应如下所示:

func (trie *Trie) containsIndex(next string) *Trie {
    if next != "" {
        for i, st := range trie.subtrie {
            if st.index == next[0] {
                return &trie.subtrie[i]
            }
        }
    }
    return nil
}
于 2014-12-30T08:33:40.100 回答