c - 算法与设计模式有何不同



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

我发现C(难怪)是一种更难的语言。起初,我在弄清楚数组上的几件事时遇到了特别多的问题:就像没有本机关联数组一样。

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

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

按顺序排列:C 对关联数组之类的任何内容的支持程度qsort基于键对结构数组进行排序,bsearch基于键查找结构数组。当然,还有相当多的替代方案——其他各种库都有哈希表、平衡树等。不过,很难猜测究竟哪个适合您的目的。

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

    唐纳德
  1. ·高德纳(Donald Knuth)的《计算机编程艺术》(The Art of Computer Programming),作者:Donald Knuth。这几乎是算法书。现在(终于)最多四卷了。高德纳最初于1967年开始研究,计划写7卷。很长一段时间只有三卷可用。最近增加了第四个。按照他的速度,如果高德纳活到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)还不足以成为应该推荐的东西。如果没有其他选择,你可能会用这些,但考虑到数量非常优越的替代品,阅读这些的唯一原因是如果有人把它们给你,你绝对买不起其他任何东西。

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

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

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

"Algorithms in C, Part 1-5 (Bundle): Fundamentals, Data Structures, Sorting, Searching, and Graph Algorithms(第3版)"

不能强调这个系列有多好。

最新更新