【问题标题】:Condition to terminate BFS终止 BFS 的条件
【发布时间】:2021-01-04 11:21:30
【问题描述】:

我有这个任务,其中给出了一个元组列表,其中每个元组包含 2 个这样的字符串:

  • [ ("...","...") , ("...","...") , ("...","...") ... ]

我必须计算 最短路径,这将导致 extreme-string

extreme-string 定义为 2 个字符串的元组,其中第一个字符串等于第二个字符串。

我知道这听起来可能令人困惑,所以让我举个例子。

给定:

  • 列表 [("0","100") , ("01","00") , ("110","11")]
  • 索引为 0,1,2
  • 最短路径为:[2,1,2,0]
  • extreme-string 等于:“110011100”

分步说明:

  • 以索引 2 的元组开始,初始字符串为:"110","11"
  • 追加索引1的元组下一个字符串是:“11001”,“1100”
  • 附加索引2的元组下一个字符串是:“11001110”,“110011”
  • 附加索引0的元组最终字符串是:“110011100”,“110011100”

假设你从元组 ("X","Y") 开始,然后你选择元组 ("A","B") 然后结果是 ("XA","YB")。

我解决这个问题的方法是使用 BFS我已经实现了,这听起来对我来说是正确的,但我正在处理一个问题。

如果输入类似于:

  • [("1","111")]

那么算法将永远不会终止,因为它将始终处于“111...”-“111111111...”状态。

检查这个特定的输入不是一个好主意,因为有很多输入可以重现这个结果。

为迭代设置一个上限也不是一个好主意,因为在某些情况下,在迭代限制之后实际上可能存在有限的结果。

任何见解都会非常有用。

【问题讨论】:

  • 如何定义“极端字符串”?
  • @Hans 编辑了问题,定义就在里面。
  • 附带说明:存在解决方案的一个简单前提是输入列表需要至少一对,其中第一个字符串比第二个短,并且至少一对第一个字符串比第二个长;或者,如果所有字符串对的长度分别相等,则解决方案只能是其中的一个或多个。 (但这似乎有助于终止,AFAICS。)
  • 这让我一直很困惑——你有什么新见解吗?
  • @Hans 老实说,我无法及时找到可以解决输入问题的东西。据我所知,BFS 方法非常有效,而且据我所知,总会有一些有问题的输入。

标签: java algorithm breadth-first-search


【解决方案1】:

由于是作业,我无法真正为您解决,但我会尽力提供提示:

BFS 对我来说也很棒。

BFS 与 DFS 的区别在于您将 N 级的元素放入队列(而不是堆栈)。由于队列是先进先出的,因此您将在第 N + 1 级的元素之前处理第 N 级的元素。因此该算法将完成(尽管可能会占用大量内存)。

有趣的部分是您将什么放入队列以及如何组织遍历算法。这是我觉得你已经解决的问题,或者至少你有一个方向。所以想想我之前的段落,希望你能找到解决方案;)

【讨论】:

  • 虽然正确应用 BFS 会找到最短的解决方案(如果有),但我不确定问题是否与如何确定是否有任何解决方案有关,或者更确切地说:何时决定不会是一个。由于您可以无限添加字符串,因此您的队列只会不断增长。
  • 哦,我完全同意,如果没有解决方案,队列会无限增长,最终会引发 OutOfMemoryError(在 java 中)。我假设解决方案应该存在,并且内存不是这个任务的问题。 @RookieCookie - 请用你在这里问的内容更新最初的问题:)
  • @Mark Bramnik 关于这一点:''何时决定不会有一个“。现在我正在考虑引入进度检查。每个元组都有距离变量,它被定义为 (stringOneLength - stringTwoLength) 的绝对值。BFS 队列将有一个最大值和一个最小值,通过比较这两个我可能能够推断出不会有解决方案长度有限。
猜你喜欢
  • 2022-09-27
  • 2020-11-21
  • 2010-09-13
  • 1970-01-01
  • 2017-02-09
  • 1970-01-01
  • 2011-05-14
  • 1970-01-01
  • 2014-09-23
相关资源
最近更新 更多