算法算法与数据结构入门导论

教材的事就不说了,下面开始讲如何学习算法和数据结构。其实没啥好讲的,无非就找两本好书看看,然后自个在机器上敲敲,熟悉熟悉,技巧性的东西,多写写,跑跑代码,就差不多可以掌握了,没什么好说的。

最好呢,就是先找一个讲课水平高的老师,跟着上课,先听,把核心的东西先掌握,那就是算法思想,这个是最重要的,贯穿计算机科学的始终,这个不好好学,就会有问题。正好最近跟别人讨论过这个问题,就顺带说说我的看法。因为我发现一般培训班出来的人就对这个比较排斥,觉得非常非常难,这就是算法思想没掌握,底子没打好,培训班的课程毕竟是市场产物,肯定就比较短视,只教市场上最火热的框架、技术之类的东西,比如ssm框架,vue框架,gin框架之类的,看似学了一大堆技术,但说实话,都是花架子,这种东西学再多不过也就是apicaller,立不起来,5年经验跟1年经验没啥区别。

当一个人不了解一个东西的时候,就往往出现认知偏差,可能会把某个东西神化,比如说算法,他就会觉得这东西太高级了。这我就很疑惑:大学计算机系是个人都会的东西,哪里高级了?看不出来。一个工具而已,谁会觉得自己家里的铁锨和锄头高级?都是前人玩剩下的东西,非要给赋予一层神秘感,就很奇怪,总要把一个简单问题复杂化,这是很危险的,如果一个人在内心里将完成一件事的难度无限拔高,那么他很可能就无法完成那件事,毕竟未战先怯,兵家大忌,你都没有勇气去面对对手,那怎么可能战胜对手?(对,就把算法想象成一个对手)

那位网上认识的朋友,他觉得“算法这东西可不是谁都能搞的”。

我是这样回答他的:你非要这么说,那就没得说了,很简单东西,没必要复杂化,算法就是解决问题的能力,你以为是啥,为什么程序=算法+数据结构因为你是要解决具体的实际问题,不是说学什么屠龙术,这些问题很可能就是你经常遇到的,别人一看就知道咋回事,迅速解了,你还要cvsearch一波,这不是聪明,投机取巧从来都不是聪明,你cv了代码,看不懂代码是在干啥,说白了就是搬运工,没有技术含量的事,随便找个人都能替代掉,不敢提涨工资,因为你可能学了好多年这个啥都不会,啥都没学到,最后35岁光荣毕业,外卖骑手+1,所谓高级程序员低级程序员无非就是解决问题能力的高低,跟工作年限真没太大关系,不然为啥人家愿意招985211应届生,也不愿意招培训班出来的,要想,要多想,就说到这吧,一会又被群体而攻之就不好了,毕竟忠言逆耳。

为什么我会说“群体而攻之”,“忠言逆耳”这样的话,因为之前真的遇到过,就在同一个群,这个群吧,大概培训班的学生多一点,就是说基本都是学了一堆花架子,然后科班的那一套计算机科学的东西,如计算机组成原理,操作系统,编译原理,计算机网络,算法设计,数据结构,数据库系统原理之类的东西,他是一个都没学过,这就导致他底子很差,只能干quickstart,readme.md,cvsearch之类的活,干啥都是面向百度编程,面向CSDN编程,稍微玩点花活就把他难住了,比如说限流,这个不就是流控吗?你都不用看算法,学过计算机网络的,学过TCP协议的,能不知道滑动窗口?毕竟这么重要的东西呢。我直接把leetcode上的滑动窗口的题目扔给他,人家一脸懵逼。

所谓的“穷人思维”,就是说他走的每一步都非常短视,没有任何长远打算,走一步看一步,做事全凭运气,全靠个人有限的经验,这就很危险,就很容易最后无路可走,当一个人被眼前的东西所迷惑的时候,就很难走的更远,所谓“一叶障目”,“听了好多大道理,却还过不好这一生”说的就是这种人,他从来就没有认真审视过对方的观点,而是固执己见,认为只要跟他意见不同的就是故意跟他抬杠,就是他的敌人,就可以肆无忌惮的挑衅,敌视,辱骂,他们内心自卑又脆弱,听不得一点批评的意见,哪怕是最温和的批评,他也会认为你是在针对他,遇到问题全是别人的锅,跟自己一毛钱关系都没有,没有一点责任意识,年龄上虽然是成年人了,但是心理上跟小孩没啥区别,易怒、暴躁、软弱、自卑。算了,讨论算法学习,这扯到心理学是咋回事,就此打住。

之前一位老同学,搞运维的,跟我诉苦,说他们那系统单元测试没毛病,一串起来就出问题,当时说的具体的我记不大清了,大意我就建议说让那个人试一下写个适配器,把问题解决。然后这老兄弟就说咱理论一套一套,要实践如何如何。把我逗乐了,这都是基本功呀,不是理论一套一套的,就是你不懂的话,就两眼抓瞎,网上到处搜答案,到处问人,从CSDN找答案,十个答案九个错,七个都是在复制粘贴别人的答案,也就是自个都没明白呢,也不实际玩一下,就直接人云亦云。

没人掌握整个系统的全部细节,不像硅谷好多老程序员,就5、60岁的那帮大爷,那叫一个强,人家是真的掌握每一处细节,你把他辞了,别人来了也接不了他的活,回头你还得把人请回来,给人涨一波工资。毕竟太复杂了,越到后面越复杂,越不敢轻易改动,但是人家就无所谓,各个细节全公司没有比他更清楚更了解的,动个小手术,动个刀子啥的,这不easy得很。

leetcode,其实社区环境还好,氛围还行,没有啥互相诋毁,踩踏,谩骂之类的事,毕竟大家都是文明人。就是刷题圈真的现在风气全给带坏了,各种攀比,各种歧视,各种撕x,各种抱团站队,已经在向饭圈靠拢了。知道的是做了几道计算机奥数题的学生,不知道的还以为进了某个流量明星的饭圈打榜群了,就做几道前人已经做了无数遍的题,这都能做出优越感来,真的令人匪夷所思。一个学生,一个打工人,不好好学习,想着提高技术的技术水平,整天为几道题跟人撕x,这不吃饱了撑得。

曾有位朋友跟我讨论这个问题,说这些人都是科学家,我们工程师不需要搞发明创造创新,拿着别人的东西直接用就行,我是非常反对这种观点的。工程师不需要创新吗?工程师如果没有自己独到的地方,那他跟工人有啥区别?当一个理论功底扎实,实践经验丰富的工程师,这个人要是还有一双善于发现问题的眼睛,能够发现问题,并研究出巧妙的解决方案,这样的人难道不是人才吗?一个人就不能既是工程师又是科学家还是说科学家只负责理论研究,只负责创新,工程师只管埋头干活就行这样的话,有没有可能科学家的理论变成了空谈,因为他没用工程经验作为底子,而工程师则蜕变为大号工人,因为他不需要思考。

其实现在这种状况,挺悲哀的。就是说算法没有真正变成学生的知识,而是变成一种脑力游戏之类的东西,变成了进入所谓大厂的敲门砖之类的东西,就是已经僵化到这个程度了,完全丧失了其本来的东西。对网上搞算法培训的,和很大一部分学生来说,算法这个东西其实已经被异化了,完全被工具了,成为了“无用”的“大厂入场券”,然后他去了给人搬砖,就说这个东西没什么卵用,本质还是没有学会算法,过分注重技巧性,思想是一点都没有掌握。“题海战术”绝对是最笨的学习方法,庸才可以通过背原题跟天才同台竞争而不落下风。

如果你真的对算法感兴趣,从工程上去玩,去看,你会发现很多有意思的,绝不是说会做几道计算机奥数题就算是会算法了,那太小儿科了,真正的大科学他大概率就是找个一个工程上的难题,然后设计出一种非常巧妙的方法,把问题给解了,然后这个就是他发明的算法,就是这么个事,既考验基本功,考验阅历,工程经验,还有设计能力,算是一个人的综合素质方面的考察吧。

从Amazon出来的人写了一本《ProgrammingInterviewsExposedCodingYourWayThroughtheInterview》,你直接去Google搜就行,跟上面这本差不多,国内没翻译过来,书有点老了,但是很经典,这本书可以好好看一下。

左程云那本《程序员代码面试指南》这本书其实很像一本习题集,但是题目全是左程云先生自己做的,原创度就比较高,他其实讲的很细,然后最好配合他那套视频课程学,b站就有,很详细的,先看视频,在看书,你就会发现其实视频里讲的书上都有些影子,这就比较好。

《编程之美:微软技术面试心得》,习题集,很经典,可以好好看看。

刘汝佳先生和陈锋先生的《算法竞赛入门经典》这一套书是专门打竞赛的入门书,口碑相当不错,用c/c++语言写的。陈小玉女士的《算法训练营》也是偏重于竞赛的,用c++写的。

至于一些公众号主写的一些书也可以参考,但是基本都是偏重技巧性的东西,看看就好,别沉迷。打游戏要适度,做计算题奥赛题也要适度,沉迷就有害了。如下:《代码随想录》、《算法通关之路》、《labubadong的算法小抄》。

说句题外话,如果你数学底子好的话,可以直接上《算法导论》和高司令的《计算机程序设计的艺术》这一套,不要怂,直接干他,你能把这两巅峰选手干趴下。什么BAT,这个段位的选手可以直接略过了,直接去FAANG,现场表演什么叫“那年我双手插兜,不知道何为对手”,对面直接投降,还面个啥,人家就一个“水滴”就可以直接干趴下你那三千艘恒星级战舰,还有必要打吗?

EdsgerW.Dijkstra写了本《编程的修炼》,可以看看,大佬写的,这个人真的牛。百度百科粘的,成就:

1.提出“goto有害论”;

2.提出信号量和PV原语;

3.解决了“哲学家就餐”问题;

4.Dijkstra最短路径算法和银行家算法的创造者;

5.第一个Algol60编译器的设计者和实现者;

6.THE操作系统的设计者和开发者;与高德纳并称为我们这个时代最伟大的计算机科学家的人。

如果你计算机基础扎实的话,你肯定知道什么意思,这一堆,计算机领域很重要的东西,印在课本上的,这个老头一个人搞出来的,你不好奇他怎么搞的?那就看一下人家的书,主要是好好学学思路,好好看看他研究工作的心路历程,这个很重要,学会了就是你的,完全掌握,吊打同龄一帮混子,跟玩似的。

《柔性字符串匹配》(GonzaloNavarro,纳瓦罗,MathieuRaffinot,拉菲伊诺特)能看尽量看吧,名字就能看出来,讲字符串的,数学好好学。英文名《FlexiblePatternMatchinginStringsPracticalOn-lineSearchAlgorithmsforTextsandBiologicalSequences》。

其实还可以往深了延伸,比如DP(动态规划)是从哪里来的?运筹学,那么你可不可以去找一本运筹学课本,看看人家到底在研究什么?在解决什么工程上的具体问题,这个好不好?不要整天沉迷于“偷房子”,“买卖股票”,“背包放东西”之类的智力游戏,算法不是什么智力游戏,而是现实中具体工程问题解决方案的抽象化,你把这个当智力游戏玩你就载进去了,出不来了。没必要通过这个显示自己智商高,没意义,说实话人跟人的智商真差不了多少,就是一个习惯问题。正常人谁会觉得“最强大脑”那些演员是什么天才、学霸之类的?天才、学霸就是纯靠记忆力的?一个人之所以被称为天才,一定是他在他所在的领域做出了巨大的贡献,解决了什么大问题,难题,而不是说他参加了什么低水平的靠包装人设、讲故事、贩卖焦虑的三流综艺节目成为天才,要搞清楚这一点。

最后,哲学史看一下,就研究研究那些人的思考方法,分析和解释问题的思路,这很重要。不了解哲学,不知道苏格拉底,遇到问题只会追求所谓的“标准答案”,缺乏更深入的思考,就入不了科学这道门。

最后这两个是很实用的东西,不要觉得跟算法无关,算法你不就是解决问题的方法嘛。那多研究研究,把别人的思考、分析、解释的这些东西学到手,然后再多想想,未尝自己搞不出来一个,要敢想,不要害怕,中国的很多小孩就是胆子小,内向,这个不太好,很多东西思路打开了也就那样,就怕自己给自己设限。

先看视频听思想,再做题,同时看书理解。看书先找英文的,直接看英文,算法英语同时学,提高英语水平,有利于阅读文档。

THE END
1.我是如何成为算法工程师的,超详细的学习路线51CTO博客各位十一过得如何? 假期,我回了趟老家,文章停更了几天。 写文章以来,被问到最多的问题就是「算法的学习路线」。 今天,它来了。 我会带着大家看看,我们需要学些啥,利用这个假期,我甚至还收集整理了配套视频和资料,暖男石锤啊,这期文章有用的话,别忘三连哦! https://blog.51cto.com/u_15967457/6170660
2.大学四年,从小白到大神,全网最硬核算法学习攻略,不接受反驳所以,死磕入门数据结构,可以学习下一些算法思想,而递归,你必须得入门,至于动态规划、回溯,我觉得慢点学也没有,可以后面刷题遇到时在学,而枚举、贪心,相对比较简单。 二、如何刷题 终于,到了刷题这一部分了,如果要说学算法的捷径,那么刷题便是最好的捷径,如果你刷的题很少,达不到一定的量,那么再多的捷径,估https://blog.csdn.net/xxue345678/article/details/131645896
3.读者问我怎么学算法,那就来聊点方法论腾讯云开发者社区本文借着如何学习算法这个话题,分享下我的一些思维方式,希望能给大家一些启发。 学算法也好,学技术也好,我觉得做任何事情,一定要明白自己的目标是什么。 这句话有两个关键词,第一个关键词是「目标」,可以量化的才叫目标。 你想变有钱,想学好算法,这就叫无法量化的目标,有多少钱才算有钱,学到什么程度才算学好https://cloud.tencent.com/developer/article/1880928
4.如何学习一个新算法那么我们为什么看paper,为什么实现某算法,我归结为两点: 1. 学习目的,扩展思路,如果处于这种目的,理解paper的精髓是最重要的。 2. 解决实际问题。那么应该丢弃的观点是我最初那样拿过来一篇paper也没理解透彻也不知道能不能解决问题,也不知道到底是不是可行,就先实现了再说。劳民伤财~ https://www.douban.com/note/279830751/
5.如何学习javascript高级算法?算法是一种思想,而不是某某语言高级算法,而且学习用javaScript描述的算法用处不大,C语言或者其他高级语言描述的算法会比较有用,javaScript只是一种脚本语言,一般的也不会用的多深入的 ,基本就是ajax和表单验证用的比较多。推荐学习的两本书:第一阶段:《JavaScript DOM编程艺术》看这本书之前,请先确认https://zhidao.baidu.com/question/587389093.html
6.如何选择机器学习算法可以下载机器学习算法备忘单。 设计器提供全面的算法阵容,例如多类决策林、推荐系统、神经网络回归、多类神经网络和K 平均值聚类。 每种算法旨在用于解决一种不同类型的机器学习问题。 有关完整列表,以及有关每种算法的工作原理与如何优化参数以优化算法的文档,请参阅算法和组件参考。 https://docs.microsoft.com/zh-cn/azure/machine-learning/studio/algorithm-choice
7.如何学习数据结构与算法?(加油,你可以的)jaiodfjiaodf如何学习数据结构与算法? (加油,你可以的) 精通一个领域(数据结构与算法) Chunk it up 切碎知识点 数据结构(https://naotu.baidu.com/file/b832f043e2ead159d584cca4efb19703?token=7a6a56eb2630548c) 庖丁解牛 把数据结构的一个又一个知识点分解开来https://www.cnblogs.com/ssaylo/p/12676845.html
8.如何更有效的将深度学习算法部署在计算资源有限的设备?如何更有效的将深度学习算法部署在计算资源有限的设备? 深度学习已成为许多机器学习应?程序不可或缺的?部分,现在可以在?数电?设备和服务中找到,从智能?机和家?电器到机、机器?和?动驾驶汽车。随着深度学习在我们?常?活中的普及,对快速且节能的神经?络推理的需求也在增加。神经https://www.thepaper.cn/newsDetail_forward_17558183
9.Python怎么从小白变大神?这些学习技巧你一定要知道!Python的算法包括排序、查找、递归、分治等,是Python的另一个重要特性。学习Python的算法可以提高编程思维能力和解决问题的能力。 4.学习Python的标准库和第三方库 Python 的标准库和第三方库提供了很多有用的功能和工具,学习如何使用它们可以帮助您更加有效地编写代码。 https://www.yutu.cn/news_52077.html
10.学习Python能用来做什么的问题python机器学习通过实现算法,该算法能够自动检测输入中的模式。 例如,你将1000张狗的图片和1000张桌子的图片输入给机器学习算法,让它掌握狗和桌子间的区别。那么当你给出新的图片让它识别是狗还是桌子时,它就能够进行判断。 这有点类似孩子学习新事物的方式。孩子是如何学习认知狗或桌子的呢?就是通过大量的例子。 https://www.jb51.net/article/280394.htm
11.一文看懂机器学习「3种学习方法+7个实操步骤+15种常见算法」除此之外,大家可能还听过“半监督学习”之类的说法,但是那些都是基于上面3类的变种,本质没有改变。 监督学习 监督学习是指我们给算法一个数据集,并且给定正确答案。机器通过数据来学习正确答案的计算方法。 举个栗子: 我们准备了一大堆猫和狗的照片,我们想让机器学会如何识别猫和狗。当我们使用监督学习的时候,我们https://easyai.tech/ai-definition/machine-learning/
12.机器学习(一)2万多字的监督学习模型总结? KNN 算法可以说是最简单的机器学习算法,构建和预测都非常简单。构建模型只需要保存训练数据集即可。想要对新数据点做出预测,算法会在训练数据集中找到最近的数据点,也就是它的“最近邻”。 ?一个邻居:KNN算法最简单的就是一个最近邻,也就是与我们想要预测的数据点最近的训练数据点。预测结果就是这个训练数https://www.flyai.com/article/515
13.17个机器学习的常用算法在此学习方式下,输入数据部分被标识,部分没有被标识,这种学习模型可以用来进行预测,但是模型首先需要学习数据的内在结构以便合理的组织数据来进行预测。应用场景包括分类和回归,算法包括一些对常用监督式学习算法的延伸,这些算法首先试图对未标识数据进行建模,在此基础上再对标识的数据进行预测。如图论推理算法(Graph Inferehttps://aidc.shisu.edu.cn/78/aa/c13626a161962/page.htm
14.科学网—[转载]强化学习在资源优化领域的应用基于这种行业趋势,本文针对强化学习算法在资源优化领域的应用展开调研,帮助读者了解该领域最新的进展,学习如何利用数据驱动的方式解决资源优化问题。鉴于资源优化问题场景众多、设定繁杂,划分出3类应用广泛的资源优化问题,即资源平衡问题、资源分配问题、装箱问题,集中进行调研。在每个领域阐述问题的特性,并根据具体的问题特性https://blog.sciencenet.cn/blog-3472670-1312677.html
15.深度学习高手笔记卷1:基础算法本书通过扎实、详细的内容和清晰的结构,从算法理论、算法源码、实验结果等方面对深度学习算法进行分析和介绍。本书共三篇,第一篇主要介绍深度学习在计算机视觉方向的一些卷积神经网络,从基础骨干网络、轻量级 CNN、模型架构搜索 3 个方向展开,介绍计算机视觉方向的里程碑算法;第二篇主要介绍深度学习在自然语言处理方向的https://www.epubit.com/bookDetails?id=UB7d8623610d375
16.《常用算法之智能计算(三)》:机器学习计算在给出机器学习计算各种算法之前,最好是先研究一下什么是机器学习和如何对机器学习进行分类,才能更好的理解和掌握一些具体的机器学习算法并将其用于实际问题的计算和处理。 学习是人类具有的一种重要智能行为,但究竟什么是学习,长期以来却众说纷纭。社会学家、逻辑学家和心理学家都各有自己不同的看法和说法。比如,http://www.kepu.cn/blog/zhangjianzhong/201903/t20190327_475625.html
17.复杂嘲下的OCR如何实现——深度学习算法综述目前,基于深度学习的场景文字识别主要包括两种方法,第一种是分为文字检测和文字识别两个阶段;第二种则是通过端对端的模型一次性完成文字的检测和识别。 3.1文字检测 顾名思义,文字检测就是要检测到图片中文字所在的区域,其核心是区分文字和背景。常用的文字检测算法包括以下几种: https://www.163.com/dy/article/F7N8HA5705118HA4.html
18.交换机如何实现自学习算法交换机可以隔离碰撞域,因此收到了广泛的使用,隔离碰撞域的实现是基于帧交换表,而帧交换表是通过自学习算法自动建立起来的,因此着重考虑自学习算法的实现。 交换机的简单认识 交换机本质上是一个多接口的网桥,自身可以进行碰撞检测并进行转发目的主机,当网桥收到一个帧时,并不是向所有的接口转发此帧,而是先检查此帧https://www.jianshu.com/p/ed03cf24b9b1
19.吴师兄学算法五分钟学算法吴师兄学算法(www.cxyxiaowu.com)提供许多数据结构与算法学习的基础知识, 涵盖 LeetCode 题解、剑指 Offer 题解、数据结构等内容。https://www.cxyxiaowu.com/
20.超详细算法岗的学习路线大总结!机器学习 or 深度学习基础 论文or 项目介绍 其他问题 & 向面试官提问 本文将从以上四点进行展开。 一、数据结构&算法题 随着算法岗越来越卷,Coding几乎成了面试必考的一项,而且在面评中的权重也越来越高,根据个人面试经验,如果这一环节没有很顺利得完成的话,几乎必挂,尤其对于非科班转行的同学,需要特别重视。 https://leetcode.cn/circle/discuss/SX3aa6/
21.人民日报:用好算法,迈向智能社会习近平总书记在主持中共中央政治局第九次集体学习时强调:“人工智能是新一轮科技革命和产业变革的重要驱动力量,加快发展新一代人工智能是事关我国能否抓住新一轮科技革命和产业变革机遇的战略问题。”人工智能具有多学科综合、高度复杂的特征,在推动其快速发展的各项技术中,算法至关重要。当前,“算法”一词也频繁出现在https://kjt.shaanxi.gov.cn/kjzx/mtjj/276381.html