【发布时间】:2009-07-06 08:33:28
【问题描述】:
学习 C 算法的最佳地点或链接是什么?只看问题,你怎么知道何时何地使用算法的实现?
【问题讨论】:
-
Numerical Recipes in C!如果您不想为 2007 版付费,1992 version(第 2 版)非常有用。
学习 C 算法的最佳地点或链接是什么?只看问题,你怎么知道何时何地使用算法的实现?
【问题讨论】:
算法不一定与特定的语言相关联,只是为了澄清,所以只要你能理解数据结构/算法的概念,任何算法书都会很好用。
也就是说,这似乎是一个不错的选择:Algorithms in C。我的书架上有C++ equivalent。
还有一本书似乎与语言无关(如果我错了,请纠正我),名为 Data Structures & Algorithm's,虽然我听说它有点过时了,所以你会错过更新的结构。
别忘了互联网上有大量的信息available to you。但是,书籍通常更适合这类事情。这是因为互联网资源往往一次只关注一件事。例如,您需要先了解 Big-O notation 是什么,然后才能理解我们说 List 具有 O(1) [常量时间] 删除的含义。
一本书会以正确的顺序介绍这些内容,但互联网资源将侧重于 Big-O 表示法或数据结构,但通常不会轻易将两者联系起来。
在使用它时,您主要会在涉及到您将如何处理数据时建立联系。
例如,如果您只需要有序元素,您可能需要 vector(数组),但如果您需要有序元素并从任何地方移除(但会牺牲随机访问),那么 list 会更多合适,因为它是恒定时间删除。
【讨论】:
如需一本关于用 C 实现常用算法的合理(尽管远非完美)书籍,请尝试 Sedgewick 的 Algorithms in C。请注意,对于任何技术主题,纸质书籍都可能远远优于任何 Web 资源。
至于如何知道何时使用特定的算法,恐怕要靠经验了。
【讨论】:
对于算法文本,Cormen、Leiserson 和 Rivest 的 'Introduction to Algorithms' 是一个好的开始。伪代码实现很容易转换为 C。两个 Web 资源包含许多指向有关算法和示例实现的文档的链接:
【讨论】:
Sedgewick 的Algorithms in C 是开始调查的好地方。一旦您熟悉了可用的算法以及每种算法的性能特征,您将能够了解每种算法的使用位置。
【讨论】:
【讨论】:
你怎么知道何时何地使用 算法的实现 只是调查问题
这就是所谓的“模式匹配”,一旦你看到并解决了很多问题,你就会开始识别常见的东西,并且可以重用你以前的知识。
顺便说一句,在开始学习 C 中的算法之前,我会向你推荐一本关于算法的好书,C 中的算法比高级语言更难实现且更容易出错,并且一旦你对通用语言非常有信心您可以开始在 C 中调整和优化它们的程序。
【讨论】:
很多好资源已经命名,这里不再赘述。
至于你怎么知道什么时候用什么算法?
您需要有一个足够大的工具箱,您可以通过坐下来阅读一长串基本(以及更深奥的)数据结构和算法来获得该工具箱。您应该尝试掌握所有基础知识,但实际上只需要从更专业的知识中获取样本。
您需要了解可以进行哪些权衡(时间、代码复杂性、内存、单遍与多遍、就地与复制、稳定与不稳定排序等。令人作呕 em>),以及您研究的算法如何处理这些算法。同样,这只是一个经过大量研究的案例。 Big-O 是一个开始的地方,但不是结束,而是这一切。
您需要了解在遇到问题时所面临的真正限制是什么,以及如何根据上述算法权衡来表达这些限制。这需要一定程度的直觉,并且通常随着时间的推移通过实践来学习。
随着你的发展,值得以不止一种方式实施一些事情,从直觉中了解哪些有效,哪些无效。
值得阅读比你更有经验的人编写的代码,看看他们的想法。
祝你好运。
【讨论】:
Wikipedia List of Algorithms 也是非常方便的参考。
而且,如果你想更深入——The Art of Computer Programming (wikipedia ref)。
最好在多个答案中已经提到的 Robert Sedgewick 书之后。
【讨论】:
我最近读了 Kenneth Reek 的 Pointers on C。我以为我精通 C,但这本书给了我一些顿悟,尽管它是针对初学者的。代码示例很漂亮(但不是 x86 类 CPU 上最快的代码)。它提供了许多正在使用的最常见算法和数据结构的良好实现,并很好地解释了它们为何按原样实现(有时还提供替代实现的代码或建议)。
在与您的问题相同的页面上:用 C 语言创建可重用代码的模式(这是我们都想要的,不是吗?),C Interfaces and Implementations: Techniques for Creating Reusable Software,作者 David R. Hanson。我读它已经有几年了,我没有副本来验证我记得的内容是否正确,但如果我没记错的话,它涉及如何为数据结构和算法创建良好的 C API:s,如并给出一些最常见算法的示例实现。
主题: 由于我主要使用 C 编写一次性程序供私人使用,这个帮助我摆脱了一些不良的编码习惯以及成为优秀的 C 参考:@987654323 @。提醒我应该买那个。
【讨论】:
需要经验才能知道针对特定问题使用哪一组算法。定义一个目标会有所帮助。速度、内存、稳健性、解决方案质量……都是决定使用哪种算法的因素。考虑到不同的因素和场景,我们可以针对同一问题设计不同的解决方案。
【讨论】:
【讨论】:
学习算法的一个简单方法是使用 Wiki 页面,该页面致力于一些“经典”算法,如搜索算法或排序。算法的构造是基于使用不同数据结构的能力,如链表或C。所以,首先尝试实现不同的数据结构,如简单链表或二叉树,然后尝试在不同的算法中使用与真实相关的生活问题。
【讨论】: