【问题标题】:Simple word diff algorithm简单的单词差异算法
【发布时间】:2012-04-27 04:18:28
【问题描述】:

我目前正在寻找一种简单轻量级的算法来比较两个简单的字符串。

例如,如果我们采用这两个字符串:

  • “敏捷的棕狐跳过懒狗”
  • “挑剔的棕色狐狸扑倒了疯狗”

它应该告诉我第二个单词的 2 个首字母不同,等等。

现在我有一个非常简单的算法来比较单词:

/// <summary>
    /// Make a diff between two strings and returns words indices
    /// </summary>
    /// <param name="a"></param>
    /// <param name="b"></param>
    /// <returns></returns>
    public static List<int> Diff(string a, string b)
    {
        List<int> indices = new List<int>();

        string[] asplit = a.Split(' ');
        string[] bsplit = b.Split(' ');

        for (int i = 0; i < asplit.Length; i++)
        {
            if (bsplit.Length > i)
            {
                if (asplit[i].CompareTo(bsplit[i]) != 0)
                {
                    indices.Add(i);
                }
            }
        }

        return indices;
    }

所以这将告诉我哪些单词(使用空格字符拆分)是不同的。

我在这里阅读了很多关于实现复杂算法或使用现有库的主题。

但我接受了 .NET compact framework (WP7) 的再培训,我不想要可以比较两个文件或两个文本的东西,我只需要一个单词比较。

有没有适合的库或算法? 谢谢:)。

【问题讨论】:

  • 如果一个词被插入其中一个句子的中间,从而导致匹配出现偏差怎么办?它应该报告不同的每个后续单词吗?
  • 解决这个问题的标准方法是实现最长公共子序列算法。这是一个非常简单的算法。我在这里有一个 JScript 实现:blogs.msdn.com/b/ericlippert/archive/2004/07/21/189974.aspx 将其转换为 C# 留作练习。
  • @James Michael Hare :假设我有“my little pony”和“my sweet little pony”,它应该只报告“sweet”。我认为我过于简单的算法为此失败了。
  • @eric-lippert 感谢您分享您的代码。我会尝试弄清楚它是如何工作的,以及它是否对我有帮助。

标签: c# windows-phone-7 diff


【解决方案1】:

您可以查看DiffPlex 项目。

核心功能看起来像是在 \DiffPlex\Differ.cs 它甚至有一个 Silverlight 查看器,但它可能需要一些移植。

编辑:

我想补充一点,根据您的问题,DiffPlex 专门支持单词比较。隐藏在所有其他字符、行等比较方法中可能并不明显。

【讨论】:

  • 这看起来很不错,我会尝试只集成核心,看看是否满足我的小要求。谢谢!
  • 效果很好,再次感谢。 diff 核心非常轻巧且功能强大,具有易于理解的界面。使用另一个示例(来自diffplex.codeplex.com/discussions/254392 的 UnidiffSeqFormater),我能够在几行中执行复杂的字符差异。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-27
  • 1970-01-01
  • 1970-01-01
  • 2018-08-11
相关资源
最近更新 更多