【问题标题】:How do algorithms differ from design patterns?算法与设计模式有何不同?
【发布时间】:2011-05-18 15:13:33
【问题描述】:

我是 C 编程新手;来自 OOP PHP 背景。

我发现 C 是(难怪)更难的语言。起初,我在弄清楚数组上的一些事情时遇到了很多问题:就像没有原生关联数组一样。

现在,这部分我想我正在一点一点地弄清楚,但现在我有一个关于我昨天与 C 开发人员的对话的问题。她正在向我解释二分搜索算法,因为我问她是否有库可以在 C 中处理与数组相关的事情,因为这似乎是一个比总是重新发明轮子更聪明的解决方案。

我真的很想进一步了解 C 中的算法,特别是算法和我习惯在 PHP 中使用的设计模式之间有什么区别?

【问题讨论】:

标签: c algorithm design-patterns


【解决方案1】:

按顺序处理:C 对关联数组之类的支持程度将是 qsort 根据键对结构数组进行排序,bsearch 根据键查找结构数组。当然,还有很多替代方案——其他各种库都有哈希表、平衡树等。不过,很难猜出哪一个适合你的目的。

顺便说一句,我不知道有多少好书涵盖了使用 C 作为主要演示工具的算法。对于一般算法书籍(大部分与语言无关)的一些明显建议是:

  1. 计算机编程的艺术,作者 Donald Knuth。这几乎是 类算法的书。现在(最终)最多有四卷。 Knuth 最初是在 1967 年开始写这本书的,计划写 7 卷。 很长时间里只有三卷可用。最近添加了第四个相当。按照他的速度,如果 Knuth 活到 100 岁以上,它只会活到 7 岁。尽管如此,那里的部分非常好——但是(警告!)他对算法进行了相当的详细分析;如果你至少不懂一点微积分,那么可能很难掌握。

  2. 算法简介,Cormen、Leiserson、Rivest 和 Stein。 IIRC,现在有一个比我更新的版本,它增加了另一位作者。这是一本的书(掉在脚趾上会很痛苦)。它自始至终使用了大量的数学符号等,但是如果您愿意花一点时间来查找符号,那真的很容易理解。它涵盖了相当多的重要领域(例如,图形算法),这些领域计划在 Knuth 的后续卷中使用,但(至少目前)还没有。

  3. 算法和数据结构,作者 Aho、Hopcraft 和 Ullman。这是(相当公平的)最小、最轻的,至少对大多数人来说可能是最容易遵循的。

  4. 虽然它只能再使用,但如果您能找到 Niklaus Wirth 的算法 + 数据结构 = 程序 的副本,这就是我真正建议的。它使用 Pascal(毫不奇怪——Niklaus Wirth 发明了 Pascal),但这已经足够像 C 语言了,不会引起真正的问题。它没有像 Knuth 那样深入了解每种算法,但仍然足以让人很好地了解何时一个可能是一个不错的选择而不是另一个。对于像你这样的人(有一些编程背景,但在这方面很少),这是我的首要建议。

虽然我之前说过,但我认为值得重复:IMO,应该避免阅读 Robert Sedgewick 的所有算法书籍。 C++ 中的算法 可能是其中最差的,但其他的只是稍微好一点。它们包含的代码(同样,尤其是 C++ 版本)确实令人讨厌,并且算法的描述通常不完整和/或具有误导性。最新版本已修复 一些 问题,但 (IMO) 还不足以成为值得推荐的东西。如果没有其他选择,您可能可以接受这些,但考虑到显着优越的选择数量,阅读这些的唯一原因是如果有人把它们给了你,而你绝对买不起别的东西。

就算法与设计模式而言,界限可能在某些地方变得模糊,但通常算法的定义要严格得多。算法通常具有特定的、严格定义的输入,它以特定的方式处理该输入以产生同样特定的结果/输出。设计模式往往定义更松散,更通用。算法也可以是通用的(例如,排序算法可能需要定义严格、弱排序的类型),但仍然对类型有特定要求。

设计模式的定义往往比较松散。例如,访问者模式涉及处理对象组——但是当我们决定需要以新的不同方式处理它们时,我们不想修改这些对象的类型。为此,我们将流程与要处理的对象分开定义,以及我们将如何遍历对象组,并允许一个流程与每个对象一起工作。

从一个相当不同的方向来看,您通常可以用一个函数或一小组函数来实现一个算法。设计模式往往更倾向于您编写代码的风格,而不仅仅是“这是一个函数,使用它”。

【讨论】:

    【解决方案2】:

    【讨论】:

    • 非常感谢 nacho ;)。我肯定需要检查一下,希望它不会让我头晕目眩
    • 哈哈哈,好吧,我因为问太多问题而被骗了……可能语言障碍也与我问的方式有关……但无论如何。无论如何,我很欣赏杰瑞的建议。我会试着找到那些。你觉得我应该从哪一个开始?
    猜你喜欢
    • 2010-09-21
    • 1970-01-01
    • 1970-01-01
    • 2016-04-15
    • 2010-10-08
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    相关资源
    最近更新 更多