【问题标题】:What is the best data structure and algorithm for comparing a list of strings?比较字符串列表的最佳数据结构和算法是什么?
【发布时间】:2010-12-25 09:24:04
【问题描述】:

我想找到符合以下规则的最长的单词序列:

  • 每个单词最多只能使用一次
  • 所有单词都是字符串
  • 如果sa 的最后两个字符与sb 的前两个字符匹配,则可以连接两个字符串sasb

在连接的情况下,它是通过重叠这些字符来执行的。例如:

  • sa = "都灵"
  • sb = "诺瓦拉"
  • sa concat sb = "torinovara"

例如,我有以下输入文件,“input.txt”:

诺瓦拉

都灵

维切利

拉文纳

那不勒斯

利弗诺

弥赛亚

纯洁

罗马

而且,上面的文件按照上面的规则输出应该是:

都灵

诺瓦拉

拉文纳

那不勒斯

利沃诺

纯洁

因为可能的最长串联是:

torinovaravennapolivornovilligure

谁能帮我解决这个问题?最好的数据结构是什么?

【问题讨论】:

    标签: c algorithm data-structures directed-graph digraphs


    【解决方案1】:

    这可以表示为一个有向图问题——节点是单词,如果它们重叠则通过一条边连接(并且选择最小的重叠以获得最长的长度),然后找到权重最高的非- 相交路径。

    (好吧,实际上,您想稍微扩展一下图形以处理单词的开头和结尾。将“起始节点”与每个权重长度为 word / 2 的单词的边连接起来。 单词之间,-overlap + length start + length finish / 2,以及每个单词和一个“结束节点”之间的“length word / 2”。加倍可能更容易。)

    https://cstheory.stackexchange.com/questions/3684/max-non-overlapping-path-in-weighted-graph

    【讨论】:

      【解决方案2】:

      我会开始很简单。制作 2 个字符串向量,一个按正常排序,一个按最后 2 个字母排序。为第二个向量创建一个索引(整数向量),指出它在第一个向量中的位置。

      要找到最长的..首先删除孤儿。两端不匹配的单词。然后你想构建一个 neighbor Joining 树,在这里你可以确定哪些单词可能会相互到达。如果您有 2 棵或更多树,则应先尝试最大的树。

      现在对于一棵树,你的工作是找到罕见的末端,并将它们绑定到其他末端,然后重复。这应该会为您提供一个非常好的解决方案,如果它使用您的所有单词,请跳过其他树。如果没有,那么您需要使用大量算法来提高效率。

      需要考虑的一些事项: 如果您有 3+ 个独特的结尾,则保证会删除 1+ 个单词。 这可用于在寻找答案时减少您的尝试。 经常重新计算独特的目的。 给定末端的奇数确保必须丢弃一个(末端有 2 个免费赠品)。 隔离可以自我匹配的单词,你总是可以把它们放在最后,否则它们会搞砸数学。 您也许可以创建小的自匹配环,您可以将它们视为自匹配词,只要您在创建它们时不孤立它们。这可以使性能非常出色,但不能保证完美的解决方案。

      搜索空间是 order(N!) 数百万个元素的列表可能很难证明确切的答案。当然,我可能会忽略一些东西。

      【讨论】:

        猜你喜欢
        • 2018-11-16
        • 1970-01-01
        • 2014-10-02
        • 1970-01-01
        • 1970-01-01
        • 2012-03-15
        • 2015-08-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多