C语言中的算法

6

什么是学习C语言算法的最佳场所或链接?在看问题时如何知道何时何地使用算法实现?


Numerical Recipes in C!如果您不想支付2007年版本的费用,则1992版(第二版)非常好。 - Mateen Ulhaq
12个回答

13
算法并不一定与特定的语言相关,只是为了澄清,因此只要您能理解数据结构/算法的概念,任何算法书都可以很好地发挥作用。
话虽如此,这似乎是一个不错的选择:C语言算法。我有C++版本在我的书架上。
还有一本书似乎是与语言无关的(如果我说错了,请纠正)叫做数据结构和算法,但我听说它有点过时,所以你会错过更近期的结构。
不要忘记互联网有大量信息可供您使用。然而,对于这些事情,书籍通常更好。这是因为互联网资源往往只专注于一件事。例如,您需要了解大O符号是什么,然后才能理解当我们说列表具有O(1) [常数时间]删除时它意味着什么。
一本书将按正确顺序涵盖这些内容,但互联网资源将专注于大O符号或数据结构,但往往不容易将两者联系起来。
当涉及到使用它时,您主要将在处理数据时建立连接。例如,如果您只需要有序元素,则可能需要一个向量(数组),但如果您需要有序元素并且可以从任何位置删除(但可以牺牲随机访问),则列表更合适,因为它的常数时间删除。

还有一本书叫做《算法》(作者Sartaj Sahni,忘记合著者了),它是关于算法分析和设计的好书。涵盖了广泛的主题,但可能对于仅面试而言有些过度。 - xxxxxxxxxadfas

5

如果想要实现常用算法的合理(虽然远非完美)C语言书籍,可以尝试Sedgewick的 Algorithms in C。请注意,对于任何技术主题,纸质书籍可能会比网络资源更加优秀。

至于如何知道何时使用特定算法,恐怕这取决于经验。


尼尔,你说的“纸质书”是什么意思? - Maddy
我会在我的回答中澄清。他的意思是拥有一本实体书通常比仅在线阅读更好。 - GManNickG
当然。非常感谢GMan和Neil。我只是想为我的面试目的做到彻底。 - Maddy

5

4
Sedgewick的C语言算法是一个很好的开始研究的地方。一旦您熟悉了可用的算法以及每个算法的性能特征,您就能够看到何时使用它们。

Steve,有没有一些在线文档可以更好地理解呢? - Maddy

4

2
你如何知道何时何地使用算法实现,只是看问题就能知道吗?
这被称为“模式匹配”,一旦你见过并解决了许多问题,你开始认识到共同点,并且可以重用以前的知识。
顺便说一句,在开始使用C语言中的算法之前,我建议你先阅读一本关于算法的好书,因为在高级语言中,算法的实现比在C语言中更加困难和容易出错。一旦你对一般流程非常自信,你就可以开始调整和优化它们在C中的实现。

2
很多优秀的资源已经被提到了,所以我在这里不再重复。
至于什么时候使用哪个算法?
1. 你需要一个足够大的工具箱,通过研究一长串基础(和更深奥的)数据结构和算法来获得。你应该尽可能掌握所有基础知识,但实际上只需要学习一些更专业的知识。
2. 你需要了解你可以做出哪些权衡(时间、代码复杂度、内存、单遍与多遍、原地排序与复制、稳定排序与非稳定排序等等),以及你所学习的算法在每个方面上的表现。同样,这只是需要大量学习的过程。Big-O是一个开始,但并不是全部。
3. 你需要了解在面对问题时你所面临的真正限制是什么,以及如何用上述算法权衡来表达这些限制。这需要一定的直觉,并通常通过长期实践学习而得。
4. 在学习过程中,将某些东西实现多种方式是值得的,这样你可以从直觉上学习出什么有效、什么无效。
5. 阅读比自己更有经验的人编写的代码值得一试,看看他们的想法如何。祝好运!

1
我最近读了肯尼斯·里克(Kenneth Reek)的《C语言指针》。虽然这本书是面向初学者的,但其中有一些颇具启发性的内容,让我深感自己对C语言掌握得还不够好。书中的代码示例简直美轮美奂(尽管在类似x86的CPU上并不是最快的代码)。它提供了很多常用算法和数据结构的良好实现,并且通过出色的解释,说明了为什么要这样实现(有时还会提供代码或其他替代方案的建议)。
与你的问题所在页面上:如何创建可重用的C代码模式(这正是我们所有人都期望的),请参考大卫·汉森(David R. Hanson)的《C接口与实现:创建可重用软件的技术》。我已经读了几年,没有一份副本可以验证我所记得的是否正确,但如果我没记错的话,它介绍了如何创建良好的C API,以及给出了一些最常见算法的示例实现。

话说回来:我在私人使用中主要编写了许多C语言的一次性程序,而这本书C: A reference Manual对于我来说既是帮助我摆脱一些糟糕的编码习惯的好工具,又是一本极佳的C语言参考书。这让我想起我应该去购买一本。


1

1

在编程中,我们需要经验来确定使用哪种算法解决特定问题。明确目标是有帮助的。速度、内存、健壮性、解决方案质量等因素都会影响我们选择使用哪些算法。在不同的因素和场景下,我们可以为同一个问题设计出不同的解决方案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接