- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试在标准 ML 中实现图算法,但前提是唯一允许的效果是改变引用单元格。禁止异常(exception)和不终止。标准 ML 本身对这个问题并不重要。我会接受任何其他类型化编程语言的答案,只要它满足我的约束。 (不幸的是,无类型语言已经过时了:检查数据的格式是否正确以及潜在的失败本身就是我想要避免的影响。)
我将通过实现 Kosaraju 的算法来说明如何在我的约束下进行编程。我的问题是 Tarjan 的强连通分量算法是否也可以用这种方式实现。
datatype 'a node = Node of 'a * bool ref * 'a node list ref * 'a node list ref
fun node x = Node (x, ref false, ref nil, ref nil)
fun mark (Node (_, r, _, _)) = !r before r := true
fun unmark (Node (_, r, _, _)) = !r before r := false
fun value (Node (x, _, _, _)) = x
fun sources (Node (_, _, ref xs, _)) = xs
fun targets (Node (_, _, _, ref ys)) = ys
fun connect (m, n) =
let
val Node (_, _, _, ns) = m
val Node (_, _, ms, _) = n
in
ms := m :: !ms;
ns := n :: !ns
end
datatype 'a state = Root of 'a node | Children of 'a node list
fun visit (xs, nil) = xs
| visit (xs, Root x :: ss) = visit (x :: xs, ss)
| visit (xs, Children nil :: ss) = visit (xs, ss)
| visit (xs, Children (y :: ys) :: ss) =
if mark y then
visit (xs, Children ys :: ss)
else
visit (xs, Children (targets y) :: Root y :: Children ys :: ss)
fun assign (xs, nil) = xs
| assign (xs, nil :: ss) = assign (xs, ss)
| assign (xs, (x :: s) :: ss) =
if unmark x then
assign (x :: xs, sources x :: s :: ss)
else
assign (xs, s :: ss)
fun assigns (xs, nil) = xs
| assigns (xs, y :: ys) =
case assign (nil, (y :: nil) :: nil) of
nil => assigns (xs, ys)
| x => assigns (x :: xs, ys)
fun kosaraju xs = assigns (nil, visit (nil, Children xs :: nil))
是否有可能以这种方式实现 Tarjan 的强连通分量算法?
最佳答案
我这里有一个开源项目可以生成离散有限自动机:https://github.com/mtimmerm/dfalex
它包括 Tarjan 算法的实现,其风格与您想要的有点相似,但 DFS 函数采用 3 个 lambda:
/**
* Perform a depth first search of all states, starting at the start states
* <P>
* To avoid stack overflow errors on large DFAs, the implementation uses an auxiliary
* stack on the heap instead of recursing
*
* @param onEnter called with (parent, child) when a child is entered. parent == null for roots.
* @param onSkip called with (parent, child) when a child is skipped because it has been entered
* previously. parent == null for roots.
* @param onLeave called with (parent, child) when a child is exited. parent == null for roots.
*/
public void depthFirstSearch(
BiConsumer<DfaState<MATCHRESULT>, DfaState<MATCHRESULT>> onEnter,
BiConsumer<DfaState<MATCHRESULT>, DfaState<MATCHRESULT>> onSkip,
BiConsumer<DfaState<MATCHRESULT>, DfaState<MATCHRESULT>> onLeave)
{
Tarjan的算法在这个文件的第200行,一个方法调用“getCycleNumbers”:
您对访客的定义不支持所有这 3 种不同类型的事件。它只提供“onEnter”。它们都是 Tarjan 算法所必需的。 是可以从您得到的东西中重构它们,但这比只编写一个提供所有 3 个的新 DFS 更复杂。
关于algorithm - 在不依赖潜在故障的情况下实现 Tarjan 的强连接组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58550827/
1、前言 在数字化时代,自动化工具成为了提升工作效率和生产力的重要手段。Python作为一种广泛使用的编程语言,以其强大的功能和易用性受到许多开发者的青睐。 而今天给大家推荐一款开源的自动化脚本工具
我有一个 UIViewController,它引用了一个重复调用闭包的 Timer 对象。 Timer 对象在其 block 中捕获 self。据我所知,这会导致 View Controller 和
在当今软件开发的快速迭代中,接口自动化测试已成为确保代码质量和服务稳定性的关键步骤。 随着微服务架构和分布式系统的广泛应用,对接口自动化测试平台的需求也日益增长。 今天,我将为大家推荐一款强大的开
这个问题在这里已经有了答案: Is Python strongly typed? (13 个答案) 关闭 9 年前。 我了解到 Python 是一种强动态类型的语言。 动态:变量的类型在执行时确定,
想象以下使用手动内存管理(也称为非 ARC)的场景: 我有一个将 block 传递给类方法的 VC。在执行 block 之前,VC 从 UINavigationController 中弹出。 __bl
我已阅读this article关于Java中不同类型的引用(强引用、软引用、弱引用、幻像引用),但我不太理解。 这些引用类型之间有什么区别?每种类型何时使用? 最佳答案 Java 提供了两种不同类型
我需要两个选择器: 一个用于 h2 元素中的普通文本 还有一个用于 strong 标记内的文本 第一个是与: 选择器:'h2.flashHeader' 但是 选择器:'h2.flashHeader S
`我承认我不是 ARC 和保留周期方面的专家,尽管通过一些研究和一些很棒的文章(如 this),我相信我已经掌握了基础知识。 但是,我现在很困惑。我有一个属性定义如下。 @property (nona
就像这是非原子的 COPY 的 Setter @property (copy, nonatomic) NSString *someString; -(void)setSomeString:(NSStr
我有一个按钮的以下操作,它切换一个对象是显示为最喜欢的还是不最喜欢的: - (IBAction)addToFavorites:(UIButton *)sender { if ([object is
这个问题在这里已经有了答案: How to make my font bold using css? (10 个答案) 关闭 3 个月前。 在我网页上的整个文本和标题中,我需要将某些词加粗,而其他词
在我的项目中,我使用了 Storyboard,当我访问一个 UI 元素时,我创建了一个属性并将其链接。这个属性很弱。据我了解,该属性可能很弱,因为它已经添加到 View 中并且 View 保留了它。
我正在寻找有关 TLS/SSL 密码套件强度的信息。 例如,当在 chrome 上按 F12 时,会出现一个包含密码协议(protocol)和套件信息的安全概览选项卡。 Chrome 安全选项卡示例:
我使用 Xcode 中的分析工具(分配)发现的是,当您清零一个属性时,它不会被释放,直到父类被清空。现在假设你想确保你不会在内存中保留一个昂贵的模态视图 Controller (假设它不会经常使用),
下面的 Parent 类具有对单个子对象的强引用和弱引用。永远不会释放子对象。移除弱引用, child 就被释放了。 需要调用 Mirror 方法来进行此泄漏,但我不明白为什么使用 Mirror 会导
大家好,我是狂师! 今天给大家推荐一款开源的HTTP测试工具:Hurl,相比curl、wget功能更强大,且更容易上手、很适用新手使用。 1、项目介绍 Hurl是一个使用Rust语言开发的命令行
当我从 Storyboard 控制拖动导出时,默认情况下我得到了 strong 属性。我正在使用 Xcode 9.4.1 .以下代码是它的样子。是不是因为 XCode 与 Swift 兼容,所以在 S
这两个Objective-C声明之间有什么区别? 我一直在看一些Apple源代码示例,他们在各种情况下都使用了第二个示例。我只是想了解为什么和何时最好使用第二个版本而不是第一个版本(我知道 stron
我已经在 AWS Linux 实例上安装了 Strong-pm: [root@box]# npm -g install strongloop strong-pm [root@box]# sl-pm-i
我似乎还没有遇到问题,但我正在努力确保我使用了一些最佳实践。 假设我有一个 UITableViewController,它的数据源是 MyObject 对象的 NSArray。所以在我的 UITabl
我是一名优秀的程序员,十分优秀!