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

标签 c algorithm design-patterns

我是c编程新手,来自oop php背景。
我发现C(难怪)是一种更难的语言一开始我在处理数组的一些问题上遇到了很多问题:比如没有本机关联数组。
现在,这一部分我想我正在一点一点地理解,但是现在我有一个问题,关于昨天我和一个C开发人员的对话。她向我解释二进制搜索算法是因为我问她是否有库可以在C语言中做与数组相关的事情,因为这似乎是一个比总是重新发明轮子更聪明的解决方案。
我真的很想了解更多关于c语言中的算法,特别是算法和我在php中习惯使用的设计模式之间有什么不同?

最佳答案

按顺序排列:C对任何类似于关联数组的支持的范围是qsort根据键对结构数组排序,以及bsearch根据键查找结构数组当然,还有很多其他的选择——各种其他的库都有哈希表、平衡树等等。但是,很难猜出哪一个适合您的目的。
顺便说一下,我不知道有多少好的书籍介绍使用C作为主要演示工具的算法。对于一般的算法书籍(主要是独立于语言的),一些明显的建议是:
计算机编程的艺术。这几乎是类算法的书现在(终于)有四卷了。克努特最初于1967年开始写这本书,计划写7卷。很长一段时间只有三卷书。最近又增加了第四个。以他现在的速度,如果克努特活到100岁以上,就只能活到7岁。尽管如此,那里的部分还是非常好的——但是(警告!)他对算法进行了相当详细的分析;如果你至少不懂一点微积分,可能很难掌握相当数量的算法。
Cormen,Leiserson,Rivest和Stein的算法简介。IIRC,现在有一个比我新的版本,这又增加了一个作者。这是一本大书(把它掉在脚趾上会很痛)。它使用了相当数量的数学符号等等,但如果你愿意稍微研究一下符号,它真的很容易理解。它涵盖了相当多的重要基础(例如,图形算法),这些基础被安排在稍后的Knuth卷中,但在那里(至少还没有)可用。
算法和数据结构由Aho,Hopcraft和Ullman这是最小的,最轻的,至少对大多数人来说可能是最容易做到的。
尽管它只能再使用了,如果你能找到Niklaus Wirth的算法+数据结构=程序的副本,那就是我真正的建议。它使用Pascal(不奇怪,Niklaus Wirth发明了Pascal),但这和C一样,不会造成真正的问题它并没有像knuth那样深入研究每一种算法,但仍然足以让人感觉到一种算法可能是一种很好的选择,而另一种算法可能是一种很好的选择。对于你这个职位的人(有些编程背景,但在这个领域很少),这是我的最高建议。
尽管我以前说过,但我认为有必要重复一次:在我看来,罗伯特·塞吉威克所有关于算法的书都应该避免。C++中的算法可能是最差的,但其他算法只稍微好一些。他们所包含的代码(特别是C++版本)是真正可执行的,算法的描述常常是不完整的和/或误导的。最新的版本已经修复了一些问题,但是(imo)还不足以满足推荐的要求。如果没有其他选择,你也许可以接受这些,但考虑到有很多选择是非常优越的,唯一的理由阅读这些,如果有人给你,你绝对买不起其他任何东西。
就算法与设计模式的对比而言,这条线在某些地方会变得模糊,但通常算法的定义要严格得多。一个算法通常会有一个特定的、严格定义的输入,它以特定的方式处理这个输入,以产生同样特定的结果/输出。设计模式往往定义得更松散,更通用算法也可以是泛型的(例如,排序算法可能需要定义严格、弱排序的类型),但对该类型仍有特定的要求。
设计模式的定义往往比较松散例如,visitor模式涉及处理对象组,但是当我们决定需要以新的和不同的方式处理这些对象时,我们不想修改这些对象的类型。我们通过将进程与要处理的对象分开定义,以及如何遍历对象组,并允许进程与每个对象一起工作来实现这一点。
从一个完全不同的方向来看,通常可以用一个函数或一组函数实现一个算法。设计模式倾向于更倾向于你编写代码的风格,而不仅仅是“这里有一个函数,使用它”。

关于c - 算法与设计模式有何不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6047024/

相关文章:

c - 将指针与(无符号)-4000L 进行比较的目的

c - 从套接字 recv() 到 uint16_t 的 memcpy 上的段错误

java - "if"语句与 OO 设计

java - 如何实现这个观察者模式?

android - Android 游戏开发模式?

c - 使用共享内存将数据结构传递给另一个进程并保存到文件

c - C 编程中的类型不匹配

python - 为什么这是一个糟糕的冒泡排序算法?

python - 如何找到给定矩阵的最大排序子矩阵(按行和列排序)?

Python - 算法查找时隙