【问题标题】:Quick Union Functional Style [closed]快速联合功能样式[关闭]
【发布时间】:2017-12-12 05:52:20
【问题描述】:

我试图通过在 scala 中执行 Sedgewick 和 Wayne 的“算法的第 4 版”中的练习(并且尽我所知,以函数式风格),从而将学习与乐趣结合起来。

在练习 1.5.7 时我被屏蔽了,希望有人能帮助我。所以任务是编写 QuickUnion 实现。你可以找到Java implementation here

我已经编写了我的 scala 版本,这似乎是有道理的,但控制台输出完全令人沮丧。我正在创建一个包含 625 个初始组件的数组,但是......最后的组件数量是 .. 低于零

事不宜迟,这是我的实现:

package ca.vgorcinschi.algorithms1_5_7.quickUnionUF

import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global

class QuickUnionUF(size: Int) extends AbstractUF(size) {

  override val array = (0 to size).toArray

  override def find(p: Int): Int = {
    validate(p)
    Stream.iterate(p)(p => array(p)).dropWhile { _ != array(p) }.head
  }

  override def connected(p: Int, q: Int): Boolean = find(p) == find(q)

  override def union(p: Int, q: Int) = {
    /*
     * need to declare Futures outisde
     * for-comprehension loop to run in parallel
     */
    val fRootP = Future { find(p) }
    val fRootQ = Future { find(q) }

    for {
      rootP <- fRootP
      rootQ <- fRootQ
      if (rootP != rootQ)
    } {
      array(rootP) = rootQ
      count -= 1
    }
  }

}

abstract classunderlying trait 都在我的 github 存储库中。为了便于阅读,我在 Main 类下面复制:

import scala.io.Source
import ca.vgorcinschi.algorithms1_5_7.quickUnionUF.QuickUnionUF
import scala.util.matching.Regex

object Main extends App {
  val allLines = Source.fromFile("src/main/resources/mediumUF.txt").getLines().toList
  //get & print the initial number of components
  val size = allLines.head.trim.toInt
  println(s"Le nombre initial de composants est $size")

  val uf = new QuickUnionUF(size)

  val Integer = new Regex("(-)?(\\d+)")

  for (line <- allLines.tail) {
    val p = Integer findFirstIn line

    assert(p.isDefined)

    val intP = p.get toInt
    val q = Integer findFirstIn line.substring(p.get.length).replace("\\s+", "")

    assert(q.isDefined)

    val intQ = q.get.toInt
    if (!uf.connected(intP, intQ)) {
      uf.union(intP, intQ)
      println(s"L`union fait sur $intP et $intQ")
      println(s"Le nombre des composants est maintenant - ${uf.counter()}")
    }
  }
}

此外,这些是运行输出的第一行和最后一行:

> runMain Main
[info] Compiling 1 Scala source to /home/vgorcinschi/workspace-scala/Algorithms/Chapter 1 Fundamentals/algorithms1_5_7/target/scala-2.12/classes...
[info] Running Main 
Le nombre initial de composants est 625
L`union fait sur 528 et 503
Le nombre des composants est maintenant - 624
L`union fait sur 548 et 523
Le nombre des composants est maintenant - 623
L`union fait sur 389 et 414
Le nombre des composants est maintenant - 622
L`union fait sur 446 et 421
Le nombre des composants est maintenant - 621
L`union fait sur 552 et 553
Le nombre des composants est maintenant - 620
L`union fait sur 154 et 155
...
Le nombre des composants est maintenant - -67
L`union fait sur 463 et 464
Le nombre des composants est maintenant - -67
L`union fait sur 10 et 35
Le nombre des composants est maintenant - -67
L`union fait sur 619 et 594
Le nombre des composants est maintenant - -67
L`union fait sur 403 et 402
Le nombre des composants est maintenant - -67

我确实担心鞋子会在我的未来或基于流的查找周围的某个地方出现问题,但我似乎无法弄清楚......

【问题讨论】:

  • 不能很好地与 Eclipse 中的 Scala SDK 插件配合使用。但感谢您的“宝贵”评论。出色的专业知识:-)
  • eclipse 对 Scala 的支持很糟糕。获取智能。对于未来,讽刺不是在这里(或其他任何地方)寻求帮助的最佳方式。
  • 我强烈建议您在指责他人讽刺之前重新阅读您最初的评论。呼唤如此,回声亦如此。
  • @Dima “但我负担得起......” - 傲慢和自恋。这让我想起了奥威尔的“..所有动物都是平等的,但有些动物比其他动物更平等..”:-) 我怀疑你甚至读过这个问题,更不用说努力思考出了什么问题。 “尝试调试”是一个崇高的答复,可用于 99% 的 Stack Overflow 问题——包括您的问题。这是不愿提供帮助,而不是真正的答案。
  • 不,也不是。只是观察,你可以用蜂蜜比肥料捕捉更多的苍蝇。

标签: algorithm scala functional-programming sbt


【解决方案1】:

我想我明白了。这个解决方案很奇怪,因为它让我想知道原来的解决方案是如何工作的。基本上我只是重写了父类中的 counter() 以返回 array.distinct.length ,即不同的整数或根:

/*
 * takes the initial number of components
 * as its argument
 */
abstract class AbstractUF(var count: Int) extends UF{

  override def counter() = array.distinct.length

  val array: Array[Int]

...
}

输出:

Le nombre initial de composants est 625
L`union fait sur 528 et 503
Le nombre des composants est maintenant - 625
L`union fait sur 548 et 523
Le nombre des composants est maintenant - 624
L`union fait sur 389 et 414
Le nombre des composants est maintenant - 623
L`union fait sur 446 et 421
Le nombre des composants est maintenant - 622
L`union fait sur 552 et 553
Le nombre des composants est maintenant - 621
L`union fait sur 154 et 155
Le nombre des composants est maintenant - 620
...
Le nombre des composants est maintenant - 266
L`union fait sur 295 et 320
Le nombre des composants est maintenant - 266
L`union fait sur 160 et 159
Le nombre des composants est maintenant - 266
L`union fait sur 463 et 464
Le nombre des composants est maintenant - 266
L`union fait sur 10 et 35
Le nombre des composants est maintenant - 266
L`union fait sur 619 et 594
Le nombre des composants est maintenant - 265
L`union fait sur 403 et 402
Le nombre des composants est maintenant - 265

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-05
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    • 2019-07-12
    • 1970-01-01
    • 1970-01-01
    • 2013-02-08
    相关资源
    最近更新 更多