首先遍历图广度,在 Haskell 中标记访问过的节点

2024-02-01

所以问题很简单。给定一个图(我希望图的结构在这个问题中并不重要),我该如何对其进行 BFS 呢?

我最近问了一个关于生成列表的问题,其中每个元素都将许多元素附加到其末尾。希望答案应该能让我创建一个执行 BFS 所需的队列。但是搜索还需要另一个关键组件,它将节点标记为已访问,因此我们不会再次遍历它们。这也不需要对算法的执行产生任何开销。既不标记也不阅读。

既然 Haskell 不允许我改变状态,我该怎么做呢?

(我并不是在寻找一种将我的命令式代码转换为 Haskell 的方法。惯用的 Haskell 解决方案会很棒。)


正如评论中提到的,正确的方法是将图与标记其节点分开。您需要使用某种集合容器。您基本上可以采取两种方法:

  1. 使用功能集。尽管每次修改都会创建一个新版本,但功能数据结构的设计使得只有很小的一部分实际上发生了变化,而大部分原始版本是共享的。插入/查找操作需要O(log n)对于这样的结构。但HashSet http://hackage.haskell.org/package/unordered-containers-0.2.3.3/docs/Data-HashSet.html from 无序容器针对速度进行了优化,并且对数的底很大,因此对于大多数用途来说,该因子就像常数。
  2. Use the ST http://www.haskell.org/haskellwiki/Monad/ST单子(另见这个问题 https://stackoverflow.com/q/12468622/1333025)。在 monad 内部,您可以使用可变数据结构,而结果仍然是引用透明的。然后你可以使用例如基于ST的哈希表 http://hackage.haskell.org/package/hashtables-1.1.2.1/docs/Data-HashTable-ST-Basic.html来自哈希表包裹。这可以让你摆脱log n在恒定时间内对哈希表进行分解和操作。但还有其他缺点,例如您的遍历必须是纯粹的。如果在其他一些 monad 中工作,您将无法将其与 ST 操作交错。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

首先遍历图广度,在 Haskell 中标记访问过的节点 的相关文章

随机推荐

  • seaborn distplot / 具有多个分布的 displot

    我正在使用seaborn 绘制分布图 我想用不同的颜色在同一个图上绘制多个分布 以下是我开始绘制分布图的方法 import numpy as np import pandas as pd from sklearn datasets impo
  • 使用继承来反 Postgres 中的反模式 (OTLT)

    我知道 一个真正的查找表 的概念是一种反模式 通常不应该使用 参考网上的许多文章 但是 我想知道当您在 Postgres 中使用表继承时 情况是否仍然如此 您永远不会读取或插入主查找表 它更多地充当其他查找表的模板 您不会失去任何引用完整性
  • 排列 - 所有可能的数字集

    我有从 0 到 8 的数字 我想要结果是这些数字的所有可能集合 每个集合应该使用所有数字 每个数字只能在集合中出现一次 我希望看到用 PHP 制作的可以打印结果的解决方案 或者 至少 我想对组合学理论有所了解 因为我早已忘记了它 计算有多少
  • 如何确定列表中的几个最小值?

    我有一个清单 其中至少有几个 some list 1 4 6 4 1 7 是否有内置函数或任何智能解决方案来获取最小值索引 result 0 4 到目前为止我是这样做的 但我更喜欢更短 更容易阅读的解决方案 min 10 10 result
  • 计划任务在 Windows Server 2008 R2 中不起作用

    我正在尝试通过 Windows Server 2008 R2 中的任务计划程序运行 cmd 我已从服务器计算机中管理员组中的用户登录到服务器 运行计划任务时 上次运行时间 当 状态 已准备就绪时 列的值为 0x1 但什么也没发生 运行 cm
  • Webpack 外部 React 导致 React Hooks 错误

    我是作者FireJS https github com eAdded FireJS 我遇到了一个issue https github com eAdded FireJS issues 4带有反应钩子 node 21793 Unhandled
  • 使用 AAD 身份验证提供程序获取当前登录的用户

    我有一个简单的网站 托管在 Azure 应用服务上 我在其中按照建议的快速设置启用了 AAD 身份验证here https learn microsoft com en us azure app service configure auth
  • 将字符串转换为 URL(为什么结果变量为 nil)

    我正在尝试从字符串值创建 URL 变量 我不明白为什么生成的 URL 为零 我已经设置了一个新的 Xcode macOS 项目 在视图上放置了一个简单的按钮 为该按钮创建了一个操作并实现了以下代码 结果 url 为零 我在 Swift Pl
  • 为什么我的 java 程序在编译时出现“找不到符号”错误?

    我试图在代码末尾返回布尔变量 localFound 的值 但是当我编译时 我收到一条错误 指出它找不到该符号 我知道这是一个处理变量范围的错误 但我不知道如何修复它 如何让我的程序返回正确的值 谢谢 public static boolea
  • 在 OSX 上安装和运行 MongoDB

    如果有人可以在这里提供一些见解 我将非常感激 我在 MongoDB 上成功本地运行了一个express node js 应用程序 但是在重新启动计算机后 我尝试重新启动 Mongo 服务器 但它开始出现错误并且无法启动 从那时起 我重新安装
  • 无法在 REFRESH_TOKEN_AUTH 验证客户端的秘密哈希值

    Problem REFRESH TOKEN AUTH 身份验证流程中的 无法验证客户端的秘密哈希 Error Code NotAuthorizedException Message Unable to verify secret hash
  • 如何在Android应用程序中接受蓝牙接收的文件?

    我想实现一个应用程序从蓝牙设备接收文件 在接收之前 将发出通知以接受传入的文件请求 从那里 我想激活 接受 并自动下载文件 当用户从另一个蓝牙配对设备接收第二个文件时 不会引发接受对话框 并且当用户启动应用程序时不会出现通知干扰 我开发了一
  • which.max 并将 colnames 值分配给 R 中的数据帧[重复]

    这个问题在这里已经有答案了 我想获取最大值并将列名分配回数据框 我试着循环它 有什么建议么 谢谢 new lt data frame id seq 1 5 att1 rnorm 5 1 att2 rnorm 5 1 att3 rnorm 5
  • Cordova 白名单 iOS 10 SSL 错误:无法加载资源:发生 SSL 错误,无法与服务器建立安全连接

    我正在尝试将 ArrayBuffer 发送到 https 1511921174 cloud vimeo com upload ticket id xxxxxxxxxx video file id xxxxxx signature xxxxx
  • 欧拉计划问题 36

    我准备好了我认为这很简单 像往常一样 我显然错了 我正在尝试用 Python 来完成此操作 因为我不懂 Python 我的代码如下 我得到 19 作为输出 这显然是不正确的 我不明白我错过了什么 任何建议 不更正代码 将不胜感激 我不需要正
  • 如何将带有时区的字符串转换为unix时间戳python? [复制]

    这个问题在这里已经有答案了 我有一个从数据库获取的日期时间字符串 我想将其转换为 unix 时间戳 我不知道该怎么做 db timestamp 2020 08 05 12 48 50 02 00 f Y m d H M S z timest
  • 强制转换为泛型类型 (T) 会给出“未经检查的强制转换”警告

    我在这里遇到了一个关于带有列表的泛型有界类型的小问题 请帮忙 模型 java public class Model A类 java public class ClassA
  • Yii2 登录失败时没有错误信息

    我目前正在使用 Yii2 框架 在登录页面中 当我登录失败时 它只会刷新视图 但不会显示任何错误 这是我目前的观点 div class site login div
  • 如何使用 Google Calendar API iOS Swift 创建事件

    我想开发一个演示应用程序 它将使用我的应用程序创建事件 使用 Google Calendar API 存储事件 然后获取所有数据并发出提醒 我已经提到过这个link https developers google com google ap
  • 首先遍历图广度,在 Haskell 中标记访问过的节点

    所以问题很简单 给定一个图 我希望图的结构在这个问题中并不重要 我该如何对其进行 BFS 呢 我最近问了一个关于生成列表的问题 其中每个元素都将许多元素附加到其末尾 希望答案应该能让我创建一个执行 BFS 所需的队列 但是搜索还需要另一个关