我是C编程新手;来自OOP PHP背景。
我发现C(难怪)是一种更加困难的语言。我最初在数组上搞出了很多问题,特别是有很多问题:就像没有原生的关联数组一样。
现在,这部分我想我一点一点地搞清楚了,但现在我对昨天与C开发人员进行的对话有疑问。她正在向我解释二进制搜索算法,因为我问她是否有库在C中做数组相关的东西,因为它似乎比一直重新发明轮子更聪明的解决方案。
我真的很想了解更多关于C语言的算法,特别是算法和我以前在PHP中使用的设计模式有什么区别?
答案 0 :(得分:4)
按顺序排列:C支持任何类似关联数组的程度将qsort
根据键对结构数组进行排序,bsearch
根据键找到一个结构数组。当然,有很多替代方案 - 其他各种库都有哈希表,平衡树等。但是很难猜到哪些适合你的目的。
另一方面,我不知道很多关于使用C作为演示主要工具的算法的好书。一般(主要是语言无关)的算法书籍的一些明显建议是:
计算机编程艺术作者:Donald Knuth。这几乎是 类算法手册。它现在(最后)最多四卷。 Knuth最初是在1967年开始的,计划写7卷。只有三卷可用于长时间。第四个最近添加相当。按照他正在进行的速度,如果Knuth活到100岁以后,它只能达到7。尽管如此,那里的部件非常好 - 但是(警告!)他在相当的细节中分析算法;如果你不知道至少有一点微积分,那么很可能很难理解。
算法简介。 IIRC,现在有一个比我更新的版本,这增加了另一位作者。这是一本大型书(将它放在你的脚趾上会非常痛苦)。它使用了相当数量的数学符号等等,但是如果你愿意稍微查阅符号,那真的很容易理解。它涵盖了相当多的重要基础(例如图形算法),这些基础计划用于后期的Knuth卷,但在那里没有(至少尚未)。
算法和数据结构。这是(相当公平的)最小,最轻,至少对大多数人来说可能是最容易遵循的。
虽然它只能再次使用,如果你能找到Niklaus Wirth的算法+数据结构=程序的副本,那就是我真正建议的。它使用Pascal(毫不奇怪 - Niklaus Wirth发明了Pascal),但这就像C一样,它不会引起真正的问题。它没有像Knuth那样深入了解每种算法,但仍然足以让人感觉到一个人可能是一个很好的选择而不是另一个。对于处于你职位的人(编程的一些背景,但在这个领域很少),这是我的最佳建议。
虽然我之前已经说过,但我认为值得重复:IMO,罗伯特塞奇威克关于算法的所有书都应该避免。 C ++中的算法可能是最糟糕的,但其他算法只是稍微好一些。它们包含的代码(再次,特别是C ++版本)确实是可执行的,并且算法的描述通常是不完整的和/或误导性的。最新版本修复了一些的问题,但是(IMO)还没有足够的资格作为应该推荐的东西。如果没有其他选择,你可能可能已经过了这些,但考虑到显着优越的替代品的数量,阅读这些的唯一理由是,如果有人把它们给你,你绝对不能负担任何其他费用。
就算法与设计模式而言,行会在某些地方变得模糊,但通常算法的定义要严格得多。算法通常具有特定的,严格定义的输入,它以特定方式处理以产生同样特定的结果/输出。设计模式往往更松散,更通用。算法也可以是通用的(例如,排序算法可能需要一种定义严格,弱排序的类型)但在类型上仍然具有特定的要求。
设计模式往往更松散地定义。例如,访问者模式涉及处理对象组 - 但是当我们决定需要以新的和不同的方式处理它们时,我们不想修改这些对象的类型。我们通过与要处理的对象分开定义流程,以及我们如何遍历对象组,并允许流程与每个流程一起工作来实现这一点。
要从相反的方向看它,通常可以实现具有函数或一小组函数的算法。设计模式倾向于更倾向于您编写代码的样式,而不仅仅是“这是一个函数,使用它。”
答案 1 :(得分:1)