如何处理复杂的事情?

2024-04-13

您知道代码中对于项目至关重要但可能需要花费大量时间才能完成的特定部分吗?您是否有过这样的感觉:您宁愿做其他事情(可能不太重要),或者根本不写代码,而不是做那部分?你竭尽全力避免并使用你所知道的每一个懒惰技巧来推迟其不可避免的实施的那头野兽?

现在,我可能只是很懒,但我总是不得不处理这样的代码。写一些我不想写的东西(如果你只是为了好玩而没有得到报酬,那就更糟糕了!)。一个大型系统需要花费大量时间才能进入一个阶段,在这个阶段您可以返回任何有用的结果或表明其工作的指示。你如何开始编写类似的代码?大多数人可能会建议分而治之和类似的架构技术,但这与如何做无关;而是与如何做无关。这是关于你如何开始做这件事。您首先要采取的步骤是什么?


我会讲一个发生在我身上的案例的故事。

我想为 x264 实现一种新的帧类型决策算法,该算法使用前向动态规划(维特比算法)。但它会变得复杂、混乱、丑陋等等。我真的不想这样做。我试图将这个项目抵押到 Google Summer of Code 上,但是由于某种可怕的运气,我们的一个学生只是放弃了他的项目......就是选择该项目的学生。

于是,经过两个月的抱怨和躲避,我终于开始研究算法了。我就是这样做的。

首先,我与另一位开发人员交谈,他显然已经对如何做到这一点有了一些想法。我们讨论了这个问题,他向我解释了这个问题,直到我从算法的角度完全理解了这个过程。这是任何此类项目的第一步:充分理解其背后的算法,以便可以对整个项目进行伪代码。

然后我和我的另一个同事聊了聊。我们走到白板前,我把它画出来,直到he也明白了。通过向别人解释,我自己也有了理解。这是第二步:向其他人解释算法,以便they可以对其进行伪代码。这是对编程过程的模拟,因为编程是向计算机“解释”算法的一种形式。

然后,我编写了一个简单的 Java 原型,它使用任意假值作为成本函数,并且仅用于测试维特比搜索。我完成了它,并通过详尽的搜索进行了检查——它完全匹配。我的动态规划是正确的。这是第三步:在尽可能简单的环境中编写尽可能简单的算法形式。

然后我将它移植到 x264 的本地语言 C。它又起作用了。这是第四步:将算法的简单形式移植到完整环境中。

最后,我用真实的成本函数替换了假的成本函数。经过一些错误查找和修复后,它起作用了。这是最后一步:将算法与环境完全集成。

这个过程只花了不到一周的时间,但从我在项目开始时的角度来看,这完全是令人畏惧的,我什至无法让自己开始——但是通过将其分解为这样一个一步一步的过程,我不仅能够完成它 http://git.videolan.org/?p=x264.git;a=commitdiff;h=9818865c1f5eccbc04fb51f062cb1b3abff02db0,但完成速度比我预期的要快得多。

而且其好处远远超出了 x264;我现在对维特比了解得如此透彻,以至于我现在可以向其他人解释它......而其他人也可以从中受益匪浅。例如,一位 ffmpeg 开发人员正在使用我的算法和代码的改编版来最佳地解决一个有些不同的问题:音频文件中的最佳标头放置。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何处理复杂的事情? 的相关文章

  • Google 文件系统中的块大小问题

    谷歌文件系统论文 http labs google com papers gfs html 块大小是关键设计之一 参数 我们选择了64MB 这比典型文件大得多 系统块大小 每个块 副本存储为普通 Linux 文件放在 chunkserver
  • 如何检查一个盒子是否适合另一个盒子(允许任何旋转)

    假设我有两个盒子 每个盒子都是一个长方体 http en wikipedia org wiki Rectangular cuboid aka长方体 我需要编写一个函数来决定盒子是否具有尺寸 一 二 三 可以装入具有尺寸的盒子中 甲 乙 丙
  • 在二维平面中找到距离 P 点最近的 K 个点

    资料来源 亚马逊面试问题 解决方案1制作大小为 K 的堆并按最小距离收集点O NLogK 复杂 解决方案2 取大小为 N 的数组并按距离排序 应该使用QuickSort 霍尔修改 取前 K 点作为答案 这太复杂了 NlogN 但可以优化到近
  • Lockfree 标准集合和教程或文章

    有人知道用于无锁常用数据类型的实现 即源代码 的好资源吗 我正在考虑列表 队列等 锁定实现非常容易找到 但我找不到无锁算法的示例以及 CAS 的工作原理以及如何使用它来实现这些结构 查看 Julian M Bucknall 的博客 他 详细
  • 哪种数据聚类算法适合检测时间序列事件中未知数量的聚类?

    这是我的场景 考虑在不同地点和时间发生的一组事件 例如 考虑有人在高空记录暴风雨期间城市中的雷击 就我的目的而言 闪电是瞬时的 只能击中某些位置 例如高层建筑 还可以想象每次雷击都有一个唯一的 ID 以便以后可以参考该雷击 这个城市大约有1
  • 编程语言语法中尾随逗号的历史

    许多编程语言允许在其语法中在列表中的最后一项后面使用尾随逗号 据说这样做是为了简化自动代码生成 这是可以理解的 作为示例 以下是 Java 中完全合法的数组初始化 JLS 10 6 数组初始值设定项 http java sun com do
  • 如何通用地减少子集平均值的计算?

    Edit 由于似乎没有人阅读此链接的原始问题 因此让我在这里介绍一下它的概要 正如其他人所问的 最初的问题是 给定大量值 总和将超过数据类型的值Double那么如何计算这些值的平均值呢 有几个答案说要按集合计算 比如取50个和50个数字 计
  • Windows 应用程序事实上的标准键盘快捷键列表?

    假设我正在为 Windows 开发一个新的桌面应用程序 是否有我可以查阅的所有 Windows 应用程序都应支持的键盘快捷键列表 来自 Microsoft 或第三方 注意 当我在这里说 所有 Windows 应用程序 时 我的真正意思是 特
  • 类是否应该有静态和非静态成员

    我试图找出一个类何时适合同时具有静态和非静态函数 又名 obj new ClassA obj gt doOOPStuff something ClassA doStaticStuff Note This example is done in
  • 快速约会算法

    我在一家咨询公司工作 大部分时间都在客户所在地 正因为如此 我很少见到同事 为了更好地了解彼此 我们将安排一个晚宴 会有很多小桌子 方便人们聊天 为了在聚会期间与尽可能多的不同的人交谈 每个人都必须每隔一段时间 比如每小时 换一张桌子 如何
  • 负整数的基数排序

    我正在尝试对整数 包括负整数 实现基数排序 对于非负整数 我计划为数字0 9创建一个10个队列的队列 并实现LSD算法 但我对负整数有点困惑 我现在的想法是继续为它们创建另一个包含 10 个队列的队列 并分别对它们进行排序 然后在最后 我将
  • 哪些不同的术语表示相同的事物(或不同的术语,但人们认为它们表示相同的意思)? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的
  • 什么是拉姆达?

    有人可以很好地描述什么是 Lambda 吗 我们为它们设置了一个标签 它们涉及 C 问题的秘密 但我还没有找到一个很好的定义和解释来解释它们是什么 闭包 lambda 和匿名函数不一定是同一件事 匿名函数是任何没有 或者至少不需要 自己名称
  • 如何在 Perforce 树中查找未跟踪的文件? (svn状态的模拟)

    有人有脚本或别名来查找 Perforce 树中未跟踪 实际上 未添加 的文件吗 编辑 我更新了对此已接受的答案 因为看起来 P4V 在 2009 年 1 月的版本中添加了对此的支持 EDIT 请用p4 status现在 不再需要跳圈了 参见
  • 关于使用My作为类名前缀的意见

    就我个人而言 我从来不喜欢MyObject类的命名 我猜现状会同意 但我想看看争论的另一面 以及它是否有任何有效性 我的 已被我使用 请使用其他内容
  • 安全网络登录示例/教程[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 为 Web 应用程序创建登录表单的方法有很多种 但大多数方法都存在这样或那样的缺陷 密码以明文形式传输
  • 如何知道您的单元测试装置是否“尺寸合适”?

    您如何知道 测试夹具 的尺寸是否合适 我所说的 测试夹具 是指一个包含大量测试的类 我在测试装置中一直注意到的一件事是它们变得有点冗长 鉴于它们也可能不够详细 您如何了解单元测试的大小是否合适 我的假设是 至少在 Web 开发的背景下 您应
  • 是否有加权水库采样的算法? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 当数据流中的点具有相关权重时 是否有一种算法可以执行水库采样 Pavlos Efraimidis 和 Paul Spirakis 的算
  • 如何在基本活动中使用 ViewBinding 的抽象?

    我正在创建一个基类 以便子级的所有绑定都将设置在基类中 我已经做到了这一点 abstract class BaseActivity2 b AppCompatActivity private var viewBinding B null pr
  • 评估 CRC-32 实现中的差异

    我见过相同基本 CRC 32 算法的许多不同实现 如下所示 int remain int sbox SIZESBOX int dividend int bit for dividend 0 dividend lt SIZESBOX divi

随机推荐