【问题标题】:Immutable graph-like structures in ScalaScala 中不可变的类图结构
【发布时间】:2012-04-11 02:26:10
【问题描述】:

美好的一天!我正在尝试在 Scala 2.9.1 中构建不可变图。 它是通过Seq[BO] 提供给我的,其中BO 可以代表图中的一个节点,BO.attr_bo: Seq[String] 代表其他节点的边,由字符串名称给出。我需要构建“已解析”图,由BO with ResolvedBO 表示 你可以在这里看到可能的实现:

trait BO {
  def name: String
  def attr_bo: Seq[String]
}

trait ResolvedBO {
  x: BO =>
  val uni: Universe
  lazy val r_attr_bo: Seq[BO with ResolvedBO] = attr_bo map (uni.m_list_r(_))
}

class S_BO(val name: String, val attr_bo: Seq[String]) extends BO

class Universe(list: Seq[BO]) {
  val m_list: Map[String, BO] = list.map(x => (x.name, x))(collection.breakOut)
  val m_list_r: Map[String, BO with ResolvedBO] = ...???
}

val x: Uni = new Uni(Seq(new S_BO("a", Seq("b", "c")), new S_BO("b", Seq("a", "c")), new S_BO("c", Seq("a", "b"))))

其中class Universe根本就代表graph(也可以断开一个) 另外,如果它很重要,我可以限制图形没有循环。

所以我的主要问题:

  1. 由于节点 (trait BO) 可以是相当复杂的对象,并且可以通过多种子类型来实现,那么实现“已解析节点”的最佳方式是什么 - 即直接链接到其他节点的节点? (BO with ResolvedBO)。
  2. 如果自己解析节点是最好的方法(trait ResolvedBO 中的lazy val r_attr_bo: Seq[BO with ResolvedBO] = attr_bo map (uni.m_list_r(_))),我如何在trait ResolvedBO 中初始化图的引用(val uni: Universe)?
  3. 在 Scala 中使用类图结构的最佳方式是什么?

谢谢

【问题讨论】:

    标签: scala graph immutability


    【解决方案1】:

    对于第 3 点,这取决于您对“最佳”含义的定义。我建议不要自己实现库,而是使用似乎适合您需求的scala-graph(不可变图)。

    如果您真的坚持编写自己的图形库(这是提高您在 Scala 中的知识的好方法),请尝试避免使用对象图(使用引用来表示连接)。而是选择具有通用操作的 Graph 类,例如:myGraph.neighborsOf( myVertex )

    一个很好的表示(易于实现但对于大图来说很慢)是将图表示为一组边。要添加新边,只需将新对象添加到集合中即可。要获得所有顶点的集合,您只需将边缘集展平即可。要获取顶点的邻居,您需要迭代每条边,等等。

    更快的解决方案是使用更复杂的表示形式,例如 Map,其中键是顶点,值是邻居集。

    查看 scala-graph 源代码以获得灵感。

    【讨论】:

    • 好吧,我只需要这种图形库中非常基本的功能,所以考虑自己实现它。但是感谢您指向 scalax-graph
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多