【问题标题】:How should I write this generic algorithm [closed]我应该如何编写这个通用算法[关闭]
【发布时间】:2015-12-11 09:24:25
【问题描述】:

假设你有两个字符串。每个字符串都有行,由换行符分隔。现在您想比较两个字符串,然后通过仅添加或删除一个字符串的行来找到最佳方法(最短的步骤数),将第二个字符串转换为第一个字符串。

字符串 #2:

abc
def
efg
hello
123

和字符串 #1:

abc
def
efg
adc
123

将字符串 #2 转换为字符串 #1 的最佳(最短步骤)解决方案是:

  1. 删除行位置 3 ('hello') 处的行
  2. 在行后添加“abc” 位置 3

如果您只能添加或删除行,如何编写通用算法来找到最快、最少步骤的解决方案将一个字符串转换为另一个字符串?

【问题讨论】:

  • 这是为了测试类似的东西吗?根据允许使用的 C 功能,解决方案可能会有所不同。当您说“删除第 3 行位置的行('hello')”时,感觉就像您在谈论一个字符串数组。如果你只有一个字符串,“hello”从字符串 #2 的索引 12 开始。

标签: c algorithm shortest-path


【解决方案1】:

这是一个经典问题。

对于一组给定的允许操作,两个字符串之间的编辑距离是将一个字符串转换为另一个字符串所需的最少操作数。

当允许的操作集仅包含插入和删除时,称为最长公共子序列编辑距离

您会在Longest common subsequence problem 中找到计算此距离所需的一切。

【讨论】:

    【解决方案2】:

    请注意,要完全回答这个问题,必须彻底涵盖图相似性搜索/图编辑距离这一巨大主题,我不会在这里做。不过,我会为您指出可以自己更彻底地研究问题的方向。


    ...找到最快、步骤最少的转换解决方案 一个字符串到另一个字符串...

    这是一个非常常见的问题,称为 (最小)编辑距离问题(或者,最初是特定的 'The String-to-String Correction problem',由 R. Wagner 和 M. Fischer 提出),这是一个非- 最佳(最小 = 最少步数)编辑距离的小问题,这是您在问题中所要求的。

    参见例如:

    https://en.wikipedia.org/wiki/Edit_distance

    https://web.stanford.edu/class/cs124/lec/med.pdf

    字符串相似度的最小编辑距离问题本身是更一般的最小图编辑距离问题图相似度搜索的子类(因为任何字符串甚至正如您自己所指出的,已排序的对象可以表示为图表),请参见例如A survey on graph edit distance.

    有关 SO 上此问题的详细信息,请参阅例如Edit Distance AlgorithmFaster edit distance algorithm

    这应该让你开始。

    我会将此问题标记为数学问题(算法指令)而不是特定于语言的问题,除非有人可以指导您使用现有的语言 (C) 库来解决编辑距离问题。

    【讨论】:

      【解决方案3】:

      最快的方法是删除所有子字符串,然后追加(而不是插入)所有新的子字符串;并尽可能“一次处理所有子字符串”(可能导致destPointer = sourcePointer 方法)。

      最小化删除和插入的子字符串数量的开销将高于删除和插入/附加而不检查是否有必要。这就像花 100 美元请一位顾问来决定您是否应该花 5 美元。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-04-03
        • 2016-02-05
        • 2012-12-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多