在golang中实现嵌套矩阵的惯用法

时间:2013-10-03 20:20:12

标签: data-structures matrix go graph-theory

  1. 我试图在内存中表示超图。除了嵌套矩阵之外,此任务是否有更好的数据结构?嵌套矩阵是一个矩阵,它可以包含“原生”类型的元素(为简单起见,假设int)和矩阵。

  2. 这是这种矩阵的开始。代码中是否有粗糙的边缘,使它看起来更惯用?如何使它看起来更惯用?

  3. 代码:

    package main
    
    import "fmt"
    
    type Matricial interface {
        Put(interface{}, ...int)
        Get(...int) interface{}
    }
    
    type Matrix struct {
        Matricial
        values map[int]interface{}
    }
    
    func NewMatrix() *Matrix {
        m := &Matrix{}
        m.values = make(map[int]interface{})
        return m
    }
    
    func (m *Matrix) Set(atom interface{}, pos ...int) {
        firstdim := pos[0]
        if val, ok := m.values[firstdim]; ok {
            fmt.Println("map key exists", val)
            switch converted := val.(type) {
            case int:
                m.values[firstdim] = converted
            default:
                fmt.Println("ERR: unknown type: %T", val)
            }
        } else {
            if len(pos[1:]) > 0 {
                newm := NewMatrix()
                m.values[firstdim] = newm
                newm.Set(atom, pos[1:]...)
            } else {
                m.values[firstdim] = atom
            }
        }
    }
    func (m *Matrix) Get(pos ...int) interface{} {
        if len(pos) == 1 {
            return m.values[pos[0]]
        } else {
            switch accessor := m.values[pos[0]].(type) {
            case Matricial:
                return accessor.Get(pos[1:]...)
            default:
                return nil
            }
        }
        return nil
    }
    
    func main() {
        m := NewMatrix()
        m.Set(42, 2, 3, 4)
        m.Set(43, 0)
        fmt.Println(m.Get(2, 3))
        fmt.Println(m.Get(2, 3, 4))
        fmt.Println(m.Get(0))
    }
    

    数据结构必须允许将超边距与其他超边距连接(即处理超边距,就好像它们是节点一样)。

1 个答案:

答案 0 :(得分:1)

  1. 嵌套矩阵(采用您对术语的定义)似乎是超图的合理表示,无论如何都不了解您的应用程序。示例Go实现是Rosetta代码的power set示例。

  2. 嵌入接口不是惯用的。例如,如果你将Matricial的Put方法重命名为Set,这就是我认为你的意思,那么你可以删除Matrix的Matricial字段,你的程序会产生相同的输出。