我该如何编写这个通用算法

时间:2015-12-11 09:24:26

标签: c algorithm shortest-path

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

字符串#2:

abc
def
efg
hello
123

和字符串#1:

abc
def
efg
adc
123

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

  1. 删除第3行(' hello')
  2. 的行
  3. 添加' abc'后排 第3位。
  4. 如果你只能添加或删除行,那么如何编写一个通用算法来找到最快,最少的步骤,将一个字符串转换为另一个字符串的解决方案?

3 个答案:

答案 0 :(得分:4)

这是一个经典问题。

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

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

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

答案 1 :(得分:0)

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

  

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

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

参见例如:

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

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

字符串相似性的最小编辑距离问题本身就是更一般的最小图形编辑距离问题图形相似性搜索的子类(因为任何字符串甚至是正如您已经注意到的那样,有序对象可以表示为图形,参见例如A survey on graph edit distance

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

这应该让你开始。

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

答案 2 :(得分:0)

最快的方法是删除所有子字符串,然后追加(不插入)所有新的子字符串;并且立即执行所有子字符串"如果可以(可能导致destPointer = sourcePointer方法)。

最小化删除和插入的子字符串数量的开销将高于删除和插入/追加而不检查其是否必要。这就像花100美元来支付顾问来确定你是否应该花5美元。