1
  1. 我试图在内存中表示一个超图。除了嵌套矩阵,还有更好的数据结构来完成这项任务吗?嵌套矩阵是一个矩阵,它可以同时具有“本机”类型(int为了简单起见)和矩阵的元素。

  2. 这是这样一个矩阵的开始。代码中是否有任何粗糙的边缘,使其看起来更惯用?如何让它看起来更地道?

编码:

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))
}

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

4

1 回答 1

1
  1. 嵌套矩阵(采用您对术语的定义)似乎是超图的合理表示,无论如何对您的应用程序一无所知。一个示例 Go 实现是 Rosetta 代码中的幂集示例。

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

于 2013-10-17T18:56:23.887 回答