“算法,先于计算机存在于世,比编程语言本身更为重要。语言只是工具,算法才是灵魂。”而程序就等于算法加数据结构,足以可见,想要在编程之路上走得更长远,数据结构与算法是必须掌握的基本功。
在计算机编程领域,数据结构与算法的应用无处不在,比如图像视频处理、数据压缩、数据库、游戏开发、操作系统、编译器、搜索引擎、AR、VR、人工智能、区块链等领域,都是以数据结构与算法为基石。只要你想做这一行,就必然要掌握数据结构与算法。
算法是各大名企面试题中的常客,越是厉害的公司,越是注重考查数据结构与算法。但很可惜,很多人虽然技术不错,但经常都会败在算法上。
数据结构与算法属于开发人员的基本内功,也能训练大脑的思考能力,掌握一次,终生受益。扎实的数据结构与算法功底,能让开发者站在更高的角度去思考代码、写出性能更优的程序,能够更快速地上手各种新技术。
2. 求问算法,数据结构,数学等基础课程真的没有作用吗
我的观点是:很多东西你看上去用不到,但事实上他对你的作用是潜移默化的。
时不时会有朋友写信问老赵学习上的一些迷茫,其中都有一些共性。例如说不知道该如何学习,说不知道朝哪个方向前进。也例如大家虽然基本上都知道“算法”的重要性,但是却总觉平时用不到。说它锻炼能力,但“能力”是看不见摸不着的,学着学着就会“麻木”,感觉就“学不进去”了。当然这方面有几个原因,有主观也有客观的,有需要周围环境的改变,也有需要自己精神上“强壮度”的提高。这里呢,我们有时就不提“算法”这个太具体的名词了,而使用“基础”来表示这一类“似乎重要,但不知道重要在哪里”的东西。
还是先从算法,数据结构这类大家从学校里首先都会学到的东西谈起吧。如果说平时用不到算法,那肯定是不可能的。什么是算法?解决问题的方法都是算法,程序中任何对象及其关系都是数据结果。当然您可能会说,这里的说的算法和数据结构是指“有名”的那种,例如大家都耳熟能详的快速排序,图、树等等。当然,说到这个份上,可能就是要分两条路走了。一,您的确只是一直在做普通的CRUD;二,您对于这些知识理解不够,而无法感受到对它们的使用,很多时候我们运用所学的东西是自然而然的——更直接地说出来可能不太中听:“为您掌握的不好,自然觉得没用”。
打个比方,基本上所有的系统都会有“分类系统”,一个大分类下面有多个子分类,子分类下还会有更多子分类。那么现在有了个需求:由于需要垂直地列在一个下拉框中供用户选择,而分类之间的关系使用缩进来表示。在这里分类结构其实就是一颗树,而这个任务其实就是对树的深度优先遍历,于是可能您对书本印象比较深刻的话,就会说用递归,用回溯法。但是不少朋友虽然会解决这问题,解决的方式也不错,可是却没有意识到自己在用什么算法或是数据结构——只是解决了一个问题而已。这其实也比较正常,如果您回忆一下可能就会想起来,学习算法往往都会是依靠“演变”来的,只要具备了一定了逻辑思考能力,算法和数据结构在“一定程度”上也是较为“自然”的东西,并非需要死记硬背。老赵认识个朋友,在做题的过程中把AVL树给彻底忘了——是彻底忘了有这个东西,但是他发现二叉树的退化之后,就自己设法通过旋转来保持平衡。当然这种演变是一种“能力”,我们稍后再详谈。
不过很多时候出现的情况往往都是“不知道”导致“不会做”,至少也是“做不好”。打个比方,在您的程序中会用到大量的容器,您知道System.Collections命名空间下的容器都是用什么数据结构实现,适合什么样的操作吗?如果要求您在图片上打印文字,并且按照固定长度换行,您会使用类似二分法的O(logN)算法,还是直接遍历的O(N)算法呢?再比如把表达式树用作缓存,如果您不了解前缀树,二叉搜索树,以及哈希表的实现方式,可能就只能做出字符串这个低效的选择了。您可能又会想到说,“平时项目真的遇不到”,那么老赵还是重复刚才的话“这个可以遇到”——只是您不知道有其他选择而已。
如果跳出所谓算法和数据结构,其实任何的基础对您工作的作用大都类似。按照老赵之前举过的例子,很多东西都是这样:
了解Windows,才能写出更好的.NET应用程序,或者作postmortem调试。
了解计算机体系结构,才能在多CPU,多核时代写出真正高效而又正确的应用程序。
了解内存分页或线程调度方式,对您应用中设计缓存策略或任务分配有很高的参考价值。
……能够从纷繁复杂的选择之中作出最合理的判断和决策是一种能力,这需要对大量事物进行了解,分析,沉淀,并且能够在脑海中形成映射。如果把人脑看作是一种存储器的话,其中可以就是在一个个单元格中存放着两大类信息:“知识”和“能力”。“知识”可以把问题转化为解决方案,而“能力”则是把知识转化为另一种知识。老赵不知道人脑在得到一个问题的时候是怎么去寻找知识的,这涉及到不同人的索引方式。但是无论是哪种方式,信息越多,查找一次所需要的时间也势必越多。如果没有找到直接能够解决问题的“知识”,则需要一个或多个“能力”把已有知识通过一次或多次转化为另一种,可能是我们原本所没有的知识,而这种能力,我们经常会把他们叫做“推理”,“演变”或者是“融会贯通”能力。
这也就是所谓“能力”最为关键的作用,它们可能也是人类在无法借助外力的情况下唯一获取新知识的途径。
我们假设人脑可以存放的总信息数量确定,在这种情况下,知识太多,能力便少,则获得新知识的成本增加;知识太少,能力虽多,却在解决问题时都需要“推理演变”一番,这也是一种浪费,就好比很少有人会用“公理”去证明一个命题,因为使用“定理”或“推论”效率可以更高。因此,把“知识”和“能力”进行分配是一种艺术,只有达到一种和谐的平衡,一个人才能更好更快地解决问题。
老赵很笨,没有学习的诀窍,唯“埋头苦学”,“勤于思考”把字箴言尔,对我来说无论是“知识”和“能力”都由此而来。有朋友可能会说,我平时不主动学习,等需要的时候再去了解。老赵不同意这个观点,因为这里有个悖论:如果您不自主学习,又如何可以在真正遇到问题的时候知道该使用什么东西呢?做出合适的选择是一个需要积累的过程,而如果不主动学习,很可能最终只会造成重复劳动。就像刚才提到那样,我们需要对大量事物进行了解,分析,沉淀。可能有时候学不进去也要学吧,可能发现美的那一刻,只是因为量变终于引起质变了。
--------------------------------------------------------------------------------
其实引发老赵写下这篇文章的原因是一次(或者说是几次)面试。某培训机构总是打电话来想要“介绍”他们一些学生来公司面试,其语言诚恳让人不忍拒绝。可是一次又一次强调我们需要基础扎实的学生,但是每一次带来的让人很不满意。我在想,他们花了那么长时间读完大学,然后再花大笔大笔的钱去培训机构“进修”,那么多年下来还是如此水平,连我都不由得为他们心痛。当然这样的情况是普遍状况,与是否是某培训机构的学生无关,这是我进行数百次面试中所发现的共同点。例如刚才培训机构的学生,没有一个人能够把一个数组中所有元素反序一下,而一题简单的字符串分割就能考倒9成的面试者。这样的能力让人如何可以接受?理由更加荒唐,有的说“我是学测试的,不是做专业开发的”,“我是做应用的,不熟悉算法”——这种问题算是专业开发吗?算是算法吗?
此外,上文也提到了,很多东西感觉“没有用”是因为本身就不知道可以用。例如以下的一系列文章,目的是把表达式树作为Key,在一个缓存容器中存储数据。如果你不知道一些数据结构的内容,可能就只会想到“拼接成字符串(也就是下文的SimpleKeyCache)”一种情况了——然后就这样使用,使用到头。
最后你认为:数据结构还是用不到嘛。事实上呢?数据结构其实往往是推导而来的:
提出数据结构A,发现其缺点。
3. 数据结构和算法应该掌握到什么程度,需要掌握哪些知识
呵呵,思想很重要,其实真正使用时,已经有很多实现,但是理解数据结构和算法对于以后所学东西的理解是非常有用的...至于程度的话,就看你需要达到什么程度了..
像排序算法,二分搜索算法,深度优先和广度有限搜索,当然,对于基本数据结构,栈,队列,树。都有一些基本的操作,
而基本算法的思想应该有:
1、回溯
2、递归
3、贪心
4、动态规划
5、分治
4. 我想把c++,数据结构算法,数据库,游戏软件开发的基础打扎实!系统结构我也要了解!我有很多网友都是
还是得保证有兴趣,如果只是为了钱,很难做到年薪百万,做到了你也会过得很痛苦很煎熬,得不偿失。假如有那么几年,你每天得工作12个小时或者14个小时,周末经常得加班,而且拿的钱不比那些看似活得很轻松的同学多,那时候你还会有现在的热情吗?
5. 数据结构与算法分析
本文出自:
www点54manong点com
请尊重原创,转载请注明出处,谢谢!
什么是数据结构,为什么要学习数据结构?数据结构是否是一门纯数学课程?它在专业课程体系中起什么样的作用?我们要怎么才能学好数据结构?… 相信同学们在刚开始《数据结构》这门课的学习时,心里有着类似前面几个问题的这样那样的疑问。希望下面的内容能帮助大家消除疑惑,下定决心坚持学好这门课:
1 学习数据数据结构的意义
数据结构是计算机科学与技术专业、计算机信息管理与应用专业,电子商务等专业的基础课,是十分重要的核心课程。所有的计算机系统软件和应用软件都要用到各种类型的数据结构。因此,要想更好地运用计算机来解决实际问题,仅掌握几种计算机程序设计语言是难以应付当前众多复杂的课题。要想有效地使用计算机、充分发挥计算机的性能,还必须学习和掌握好数据结构的有关知识。打好“数据结构”这门课程的扎实基础,对于学习计算机专业的其他课程,如操作系统、数据库管理系统、软件工程、编译原理、人工智能、图视学等都是十分有益的。
2 为什么要学习数据结构
在计算机发展的初期,人们使用计算机的目的主要是处理数值计算问题。当我们使用计算机来解决一个具体问题时,一般需要经过下列几个步骤:首先要从该具体问题抽象出一个适当的数学模型,然后设计或选择一个解此数学模型的算法,最后编出程序进行调试、测试,直至得到最终的解答。例如,求解梁架结构中应力的数学模型的线性方程组,可以使用迭代算法来求解。
由于当时所涉及的运算对象是简单的整型、实型或布尔类型数据,所以程序设计者的主要精力是集中于程序设计的技巧上,而无须重视数据结构。随着计算机应用领域的扩大和软、硬件的发展,非数值计算问题越来越显得重要。据统计,当今处理非数值计算性问题占用了85%以上的机器时间。这类问题涉及到的数据结构更为复杂,数据元素之间的相互关系一般无法用数学方程式加以描述。因此,解决这类问题的关键不再是数学分析和计算方法,而是要设计出合适的数据结构,才能有效地解决问题。下面所列举的就是属于这一类的具体问题。
例1:图书馆信息检索系统。当我们根据书名查找某本书有关情况的时候;或者根据作者或某个出版社查找有关书籍的时候,或根据书刊号查找作者和出版社等有关情况的时候,只要我们建立了相关的数据结构,按照某种算法编写了相关程序,就可以实现计算机自动检索。由此,可以在图书馆信息检索系统中建立一张按书刊号顺序排列的图书信息表和分别按作者、书名、出版社顺序排列的索引表,如图1.1所示。由这四张表构成的文件便是图书信息检索的数学模型,计算机的主要操作便是按照某个特定要求(如给定书名)对图书馆藏书信息文件进行查询。
诸如此类的还有学生信息查询系统、商场商品管理系统、仓库物资管理系统等。在这类文档管理的数学模型中,计算机处理的对象之间通常存在着的是一种简单的线性关系,这类数学模型可称为线性的数据结构。
例2:八皇后问题。在八皇后问题中,处理过程不是根据某种确定的计算法则,而是利用试探和回溯的探索技术求解。为了求得合理布局,在计算机中要存储布局的当前状态。从最初的布局状态开始,一步步地进行试探,每试探一步形成一个新的状态,整个试探过程形成了一棵隐含的状态树。如图1.2所示(为了描述方便,将八皇后问题简化为四皇后问题)。回溯法求解过程实质上就是一个遍历状态树的过程。在这个问题中所出现的树也是一种数据结构,它可以应用在许多非数值计算的问题中。
例3:教学计划编排问题。一个教学计划包含许多课程,在教学计划包含的许多课程之间,有些必须按规定的先后次序进行,有些则没有次序要求。即有些课程之间有先修和后续的关系,有些课程可以任意安排次序。这种各个课程之间的次序关系可用一个称作图的数据结构来表示,如图1.3所示。有向图中的每个顶点表示一门课程,如果从顶点vi到vj之间存在有向边<vi,vj>,则表示课程i必须先于课程j进行。由以上三个例子可见,描述这类非数值计算问题的数学模型不再是数学方程,而是诸如线性表、树、图之类的数据结构。因此,可以说数据结构课程主要是研究非数值计算的程序设计问题中所出现的计算机操作对象以及它们之间的关系和操作的学科。
学习数据结构的目的是为了了解计算机处理对象的特性,将实际问题中所涉及的处理对象在计算机中表示出来并对它们进行处理。与此同时,通过算法训练来提高学生的思维能力,通过程序设计的技能训练来促进学生的综合应用能力和专业素质的提高。
3数据结构课程的内容
数据结构与数学、计算机硬件和软件有十分密切的关系,它是介于数学、计算机硬件和计算机软件之间的一门计算机专业的核心课程,是高级程序设计语言、操作系统、编译原理、数据库、人工智能、图视学等课程的基础。同时,数据结构技术也广泛应用于信息科学、系统工程、应用数学以及各种工程技术领域。
数据结构课程重在讨论软件开发过程中的方案设计阶段、同时设计编码和分析阶段的若干基本问题。此外,为了构造出好的数据结构及其实现,还需考虑数据结构及其实现的评价与选择。因此,数据结构的内容包括三个层次的五个“要素”,如图1.3所示。
数据结构的核心技术是分解与抽象。通过分解可以划分出数据的三个层次;再通过抽象,舍弃数据元素的具体内容,就得到逻辑结构。类似地,通过分解将处理要求划分成各种功能,再通过抽象舍弃实现细节,就得到运算的定义。上述两个方面的结合使我们将问题变换为数据结构。这是一个从具体(即具体问题)到抽象(即数据结构)的过程。然后,通过增加对实现细节的考虑进一步得到存储结构和实现运算,从而完成设计任务。这是一个从抽象(即数据结构)到具体(即具体实现)的过程。熟练地掌握这两个过程是数据结构课程在专业技能培养方面的基本目标。
结束语:数据结构作为一门独立的课程在国外是从1968年才开始的,但在此之前其有关内容已散见于编译原理及操作系统之中。20世纪60年代中期,美国的一些大学开始设立有关课程,但当时的课程名称并不叫数据结构。1968年美国唐.欧.克努特教授开创了数据结构的最初体系,他所着的《计算机程序设计技巧》第一卷《基本算法》是第一本较系统地阐述数据的逻辑结构和存储结构及其操作的着作。从20世纪60年代末到70年代初,出现了大型程序,软件也相对独立,结构程序设计成为程序设计方法学的主要内容,人们越来越重视数据结构。从70年代中期到80年代,各种版本的数据结构着作相继出现。目前,数据结构的发展并未终结,一方面,面向各专门领域中特殊问题的数据结构得到研究和发展,如多维图形数据结构等;另一方面,从抽象数据类型和面向对象的观点来讨论数据结构已成为一种新的趋势,越来越被人们所重视。
6. 作为一名优秀的程序员,要具备哪些基本功
程序员(英文Programmer)是从事程序开发、维护的专业人员。
作一个真正合格的程序员,需要具备:
1:团队精神和协作能力
团队精神和协作能力是作为一个程序员应具备的最基本的素质。
2:文档习惯
文档是一个软件系统的生命力。作为代码程序员,必须将30%的工作时间写用于技术文档。没有文档的程序员势必会被淘汰。
3:规范化的代码编写习惯
知名软件公司的代码的变量命名、注释格式,甚至嵌套中行缩进的长度和函数间的空行数字都有明确规定,良好的编写习惯,不但有助于代码的移植和纠错,也有助于不同技术人员之间的协作。
4:需求理解能力
程序员要能正确理解任务单中描述的需求。
5:模块化思维能力
作为一个优秀的程序员,其思想不能在局限当前的工作任务里面,要想想看自己写的模块是否可以脱离当前系统存在,通过简单的封装在其他系统中或其他模块中直接使用。
6:测试习惯
测试是软件工程质量保证的重要环节,但是测试不仅仅是测试工程师的工作,而是每个程序员的一种基本职责。程序员要认识测试不仅是正常的程序调试,而要是要进行有目的有针对性的异常调用测试,这一点要结合需求理解能力。
7:学习和总结的能力
程序员是很容易被淘汰的职业,所以要善于学习总结。
7. 数据结构怎么学
算法的意义就是解决问题。有很垃圾的算法,可以让一个特别简单的问题跑到宇宙消失那一天也不能解决,好的算法可以让它在一秒内解决。
还有,算法上可能不起眼的小毛病会让程序效率以几何级数增长,一个小优化可能让它在短时间内解决更多的问题。
比如数独,可以用回溯法直接解决,效率也非常高(大概一秒10个吧,一般数独),但是如果加入人的智慧的话程序会更快的解决问题。
还有一些,现在没法说明的问题,也都是因为算法的不同。
所以说算法可以决定程序的好坏。
另外辅助的就是数据结构,在算法的基础上,优化数据结构会给程序带来相当大的提速。比如堆,平衡树……这些,可以用来给算法效率带来质的提升。
还有栈,队列,这是搜索算法中不可少的数据结构。
程序=数据结构+算法
另外,如果是说意义的话,现实中也很大。
WAR3,别说你没玩过(其它策略类也可以),当小兵移动的时候,就有很多算法。一般采用的是A*,这样智能型搜索。
在实际中,导航仪(GPS定位的)当然不会使用经典算法,但是经典算法也是可以解决地图路径的基础算法(dijstra,单源最短路)
还有一些货物的运送问题,可以用最大流找出图中s和t的最大货物运量。。
太多太多了。。
这就是我的理解。。不过。。我还高中。。我大学争取转到计算机科学与技术
8. 只把c++这门语言学好,包括stl,算法,数据结构,基础都打扎实而不去学MFC什么的开发工具,能做程序员吗
按照我的理解,学不学MFC不中要。但至少要会调用windows api 吧。至少我在公司没有见过不会用windows api的人。如果你是做纯linux之类的开发,那就不必了。
你说的学好stl,算法,数据结构。这样我觉得你适合去研究所研究算法啥的。你是写不出来一个有应用价值的程序的。
二级、三级的就算了,没有一个找程序员的公司会承认这种证书。如果你应聘的是office操作员,那这个证书可能还有用。
我原来学MFC的时候也很痛苦。别着急慢慢来,其实不是很难。
最后推荐你个视频,就是孙鑫老师的vc++讲座。20个课时。网上有,自己搜吧,都是免费的。
9. 请问大学学习数据结构与算法(C语言版)需要多强的C语言基础
李明杰老师:每周一道算法题 通关算法面试课(超清视频)网络网盘
链接: https://pan..com/s/14GZpVf03Mf9E-YnMrrR4Pw
若资源有问题欢迎追问~