【问题标题】:Use BFS to search through graph which represents Word Chain problem in Java使用 BFS 搜索表示 Java 中 Word Chain 问题的图
【发布时间】:2019-01-10 17:17:53
【问题描述】:

我需要使用广度优先搜索来解决词链问题。我有一个包含 5 个字母单词的文本文件,目标是使用这些单词并创建一个图表,如果可以在下一个单词中找到它们,则基于第一个单词和 4 个最后一个字母显示单词之间的联系。例如爬升→飞艇→跛行→皮斯莫→潮湿。所以 climbblimp 因为他们都有 l、i、m 和 b, 但 blimp 不能回去爬升,因为爬升的最后四个字母不是飞艇。

我不太确定如何解决这个问题并显示图形表示,以便我可以在其上使用 BFS。

我尝试通过使用 Sedgewicks 算法第 4 版在 Eclipse 中使用 Java 实现图形,但是它非常模糊,因为这些示例中似乎缺少步骤。我是一个初学者,所以我会很感激基本步骤或代码示例,并根据 sedgewicks 算法解释如何解决这个问题,因为我自己尝试解决它但没有成功。

我想要一个显示有向图的程序,其中包含单词和单词(顶点)之间的边,并且还能够对其进行 BFS。

【问题讨论】:

    标签: java algorithm breadth-first-search word


    【解决方案1】:

    首先,为了性能起见,您构建了一个标准化的 4 个字母组合的 Map<String, List<String>> 以列出具有这 4 个字母的单词。

    例如climb 有 4 个字母的 5 种不同组合,可以导致单词:limbcimbclmbclibclim。由于字母顺序无关紧要,您可以通过对字母进行排序来标准化:bilmbcimbclmbcilcilm

    每个单词都是图表中的一个节点,五个标准化的 4 字母组合可用于来自其他单词的边的入站“端口”。有了地图,您可以非常快速地找到可以从给定节点导航到的所有单词节点,方法是获取最后 4 个字母,对其进行规范化,然后在地图中查找(当然不包括节点本身)。

    例如使用单词climbblimplimps,您会得到以下地图:

    bcil -> climb
    bcim -> climb
    bclm -> climb
    bilm -> climb, blimp
    bilp -> blimp
    bimp -> blimp
    blmp -> blimp
    cilm -> climb
    ilmp -> blimp, limps
    ilms -> limps
    ilps -> limps
    imps -> limps
    lmps -> limps
    

    当然,列表中只有一个词的任何映射条目都是指向自身的词,因此它们是不相关的,可以删除。尽管在代码中没有特别的理由要这样做,但对于人类来说,有用的地图条目是:

    bilm -> climb, blimp
    ilmp -> blimp, limps
    

    您现在可以建立自己的优势:

    climb --[bilm]-> blimp
    blimp --[ilmp]-> limps
    limps --[imps]-> 
    

    这里没有 BFS。
    构建地图是 O(n)
    创建节点是O(n)
    创建边是O(n*m),其中m 是每个节点的平均边数。由于m 对于较大的图形可能接近常数,因此可以将其消除。
    这意味着总解决方案是O(n)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-14
      • 1970-01-01
      • 2017-06-22
      相关资源
      最近更新 更多