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 に変更すると、Matricial の Matricial フィールドを削除するだけで、プログラムは同じ出力を生成します。

于 2013-10-17T18:56:23.887 に答える