业务开发算法 50 讲
黄清昊
Hashdata 数据库内核工程师,LeetCode 高赞答主,公众号微扰理论作者
23292 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 51 讲
业务开发算法 50 讲
15
15
1.0x
00:00/00:00
登录|注册

先导篇|诶,这个 git diff 好像不是很直观?

在生活的方方面面
在程序员日常开发工作中
Android 中的 DiffUtil
Git 中的 git-diff
求出可读性高的编辑脚本
复杂度低
编辑图的抽象
基于动态规划的思想
了解 git-diff 优化了 Myers 算法的空间复杂度
比较自己实现的结果与 git-diff 的结果
尝试实现 Myers 算法
尝试基于最长公共子序列算法改造出文本差分算法
实现基于动态规划的最长公共子序列算法
算法的普遍存在
算法的实际应用
Myers 算法
拓展阅读
课后作业
后续文章
总结
文本差分算法

该思维导图由 AI 生成,仅供参考

你好,我是微扰君。
相信你每天都会使用 Git,作为一款免费、开源的分布式版本控制系统,Git 最初是 Linus Torvalds 为了帮助管理 Linux 内核开源协作而开发的,随着 GitHub 的流行和 Git 本身的系统优势,它也渐渐成为我们广大研发人员日常工作中必不可少的版本管理利器。
在使用 Git 的过程中,你一定会常常用到 git diff 的命令,去查看这次待提交的本地代码和修改前的代码有什么区别,确定没有问题才会进行 commit 操作。像 git diff 这样求解两段文本差异的问题,我们一般称为“文本差分”问题。
但是不知道你有没有思考过文本差分的算法是怎么实现的呢?
如果你现在静下心来思考一下,就会发现写出一个简明的文本差分算法并不是一件非常容易的事情。因为代码的文本差分展现形式可能有很多,但并不一定都有非常好的可读性。
而 git diff 给我们展示的,恰恰是比较符合人们阅读习惯且简明的方式,简明到让我们即使天天都在使用这个功能也不会有意识地去思考:“诶,这个 difference 生成的好像不是很清晰?是怎么做的呢?”。
就让我们从这样一个“简单”、有趣、常用的文本差分算法开始,探索那些其实就在我们身边却常常被熟视无睹的算法们吧。希望能给你一些启发,而且探索算法思想的过程也会非常有趣(如果你在学习这一讲的过程中觉得有点难,最后我们会揭秘原因)。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了Git中的文本差分算法及其实现原理,重点介绍了Myers差分算法。文章首先介绍了Git diff命令的常见使用场景,并详细讨论了文本差分算法的定义和评价指标。随后,详细介绍了Myers算法的独特抽象和建模方式,以及在论文中定义的重要概念,如D-Path、Snake和Line,并解释了Myers的动态规划算法实现细节。文章还提供了Myers算法的伪代码和时间复杂度分析。总的来说,本文以清晰的语言和丰富的示例,深入浅出地介绍了Myers算法,展示了其高效性和实用性。读者可以通过本文了解到Myers算法在Git中的应用,以及算法在实际问题中的应用和乐趣。文章还留下了关于最长公共子序列算法的小作业,鼓励读者参与讨论。整体而言,本文对于想要深入了解文本差分算法的读者具有一定的参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《业务开发算法 50 讲》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(31)

  • 最新
  • 精选
  • Aliliin
    逐渐听不懂系列...😂

    作者回复: 加油加油 这一篇比较难;只是想告诉大家算法其实到处都有,可以保持好奇心,多多了解。 可以找助教加群一起讨论哈 加我也行 V: constant_variation

    2021-12-13
    4
    11
  • Daneil
    状态方程应该是dp[d][k] = max(dp[d-1][k-1]+1, dp[d-1][k+1])

    作者回复: 谢谢指正;说的很对~

    2021-12-12
    5
  • 天上星多月不亮
    请问下 m+n-2*LC 是如何推的呢

    作者回复: 首先要理解一件事,就是,最短的编辑脚本中两个文本之间的最长公共子序列是可以全部保留的。这个你多画几个例子应该就很容易get到。 在这个前提下,两个文本共计m+n行,其中每个文本都有LC行可以保留。 显然需要修改的,也就是插入或者删除的最小行数就是m+n-2*LC。

    2021-12-08
    4
    3
  • kenan
    老师,看目录没有维特比算法,可否加餐一下呢?

    作者回复: 好耶 有机会的话可以安排一下;不过之前编辑说这种比较偏数学的算法受众不是很大;就先没有安排了。

    2021-12-09
    2
    2
  • Geek_a8ce05
    第二节直接劝退

    编辑回复: 哈哈哈没事,可以先跳过看后面的攒攒信心,回头再来学这讲

    2022-04-11
    1
  • 费城的二鹏
    这篇导读真的很有深度,老师太棒了!

    作者回复: 哈哈哈 谢谢夸奖~ 可以加我微信 constant_variation 一起进群讨论~

    2022-01-04
    1
  • Geek_62b378
    把之前的递推例子过程画到二维表格中大概如下图所示,横轴的数字代表着 D-Path 的 D 也就是操作数,纵轴的数字代表 k-Lines 的行号 这里的纵轴的数字代表k-Lines的行号 这里的行号是不是说的是k-Lines中的k

    作者回复: 是的

    2021-12-23
    1
  • 随风
    没有明白,对应的k-lines的行号指的是什么意思

    作者回复: 就是从左上到右下的斜线 可以参考图片理解

    2021-12-21
    1
  • kimoti
    看起来还是很困难

    作者回复: 没事没事 第一篇确实难度比较大的 后面难度会小很多

    2021-12-12
    1
  • 疯帽子
    老师,这一篇看不懂,可以跳过不看吗😳

    编辑回复: 当然可以啊,学习嘛不要太挣扎,先挑你感兴趣的学吧,学到东西自己有收获才是真道理。如果感觉自己有成长了,再来回来挑战也不迟。

    2022-09-08
收起评论
显示
设置
留言
31
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部