【发布时间】: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 class 和 underlying 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