【问题标题】:Algorithms in C [closed]C中的算法[关闭]
【发布时间】:2009-07-06 08:33:28
【问题描述】:

学习 C 算法的最佳地点或链接是什么?只看问题,你怎么知道何时何地使用算法的实现?

【问题讨论】:

标签: c algorithm


【解决方案1】:

算法不一定与特定的语言相关联,只是为了澄清,所以只要你能理解数据结构/算法的概念,任何算法书都会很好用。

也就是说,这似乎是一个不错的选择:Algorithms in C。我的书架上有C++ equivalent

还有一本书似乎与语言无关(如果我错了,请纠正我),名为 Data Structures & Algorithm's,虽然我听说它有点过时了,所以你会错过更新的结构。

别忘了互联网上有大量的信息available to you。但是,书籍通常更适合这类事情。这是因为互联网资源往往一次只关注一件事。例如,您需要先了解 Big-O notation 是什么,然后才能理解我们说 List 具有 O(1) [常量时间] 删除的含义。

一本书会以正确的顺序介绍这些内容,但互联网资源将侧重于 Big-O 表示法或数据结构,但通常不会轻易将两者联系起来。


在使用它时,您主要会在涉及到您将如何处理数据时建立联系。

例如,如果您只需要有序元素,您可能需要 vector(数组),但如果您需要有序元素并从任何地方移除(但会牺牲随机访问),那么 list 会更多合适,因为它是恒定时间删除。

【讨论】:

  • 还有一本名为“算法”的书,作者是 sartaj sahni(忘了合著者了)。这是一本关于算法分析和设计的好书。涵盖了广泛的主题,但可能仅用于面试。
【解决方案2】:

如需一本关于用 C 实现常用算法的合理(尽管远非完美)书籍,请尝试 Sedgewick 的 Algorithms in C。请注意,对于任何技术主题,纸质书籍都可能远远优于任何 Web 资源。

至于如何知道何时使用特定的算法,恐怕要靠经验了。

【讨论】:

  • 纸质书尼尔是什么意思??
  • 我会在我的回答中澄清。他的意思是拥有一本真正的书通常比在线阅读要好。
  • 当然。非常感谢 GMan 和 Neil。我只是想彻底了解我的面试目的。
【解决方案3】:

对于算法文本,Cormen、Leiserson 和 Rivest 的 'Introduction to Algorithms' 是一个好的开始。伪代码实现很容易转换为 C。两个 Web 资源包含许多指向有关算法和示例实现的文档的链接:

【讨论】:

    【解决方案4】:

    Sedgewick 的Algorithms in C 是开始调查的好地方。一旦您熟悉了可用的算法以及每种算法的性能特征,您将能够了解每种算法的使用位置。

    【讨论】:

    • 史蒂夫,任何可以更好、更容易理解的在线文档
    【解决方案5】:

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

    List of algorithms

    FXT(数学相关)

    Numerical Methods

    Numerical Recipes in C

    【讨论】:

      【解决方案6】:

      你怎么知道何时何地使用 算法的实现 只是调查问题

      这就是所谓的“模式匹配”,一旦你看到并解决了很多问题,你就会开始识别常见的东西,并且可以重用你以前的知识。

      顺便说一句,在开始学习 C 中的算法之前,我会向你推荐一本关于算法的好书,C 中的算法比高级语言更难实现且更容易出错,并且一旦你对通用语言非常有信心您可以开始在 C 中调整和优化它们的程序。

      【讨论】:

        【解决方案7】:

        很多好资源已经命名,这里不再赘述。

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

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

        • 您需要了解可以进行哪些权衡(时间、代码复杂性、内存、单遍与多遍、就地与复制、稳定与不稳定排序等。令人作呕 em>),以及您研究的算法如何处理这些算法。同样,这只是一个经过大量研究的案例。 Big-O 是一个开始的地方,但不是结束,而是这一切。

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

        • 随着你的发展,值得以不止一种方式实施一些事情,从直觉中了解哪些有效,哪些无效。

        • 值得阅读比你更有经验的人编写的代码,看看他们的想法。

        祝你好运。

        【讨论】:

          【解决方案8】:

          Wikipedia List of Algorithms 也是非常方便的参考。
          而且,如果你想更深入——The Art of Computer Programming (wikipedia ref)。
          最好在多个答案中已经提到的 Robert Sedgewick 书之后。

          【讨论】:

            【解决方案9】:

            我最近读了 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 @。提醒我应该买那个。

            【讨论】:

              【解决方案10】:

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

              【讨论】:

                【解决方案11】:

                The Algorithm Design Manual 值得一看。

                【讨论】:

                • 是的,确实值得一看,但我认为这不是寻找 C 算法的更好地方。它肯定会帮助您了解算法的全局及其在现实世界中的应用
                【解决方案12】:

                学习算法的一个简单方法是使用 Wiki 页面,该页面致力于一些“经典”算法,如搜索算法或排序。算法的构造是基于使用不同数据结构的能力,如链表或C。所以,首先尝试实现不同的数据结构,如简单链表或二叉树,然后尝试在不同的算法中使用与真实相关的生活问题。

                【讨论】:

                • 链接到一些您认为有用的示例 Wiki 页面怎么样?
                猜你喜欢
                • 2014-01-20
                • 2010-10-19
                • 1970-01-01
                • 2014-11-19
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多