【问题标题】:How to link LinkedList nodes to map values如何链接 LinkedList 节点以映射值
【发布时间】:2019-06-06 20:03:34
【问题描述】:

我想实现一个图数据结构,其中每个节点用以下方式表示:

type Node struct {
    root  string
    links []*Node
}

基本上每个节点都有一个值root 和一个链接列表,对于每个链接a 只想存储一个指向它的指针,因为结构的内存将由映射分配和拥有:

rooturl := "root"
graph := Node{rooturl, []*Node{}}
graphMap := make(map[string]Node)
graphMap[rooturl] = graph

当我尝试将指针附加到新创建的节点时出现问题:

u := "new node"
// if the link is not stored in the graph not create a new node
if _, exists := graphMap[u]; !exists {
    graphMap[u] = Node{u, []*Node{}}
}
// add the links to the graph
graphMap[rooturl].links = append(graphMap[rooturl].links, &graphMap[u])

我收到两个错误:

不能分配给结构字段graphMap[rooturl].links in map

不能取graphMap[u]的地址

我应该如何正确解决这个问题? 我还希望在附加时需要使用graphMap[rooturl].links 查询地图两次(但由于我无法获取指针或对它的引用,我不知道如何)

【问题讨论】:

    标签: dictionary pointers go linked-list


    【解决方案1】:

    您尝试实现的目标不可能以您的方式实现。这是关于可寻址性可分配性。您应该搜索此关键字的语言规范。映射值不可寻址,因此该值中的 struct 字段不可分配。此外,至少对我而言,您的数据结构设计看起来效率不高。

    在我看来,没有理由将值存储在地图中,引用就足够了

    type Node struct {
        root  string
        links []*Node
    }
    //////
    rooturl := "root"
    graph := Node{rooturl, []*Node{}}
    graphMap := make(map[string]*Node)
    graphMap[rooturl] = &graph
    u := "new node"
    // if the link is not stored in the graph not create a new node
    if _, exists := graphMap[u]; !exists {
        graphMap[u] = &Node{u, []*Node{}}
    }
    // add the links to the graph
    graphMap[rooturl].links = append(graphMap[rooturl].links, graphMap[u])
    

    Working example

    如果您更喜欢将实际值保留在地图中,则根本不需要树结构。它看起来像不需要的开销。存储在地图中的信息足以进行任何操作。

    type Node string
    type Graph map[Node][]Node
    ////
    rooturl := Node("root")
    graph := make(Graph)
    graph[rooturl] = make([]Node, 0)
    u := Node("new node")
    // if the link is not stored in the graph not create a new node
    if node, exists := graph[u]; !exists {
        graph[u] = make([]Node, 0)
        graph[rooturl] = append(graph[rooturl], u)
    }
    

    Working example

    【讨论】:

    • 在第二种情况下,内存使用将成为一个问题,您保留多个节点副本,这是一个字符串而不是简单的指针。
    【解决方案2】:

    由于 go 是一种垃圾收集语言,因此您实际上并不需要映射“拥有”节点内存的概念。您可以只在地图中存储指针。

    https://play.golang.org/p/DpcsIqg0Trx

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-09
      • 1970-01-01
      • 2011-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多