我试图在内存中表示超图。除了嵌套矩阵之外,此任务是否有更好的数据结构?嵌套矩阵是一个矩阵,它可以包含“原生”类型的元素(为简单起见,假设int
)和矩阵。
这是这种矩阵的开始。代码中是否有粗糙的边缘,使它看起来更惯用?如何使它看起来更惯用?
代码:
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))
}
数据结构必须允许将超边距与其他超边距连接(即处理超边距,就好像它们是节点一样)。
答案 0 :(得分:1)
嵌套矩阵(采用您对术语的定义)似乎是超图的合理表示,无论如何都不了解您的应用程序。示例Go实现是Rosetta代码的power set示例。
嵌入接口不是惯用的。例如,如果你将Matricial的Put方法重命名为Set,这就是我认为你的意思,那么你可以删除Matrix的Matricial字段,你的程序会产生相同的输出。