如何学好算法和数据结构之我见——51CTO名家访谈实录

最近受邀参加“51CTO名家访谈”就算法与数据结构话题论道做答,希望这些问题能够解答各位读者朋友的心中疑惑。

活动网址如下:

http://book.51cto.com/act/exp/zuofei

下面是活动中Q&A环节我的一些作答,希望可以作为正在学习算法的朋友们的一些经验参考。

  • 算法到底是什么?

非形式地说,算法是为实现某个任务而构造的简单指令集。以日常用语来说,算法又称为 过程或者方法。算法在数学中也起着非常重要的作用。古代数学文献中就包含有执行各种各样计算任务的算法描述。例如,我国古代数学经典《九章算术》中就记述 了包括求最大公约数、最小公倍数、开平方根、开立方根等在内的诸多算法。现代计算机科学中更是充满了各种各样的算法。例如,求解最短路径的狄克斯特拉算法,进行字符串匹配的KMP算法等等。 虽然算法在数学中已有 很长的历史,但在20世纪之前,算法概念本身一直没有精确的定义。1900 年,德国数学家希尔伯特在巴黎举行的世界数学家大会上发表了至今仍著名的演说。在演说中,他提出了 23 个数学问题,并认为它们是对下一个世纪的挑战。其中的第 10 题就是关于算法的。 希尔伯特的第10个问题是要设计一个算法来测试多项式是否有整数根。他没有使用算法这个术语,而是采用了下面这种表述:“通过有限多次运算就可以决定的过程”。有意思的是,从希尔伯特对这个问题的陈述中可以看出,他明确地要求设计一个算法。因此,他显然是假设这样的算法是存在的,人们所要做的只是找到它。现在我们知道,这个任务是无法完成的,即它是算法上不可解的。但对那个时期的数学家来说,以他们对算法的直观认识,得出这样的结论是不可能的。要想破解希尔伯特的第10个问题,人们不得不等待算法之精确定义的出现。 在丘奇和图灵于 1936 年写的文章中,这样的定义终于出现了。丘奇使用称为 λ 演算的记号系统来定义算法。图灵使用机器来做同样的事情(所以现在我们也常说精确定义上的算法等价于图灵机)。这两个定义后来证明是等价的。算法的非形式概念和精确定义之间的这个联系,从此被称为丘奇-图灵论题。丘奇-图灵论题提出的算法定义是解决希尔伯特第 10 个问题所必需的。1970 年,马提亚塞维齐在戴维斯、普特纳姆和罗宾逊等人工作的基础上,最终证明检查多项式是否有整数根的算法是不存在的。

  • 算法与数据结构之间有着什么样的关系?

正如你所看到的那样,市面上那些讨论相关问题的书籍之取名也都大同小异,例如“数据结构与算法”或者“数据结构与问题求解”,注意根据上一个问题的解答,你应该可以知道所谓问题求解,本质上就是在讨论算法问题。即使那本名叫“算法导论”的经典书籍,里面仍然有很大篇幅在介绍二叉树、红黑树、堆等数据结构。可见,算法与数据结构,二者是相辅相成,密不可分的。如果试图将它们割裂来看,例如讨论算法而不讲数据结构,或者只学习数据结构而对算法只字不提,都是不可能的。一方面,算法一定要借助相应的数据结构才能得以实现。例如堆排序算法就必须基于堆这种数据结构来实现。另一方面我们在定义一个数据结构的同时其实也已经定义了与之相关的操作。这些操作本身执行的步骤就是算法。例如,在介绍树的遍历操作时,就不得不提到深度优先算法和广度优先算法。所以,算法和数据结构之间早已彼此渗入到骨子里,难舍难分了。

  • 掌握算法与数据结构的相关知识对于一个IT从业人员有什么意义?

如果你是一个计算机相关专业的学生,那么数据结构将是你的必修课。如果你要报考相关专业的研究生,那么数据结构又可能位列你的专业课考察范围之内。如果你毕业了准备找工作,那么在很多IT公司的笔试面试题了,算法与数据结构又将成为重要的考点。著名的LeetCode网站上搜集了世界主要大IT公司的笔试面试题数百道,几乎道道都是在考察算法与数据结构的。由此,便不难看出算法的重要性。 无论你是信息技术的从业人员,还是计算机专业的在校学生,再或者是从事相关专业的研究人员,熟练掌握一门计算机语言都重要性都不言而喻。但是不是掌握了这其 中的语法规则就能写出漂亮的程序了呢?答案当然是否定的。因为你还需要另外一样至少同等重要的工具——算法。算法和语言的关系,其实很像是“道”和“术” 的关系。掌握一门语言,就如同习得一门技艺,可以成为一名工匠。但要想从工匠一跃成为大师,单单停留在“术”的层面显然不够,更重要的是悟“道”。而算法无疑就是计算机程序设计中的“道”。

  • 数据结构在现代信息产业中有哪些应用?

有的人可能会觉得数据结构仅仅存在于大学的课本上,而在现代计算机应用中并不常见。一种看法可能是因为大部分语言都提供了封装好的组件来支持结构化数据类型,例如C++中的STL。所以开发人员在编程的时候面向的往往是一些类或者包,而不再是栈或者队列这种基本数据结构。然而,事实上如果你觉得这就已经是数据结构在现代计算机技术中的全部应用,你就大错特错了。很多高级算法或者应用中仍然需要数据结构(也包括一些高级数据结构)。例如机器学习中使用的决策树,显然就是以树这种基本数据结构来实现的。还有kNN算法中则用到了KD树这样的一般很少出现在数据结构教程中的高级数据结构。在现代大规模空间数据库算法中,高级数据结构更是扮演着非常重要的角色。

  • 学习算法之前需要掌握哪些知识,是否会涉及很多数学?

算法和数据结构知识的学习并不需要太多数学知识。在大学计算机课程安排中,往往将离散数学作为数据结构的前置课程。而且离散数学在历史上最初的名字其实就是叫离散数据结构。但是,实际上,即使你没学过离散数学而直接学习算法和数据结构,也完全不会有问题。 但是,在学习算法和数据结构之前,你必须牢固掌握至少一门计算机语言。JAVA、C、C++或者Python都无所谓,但是你至少应该会其中一门。因为算法和数据结构都是面向应用的学问,在学习过程中涉及很多编程实践方面的内容。所以掌握一门计算机语言就势必成为你学好算法与数据结构知识的必备要素。

  • 如何学好算法和数据结构?

首先, 我这里的所谓“学好”,标准就是你能够用数据结构和算法知识来编程解决实际问题。比如自己能够在没有任何资料的帮助下编程解决8皇后问题。这其中就涉及到两个能力了。数据结构和算法知识肯定是一方面啊,另一方面呢?编程啊! 语言必须得学好,不管是C还是C++还是Java,什么都行,至少得先掌握其中一门。你可能会感到吃力和心虚的地方在于,自己好像也学过一门计算机语言,但是在写程序的时候总感觉束手无策、力不从心。那正好用数据结构和算法课程来深化你的编程能力。事实上,算法与数据结构同编程本身就是相辅相成的,如果有主次,那么你至少得先掌握一门语言,但也不必十分精通。因为在此基础上去学习数据结构和算法,将会反作用于你的语言能力本身。最终两种能力将同时获得提升。 其次,看书,看一本好书,认认真真的看一本好书,从头到尾认认真真的看一本好书。这样做的目的在于让你在最初学习的时候,建立一套完整的、系统性的框架和认识。 最后,现在你语言已经过关了,手头还有一本好书,然后呢?当然是得编程实践了。看到书上的一些实际问题:比如约瑟夫环问题,比如舞伴问题,那就自己编程解决吧(前提是理论已经确实懂了,不要坐在电脑前面眼前一片漆黑,然后想着程序该怎么编呢?那只能说明你书还没看懂。)

探秘算法世界,求索数据结构之道;汇集经典问题,畅享编程技法之趣;点拨求职热点,敲开业界名企之门。

《算法之美——隐匿在数据结构背后的原理》一书有奖试读活动正在51CTO网站同步火热开展,回答问题即有机会获赠《算法之美》图书一本,机会难得!活动链接:

http://bbs.51cto.com/viewthread.php?tid=1320391&extra=&frombbs=1

如果你是该书的读者,强烈建议你加入算法学习群(495573865),内有更多资源等你,而你在读书中遇到的疑问也将得到我第一时间的解答。更多关注本博客,我将陆续发布该书全部源代码至本博客。

时间: 2024-10-14 19:52:31

如何学好算法和数据结构之我见——51CTO名家访谈实录的相关文章

给自己新的开始——如何学好算法和数据结构

2020.3.6 一直以来很害怕接触到这一块,但是越早准备以后找工作的时候就能多一些底气,毕竟只要下定决心开始,什么时候都不算晚. 这篇文章是听了一个比较系统性的关于学习的路线,特此记录. 大纲 有哪些需要学习的算法与数据结构 如何学好算法与数据结构-刷题的重要性 算法与数据结构在工作中的应用 总结-有哪些经典的解题模版 算法为什么离不开数据结构 算法是解决问题的一系列操作集合 数据结构能使得这些操作更加的高效 同样的算法我们可以选择不同的数据结构,会带来不同效率的算法 有哪些需要学习的算法与数

【算法】 算法和数据结构绪论

算法和算法分析 先说点无关紧要的.初中的时候,知道有CS这门专门的学科存在的时候最开始的概念中CS就是等同于算法.这有可能是因为当时的前桌是后来一代CS传奇WJMZBMR..因为当时看起来十分高端,再加上后来努力的方向完全和CS不搭边,所以对于算法二字一直心中抱着一种敬畏之情,觉得是整个CS中最干的干货部分.后来决定入这行之后,我的领导对我说算法这东西虽然很高大上,但是在日常工作中我们用的并不多(我们部门主要做运维和DevOps,确实对这方面的需求不大)所以也就一直耽搁着.但是随着深入,以及在网

AJPFX关于学习java遇到的问题:对算法和数据结构不熟悉

为什么我先拿“数据结构和算法”说事捏?这玩意是写程序最最基本的东东.不管你使用 Java 还是其它的什么语言,都离不开它.而且这玩意是跨语言的,学好之后不管在哪门语言中都能用得上. 既然“数据结构和算法”这么重要,为什么很多 Java 新手却很不熟悉捏?我琢磨了一下,估计有两种可能.有些人虽然是计算机系毕业的,但是当初压根没好好学过这门课程,到工作时早都还给老师了:还有一些人是中途转行干编程,转行后又没有好好地打基础(都指望速成). 下面我列出几个很基本的问题,如果你每一个问题都搞得很清楚,那说

算法与数据结构开篇——基础与心得

算法与数据结构开篇 你真的会数据结构吗? 公司开发一个客服电话系统,小菜需要完成客户排队模块的开发,经过三次修改: 第一次:小菜使用了数据库设计了一张客户排队表,并且设置了一个自动增长的整型id字段,来一个用户,就在这张表的末尾插入一条数据,等客服系统一空闲,就将表中最前的的客户提交,然后删除这条记录. 实时排队模块,在内存中实现即可,无序用数据库 第二次:小菜用数组变量重新实现了这个功能,害怕数组不够大,选择远大于实际情况的100作为数组长度 数组虽然可以满足一定需求,但是需要考虑溢出问题,以

学习算法和数据结构编程语言的选择

   在上一篇文章中,我阐述了算法的重要性,在这篇文章中,我将阐述为什么写算法最好使用C语言.    C++作为老牌的语言.编程语言的老大哥,在各种编程环境中都占据了市场,尤其是在算法竞赛和研究生机试阶段,在后起之秀Java和Python面前,没有丝毫的落后.C++给我的整体感觉是简单和基础,很多学校的计算机系都以C语言作为学生的第一门编程语言,就是因为这个原因.现在的算法竞赛大多使用的语言基本就是C.C++.Java.Python,这四种语言是常年占据编程语言排行榜前几名的语言.    C++

浅谈算法和数据结构

: 一 栈和队列 http://www.cnblogs.com/yangecnu/p/Introduction-Stack-and-Queue.html 最近晚上在家里看Algorithems,4th Edition,我买的英文版,觉得这本书写的比较浅显易懂,而且“图码并茂”,趁着这次机会打算好好学习做做笔记,这样也会印象深刻,这也是写这一系列文章的原因.另外普林斯顿大学在Coursera 上也有这本书同步的公开课,还有另外一门算法分析课,这门课程的作者也是这本书的作者,两门课都挺不错的. 计算

【算法与数据结构】哈希表-链地址法

哈希表的链地址法来解决冲突问题 将所有关键字为同义词的记录存储在同一个线性链表中,假设某哈希函数产生的哈希地址在区间[0, m - 1]上,则设立一个至振兴向量 Chain  ChainHash[m]; 数据结构 //链表结点 typedef struct _tagNode { int data; //元素值(关键字) struct _tagNode* next; //下一个结点 }Node, *PNode; //哈希表结点 typedef struct _tagHashTable { //这里

《 常见算法与数据结构》平衡查找树(2)——红黑树(附动画)

本系列文章主要介绍常用的算法和数据结构的知识,记录的是<Algorithms I/II>课程的内容,采用的是"算法(第4版)"这本红宝书作为学习教材的,语言是java.这本书的名气我不用多说吧?豆瓣评分9.4,我自己也认为是极好的学习算法的书籍. 通过这系列文章,可以加深对数据结构和基本算法的理解(个人认为比学校讲的清晰多了),并加深对java的理解. 红黑树介绍 红黑树是一种简单的实现2-3树的数据结构,它方便的把我们之前实现的二叉搜索树改造成了一棵2-3树.它的核心思想

【转载】浅谈算法和数据结构: 一 栈和队列

作者:yangecnu(yangecnu's Blog on 博客园) 出处:http://www.cnblogs.com/yangecnu/ 最近晚上在家里看Algorithms,4th Edition,我买的英文版,觉得这本书写的比较浅显易懂,而且“图码并茂”,趁着这次机会打算好好学习做做笔记,这样也会印象深刻,这也是写这一系列文章的原因.另外普林斯顿大学在Coursera 上也有这本书同步的公开课,还有另外一门算法分析课,这门课程的作者也是这本书的作者,两门课都挺不错的. 计算机程序离不开