如何处理复杂的事情?

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(使用前将#替换为@)

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

  • 是否有任何编程语言支持定义原始数据类型的约束?

    昨晚我在想编程语言可以有一个功能 我们应该能够限制分配给原始数据类型的值 例如 我应该可以说我的 int 类型变量只能具有 0 到 100 之间的值 int lt 0 100 gt progress 然后 这将在所有情况下充当普通整数 除非
  • 如何找到阶乘? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 如何编写一个程序来求任意自然数的阶乘 这适用于正整数的阶乘 尽管是一个非常小的子集 unsigned long factorial u
  • 给定源顶点,查找有向图中具有环路的所有路径

    我无法解决这个问题 我必须找到所有simple从源顶点开始的路径s含有一个simple有向图中的循环 即不允许重复 当然除了循环在路径上连接回的单个重复顶点 我知道如何使用 DFS 访问来查找图形是否有循环 但我找不到一种方法来使用它来查找
  • 将 EBNF 转换为 BNF

    我的计算机语言课已经过去几年了 所以我已经忘记了 BNF 和 EBNF 的要点 而且我身边也没有教科书 具体来说 我忘记了如何将 EBNF 转换为 BNF 据我所知 我知道要点之一是转换 term into
  • 封装和抽象之间的区别

    我今天去面试了 我有一个问题来自OOP 关于之间的区别封装 抽象 我据我所知回答说封装基本上将数据成员和成员函数绑定到一个称为Class 然而抽象基本上是为了隐藏实现的复杂性并为用户提供方便的访问 我以为她会同意我的回答 但她质疑 如果两者
  • 我应该在 switch 语句中使用 continue 吗?

    我注意到你确实可以使用continueswitch 语句中的关键字 但在 PHP 上它没有达到我的预期 如果 PHP 失败了 谁知道还有多少其他语言也会失败呢 如果我经常在语言之间切换 如果代码的行为与我期望的行为不同 这可能会成为问题 我
  • 如何处理复杂的事情?

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

    如何将均匀分布 大多数随机数生成器产生的结果 例如在 0 0 和 1 0 之间 转换为正态分布 如果我想要我选择的平均值和标准差怎么办 方法有很多 Do not使用博克斯穆勒 特别是当你画很多高斯数时 Box Muller 产生的结果被限制
  • 将 Eclipse 的“开放调用层次结构”过滤为仅我的公司/项目

    我最喜欢的 Eclipse 功能之一是能够打开调用者 被调用者层次结构 http eclipse tools sourceforge net call hierarchy index html的一个方法 默认情况下 该视图显示对我的代码库之
  • 将数字缩放为 <= 255?

    我的单元格的数值可以是 0 到 0 之间的任何值Integer MAX VALUE 我想对这些单元格进行相应的颜色编码 如果该值 0 则 r 0 如果该值是Integer MAX VALUE 则 r 255 但是中间的值呢 我想我需要一个函
  • 边界椭圆约束于水平/垂直轴

    背景 我正在尝试将地形图裁剪成围绕多个风力涡轮机的最小尺寸椭圆 以最小化地图的尺寸 执行此地图裁剪的程序可以裁剪椭圆 但仅限轴沿 x 轴和 y 轴对齐的椭圆 我知道边界椭圆问题的算法 https stackoverflow com ques
  • 从应用程序中删除死代码的最佳方法是什么? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我经常觉得 在多次迭代我的代码之后 我留下了一些函数 类或其他代码行 这些代码在以前的版本中有意义 但对于新版本来说并不是很有用 我知道探查器可
  • 是否有可能比 O(n log n) 更好地计算数字列表的中位数?

    我知道可以在 O n 中计算数字列表的平均值 但是中位数呢 有没有比排序 O n log n 和查找中间元素 或者如果列表中有偶数个项目则两个中间元素的平均值 更好的算法 是的 您可以在 O n 时间内 确定性地 完成此操作 http ww
  • 在二维平面中找到距离 P 点最近的 K 个点

    资料来源 亚马逊面试问题 解决方案1制作大小为 K 的堆并按最小距离收集点O NLogK 复杂 解决方案2 取大小为 N 的数组并按距离排序 应该使用QuickSort 霍尔修改 取前 K 点作为答案 这太复杂了 NlogN 但可以优化到近
  • 数据库、表和列命名约定? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 每当我设计数据库时 我总是想知道是否有命名数据库中项目的最佳方法 我经常问自己以下问题 表名应该是复数吗 列名应该是单数吗 我应该为表或列添加前
  • Lockfree 标准集合和教程或文章

    有人知道用于无锁常用数据类型的实现 即源代码 的好资源吗 我正在考虑列表 队列等 锁定实现非常容易找到 但我找不到无锁算法的示例以及 CAS 的工作原理以及如何使用它来实现这些结构 查看 Julian M Bucknall 的博客 他 详细
  • 需要帮助解决 Project Euler 问题 200 [已关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在尝试制定一个算法来解决 We
  • 类是否应该有静态和非静态成员

    我试图找出一个类何时适合同时具有静态和非静态函数 又名 obj new ClassA obj gt doOOPStuff something ClassA doStaticStuff Note This example is done in
  • 以任意顺序匹配可选捕获组

    在解析用户输入的许多情况下 用户有机会向输入添加几个可选标志 这些标志应该以任何顺序接受 如何使用正则表达式对其进行解析 以便每个标志都位于它自己的捕获组中 如果存在 例如 有一个必需的令牌a 然后是 3 个可选标记 可以按任何顺序出现b
  • “此应用程序已请求运行时以异常方式终止它”的原因是什么?

    Visual C 运行时抛出一个常见错误 此应用程序已请求运行时以异常方式终止它 请联系应用程序的支持团队以获取更多信息 该错误消息实际上是什么意思mean 让我用一个比喻来准确地解释我的问题 如果我看到一条消息 异常 访问冲突 0xc00

随机推荐