- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试翻译递归 python code for tarjan algorithm到 scala,尤其是这部分:
def tarjan_recursive(g):
S = []
S_set = set()
index = {}
lowlink = {}
ret = []
def visit(v):
index[v] = len(index)
lowlink[v] = index[v]
S.append(v)
S_set.add(v)
for w in g.get(v,()):
print(w)
if w not in index:
visit(w)
lowlink[v] = min(lowlink[w], lowlink[v])
elif w in S_set:
lowlink[v] = min(lowlink[v], index[w])
if lowlink[v] == index[v]:
scc = []
w = None
while v != w:
w = S.pop()
scc.append(w)
S_set.remove(w)
ret.append(scc)
for v in g:
print(index)
if not v in index:
visit(v)
return ret
我知道scala中有tarjan算法 here或here但它没有返回好的结果并从 python 翻译它帮助我理解它。
这是我所拥有的:
def tj_recursive(g: Map[Int,List[Int]])= {
var s : mutable.ListBuffer[Int] = new mutable.ListBuffer()
var s_set : mutable.Set[Int] = mutable.Set()
var index : mutable.Map[Int,Int] = mutable.Map()
var lowlink : mutable.Map[Int,Int]= mutable.Map()
var ret : mutable.Map[Int,mutable.ListBuffer[Int]]= mutable.Map()
def visit(v: Int):Int = {
index(v) = index.size
lowlink(v) = index(v)
var zz :List[Int]= gg.get(v).toList(0)
for( w <- zz) {
if( !(index.contains(w)) ){
visit(w)
lowlink(v) = List(lowlink(w),lowlink(v)).min
}else if(s_set.contains(w)){
lowlink(v)=List(lowlink(v),index(w)).min
}
}
if(lowlink(v)==index(v)){
var scc:mutable.ListBuffer[Int] = new mutable.ListBuffer()
var w:Int=null.asInstanceOf[Int]
while(v!=w){
w= s.last
scc+=w
s_set-=w
}
ret+=scc
}
}
for( v <- g) {if( !(index.contains(v)) ){visit(v)}}
ret
}
我知道这根本不是 scala 方式(而且不干净......),但我计划在第一个版本运行时慢慢将其更改为更实用的样式.
目前,我收到此错误:
type mismatch; found : Unit required: Int
在这一行
if(lowlink(v)==index(v)){
我认为它来自这条线,但我不确定:
if( !(index.contains(w))
但是调试它真的很难,因为我不能只打印我的错误......
谢谢!
最佳答案
这是 Python 的相当字面的翻译:
def tj_recursive(g: Map[Int, List[Int]])= {
val s = mutable.Buffer.empty[Int]
val s_set = mutable.Set.empty[Int]
val index = mutable.Map.empty[Int, Int]
val lowlink = mutable.Map.empty[Int, Int]
val ret = mutable.Buffer.empty[mutable.Buffer[Int]]
def visit(v: Int): Unit = {
index(v) = index.size
lowlink(v) = index(v)
s += v
s_set += v
for (w <- g(v)) {
if (!index.contains(w)) {
visit(w)
lowlink(v) = math.min(lowlink(w), lowlink(v))
} else if (s_set(w)) {
lowlink(v) = math.min(lowlink(v), index(w))
}
}
if (lowlink(v) == index(v)) {
val scc = mutable.Buffer.empty[Int]
var w = -1
while(v != w) {
w = s.remove(s.size - 1)
scc += w
s_set -= w
}
ret += scc
}
}
for (v <- g.keys) if (!index.contains(v)) visit(v)
ret
}
它会产生相同的输出,例如:
tj_recursive(Map(
1 -> List(2), 2 -> List(1, 5), 3 -> List(4),
4 -> List(3, 5), 5 -> List(6), 6 -> List(7),
7 -> List(8), 8 -> List(6, 9), 9 -> Nil
))
您的实现中最大的问题是 visit
的返回类型(应该是 Unit
,而不是 Int
),而且事实上您在最终的for
理解中迭代了图表的项目而不是图表的键,但为了风格和清晰度,我进行了许多其他编辑(同时仍然保持基本形状)。
关于python - Tarjan 算法 - Python 到 scala,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18289991/
本篇包含 tarjan 求强连通分量、边双连通分量、割点 部分, tarjan 求点双连通分量、桥(割边)在下一篇。 伟大的 Robert Tarjan 创造了众多被人们所熟知的算法及数据
我继续并 implemented textbook version of Tarjan's SCC algorithm在斯卡拉。然而,我不喜欢这个代码——它是非常命令式/程序性的,有很多变异状态和簿记
我有以下 Tarjan 算法的(递归)实现来查找图中的强连通分量,它工作正常: public class StronglyConnectedComponents { public static
我正在阅读 Tarjan's paper on scc . 在论文中,给定顶点的lowlink定义为: LOWLINK (v) is the smallest vertex which is in t
我最近学习了线性时间算法来计算图中的连接点。我的实现在 Online Judge 测试数据上正确运行,因此代码没有问题。然而,我似乎对 DFS 运行中同一个清晰点出现不止一个有一些困难。让我解释一下
我正在尝试实现 Tarjan 的强连通图算法 ( https://en.wikipedia.org/wiki/Tarjan%27s_strongly_connected_components_algo
每当我在任何图上运行 tarjans 算法时,它总是声称有一个循环,例如这个图: A -> B -> C 算法会告诉我有一个循环: [a] [b] 当有一个循环时,例如: A -> B -> C ->
我已经尝试从维基百科学习 Tarjan 的算法 3 个小时了,但我就是无法理解它。 :( http://en.wikipedia.org/wiki/Tarjan's_strongly_connecte
我正在尝试在标准 ML 中实现图算法,但前提是唯一允许的效果是改变引用单元格。禁止异常(exception)和不终止。标准 ML 本身对这个问题并不重要。我会接受任何其他类型化编程语言的答案,只要它满
我已经按照 Wikipedia's article 实现了 Tarjan 的算法但是我遇到了问题。我要做的是找到所有大小大于 1 的强连通分量。使用较小的输入,一切正常,但是,当使用 input.tx
我正在从这里学习 tarjan 的算法 Tarjan ,我有两个问题: 我们如何使用堆栈找到强连通组件? 为什么从以 V 为根的子树到它的祖先的后代应该没有回边? 最佳答案 要回答第二个问题,可以这样
我在学习Tarjan's algorithm for strongly-connected components它的工作方式对我来说很清楚。无论如何,有一行我不明白: // Consider succ
我正在尝试使用 Tarjan 算法确定有向图中的循环,该算法在他 1972 年 9 月的研究论文“有向图的基本电路枚举”中提出。 我正在使用 Python 编写算法代码,并使用邻接表来跟踪节点之间的关
我已经通过 http://learn.yancyparedes.net/2012/03/strongly-connected-components-using-tarjans-algorithm/ 的
我根据 wikipedia 实现了 Tarjan 的强连通分量算法,在 Python 中,但它不起作用。该算法很短,我找不到任何区别,所以我不知道为什么它不起作用。我试图查看原始论文,但找不到。 这是
我正在尝试翻译递归 python code for tarjan algorithm到 scala,尤其是这部分: def tarjan_recursive(g): S = []
这个问题在这里已经有了答案: Compile Error: Cannot Find Symbol (2 个答案) 关闭 7 年前。 我正在尝试从 wikipedia 运行 Tarjan java 实
我正在 Cheriton-Tarjan 算法中搜索加权最小生成树,时间复杂度为 O(m*loglogn)。但我无法在任何地方找到它。有人可以向我解释算法或告诉我在哪里可以找到它的链接吗? 最佳答案 是
我正在阅读 Donal B.Johnson 关于在有向图中查找所有基本电路的论文,http://www.cs.tufts.edu/comp/150GA/homeworks/hw1/Johnson%20
我正在阅读以下链接中的代码 http://www.cosc.canterbury.ac.nz/tad.takaoka/alg/graphalg/sc.txt我一直碰到“低链接”这个词,我不知道它是什么
我是一名优秀的程序员,十分优秀!