C中的算法

在C中学习算法的最佳位置或链接是什么? 通过调查问题,您如何知道何时何地使用算法的实现?

算法不一定与特定语言相关联,只是为了澄清,因此只要您能够理解数据结构/算法的概念,任何算法书都会很有效。

也就是说,这似乎是一个不错的选择: C中的算法 。 我的架子上有C ++等价物 。

还有一本书似乎语言不可知(如果我错了,请纠正我),称为数据结构和算法 ,虽然我听说它有点陈旧,所以你会错过更近期的结构。

不要忘记互联网上有大量的信息可供您使用 。 然而,书籍通常更适合这些类型的东西。 这是因为互联网资源往往只关注一件事。 例如,当我们说List有O(1)[常数时间]删除时,你需要先了解Big-O表示法是什么,然后才能理解它的含义。

一本书将以正确的顺序覆盖这些内容,但是互联网资源将专注于Big-O表示法或数据结构,但通常不会轻易连接这两者。


在使用它时,您将主要在进行数据处理时建立连接。

例如,如果你只需要有序元素,你可能想要一个向量 (数组),但如果你需要有序元素并从任何地方删除(但可以牺牲随机访问),那么列表会更合适,因为它是恒定的 -时间去除。

有关在C中实现常用算法的合理(虽然远非完美)一书,请尝试使用C中的Sedgewick 算法 。 请注意,对于任何技术主题,纸质书籍可能远远优于任何Web资源。

至于如何知道何时使用特定的算法,我担心这是经验。

对于algortihms文本,Cormen,Leiserson和Rivest的“算法导论”是一个良好的开端。 伪代码实现很容易转换为C.两个Web资源,包含许多关于算法和示例实现的文档的链接:

  • Stony Brook算法库

  • NIST数据结构和算法目录

塞奇威克在C语言中的算法是开始调查的好地方。 一旦熟悉了可用的算法以及每种算法的性能特征,您就可以看到每个算法的使用位置。

这是我主要与数学相关的算法的集合:

算法列表

FXT (数学相关)

数值方法

C中的数字配方

通过查看问题,您如何知道何时何地使用算法的实现

它被称为“模式匹配”,一旦你看到并解决了很多问题,你就会开始认识常见事物,并且可以重复使用你以前的知识。

顺便说一下,在开始使用C语言的算法之前,我会建议你在算法之前使用算法,这些算法比高级语言更难实现且更容易出错,并且一旦你对通用程序非常有信心,你就可以开始在C中调整并优化它们。

已经列出了许多好的资源,所以我在此不再赘述。

至于你怎么知道什么算法什么时候使用?

  • 你需要有一个足够大的工具箱,你可以通过坐下来浏览一长串基本(以及更深奥的)数据结构和算法。 您应该尝试获得所有基础知识,但实际上只需要更专业的样本。

  • 您需要了解可用的权衡(时间,代码复杂性,内存,单次与多次通过,就地与复制,稳定与不稳定的排序等等)以及您学习的算法如何这些。 同样,这只是一个很多研究的案例。 Big-O是一个开始的地方,但不是最终的全部,而且都是这一切。

  • 您需要了解在遇到问题时您面临的真正限制是什么,以及如何根据上述算法权衡来表达这些限制。 这需要一定程度的直觉,并且通常随着时间的推移通过练习来学习。

  • 值得一提的是,除了一种方式实现一些方法,学习你的直觉,什么有效,什么无效。

  • 值得一读的是比你自己更有经验的人写的代码,看看他们的想法。

祝好运。

维基百科算法列表也是非常方便的参考。
并且,如果你想要更深入 – 计算机编程的艺术 ( 维基百科参考 )。
最好在Robert Sedgewick的书中提到多个答案。

我最近读了Kenneth Reek的C指针 。 我以为我非常精通C语言,但这本书给了我一些顿悟,尽管是针对初学者的。 代码示例是美丽的东西(但不是类似x86的CPU上最快的代码)。 它提供了许多正在使用的最常见算法和数据结构的良好实现,并对它们实现的原因(有时是替代实现的代码或建议)进行了很好的解释。

在与您的问题相同的页面上:用于在C中创建可重用代码的模式(这是我们都想要的,不是吗?), C接口和实现:用于创建可重用软件的技术 ,作者:David R. Hanson。 我阅读它已经有几年了,而且我没有副本来validation我记得的是正确的,但是如果我没记错的话,它会讨论如何创建好的C API:数据结构和算法,如以及给出一些最常见算法的示例实现。

主题:因为我主要用C语言写私人使用的抛弃程序,这个帮助我摆脱了一些不良编码习惯以及作为一个优秀的C参考: C:参考手册 。 提醒我,我应该买那个。

需要经验才能知道用于特定问题的算法集。 定义目标会有所帮助。 速度,内存,稳健性,解决方案质量……都是决定使用哪种算法的因素。 考虑到不同的因素和情景,我们可以针对同一问题设计不同的解决方案。

算法设计手册值得一看。

学习算法的一种简单方法是使用Wiki页面,该页面专用于某些“经典”算法,如搜索算法或排序。 算法的构造基于使用不同数据结构的能力,如链接列表或C.因此,首先尝试实现不同的数据结构,如简单的链表或二叉树,并尝试使用与真实相关的不同算法生活问题。