算法题刷不动
⑴ 做为一个初学者,如何才能学好算法呢,感觉自己很菜
凡事都讲究动机,你学习算法的目的是什么呢?目的不同,学法不同侧重不同。
如果你是准备跳槽,以面试为目的,可以先从cracking the coding interview入手,题目是按照链表,树图,递归这种章节安排的,每章都有题目,难度适中,第一遍自己写不出来很正常,画图分析,然后再做第二遍,第二遍就快很多,理解也深刻了,实在理解不了的算法,没办法,背吧,说不定到后面不知什么时候就理解了,所谓读书百遍,其意自现,算法也一样。
如果你是半路出家的程序员,看书觉得看不下去,可以试着看看视频,现在网络这么发达,网上有很多免费的精品视频,比如潭州教育老师的数据结构以及清华邓俊辉老师的数据结构都是特别好的课程。
最后一种就是你对算法理论和精髓确实感兴趣,且有一定的数学功底,你可以尝试研究下《算法导论》,甚至《计算机程序设计艺术》(反正我是看不下去)。
其实,无论出于哪种目学习算法,其实最重要的一点就是:多编程实践,多思考,这是废话,但这也是真理。
⑵ 算法怎么就这么难
推荐书籍:数据结构与算法分析:C语言描述
可以多看书多做题哦,或者关注我们的v信宫仲号《ACM算法日常》,有很多算法学习的资料~
⑶ 算法如何刷题
1、原题
我自己感觉原题的概率还是挺大的,特别是剑指offer的66题更是如此。千万别小看这66题,这几十道题里面基本所有的算法类型都有包括在内,常用的数据结构,操作方式,常用算法思路都有不少的题。
如果真的能够充分理解这几十道题的最优解,我感觉其实已经形成基本的算法思维了。
另外,leetcode的原题也很常见,因为LC本身题量大,在里面出原题不是为了考倒你,而是检验你的刷题质量。
毕竟那些大公司面试官也不是傻子,知道你在面试前肯定会大规模刷题的。所以把刷过的题完全搞懂才是最重要的。
2、改编题
改编题就很显而易见了。改编题大多需要从基本的算法原理中找到处理的思维,然后结合实际题干进行性能优化,就能够搞定。
这里要记得一点的是,正常的算法考察不会故意刁难你(正常情况),也不会给过多的时间让你思考和敲代码。
所以遇到改编题不要想得太复杂,尽量要找到它的算法思维是什么。怎么说呢,透过现象看本质。我总结的改编题有以下几种思路:
1)新的数据结构,换汤不换药。比如最常见的排序算法的改编,原来是对数字进行排序,现在对链表排序等等。比较难一点的可能会遇到自定义的数据结构。但是算法本质不会变。
2)算法类型改编。
这里要说的就是一个比较大的范围,比如动态规划、贪心算法、递归、回溯和分治等等。这种是从算法大的类型上进行改编,很难用相同的套路去解题。
遇到这类题的关键就是要先弄明白算法核心。比如动态规划的状态方程,贪心算法的局部最优情况,递归回溯的边界判断,分治的子问题划分等等。这种类型的确比较难把握,怎么硕呢,每种类型的都来搞几道感觉感觉吧。
3)添加应用题背景。
这种题目看起来不难,但是难就难在对应用题背景的理解,需要去理解题意,然后考虑合适的数据结构和处理算法。这里面有数学建模的思维在里面,需要把一堆无用的信息剔除,筛选出有效的信息,然后才能选择正确的算法。
3、创新题
这类题考察的是你的扩展思维,如果说上面的题考查的是你的思维深度,这种题就是考察算法的广度。可能一看题目,完全没见过这种类型。但是算法本身其实不就是让计算机代替人脑进行高重复性的计算嘛。
首先你需要想到你应该去怎么算这个题,然后再换到计算机上,会发生什么问题(空间时间问题,运行效率,代码冗余等等),之后再想通过经典的算法原理来解决这些
1、题型分类
按照个人的习惯,喜欢按照一种类型狂刷,然后再刷另外一种类型。一般常见的算法类型可分为:
数组、链表
包含基本排序算法、二分查找、链表的一系列操作。
栈、队列、堆
利用栈、队列互相实现,堆的使用
二叉树与图
主要是遍历算法和节点的计算:
二叉树四种遍历方式、广度优先遍历(BFS)和广度优先遍历(DFS),节点到节点距离等等。
哈希表
使用标准库自带的模板或者函数就很简单了,一般会与其它数据结构相结合来提升时间复杂度。
字符串操作
字符串的操作也很多,本质上可以看作是数组的操作。另外字符串的一些匹配和寻求字串的算法还是非常具有思考价值的。KMP,马拉车等等。
递归
重点掌握边界判断条件。
回溯
重点掌握边界判断条件。
分治
重点掌握如何划分子问题。
动态规划
题太多了,可从一阶dp到二阶dp理解不同的状态方程。
贪心及其它
这个就很容易理解了,遇到贪心题应该要偷笑了。
2、高频热点多刷
这不多说了吧,Leetcode热题HOT 100。你值得拥有。
在不知道怎么刷的情况下,不如先刷起来。刷个题没那么多捷径,只有坚持刷起来了,才会形成自己的思维方式和学习习惯。
我建议是先按照类型刷,每个类型刷十几二十道。然后打混按照算法热度排序重新查漏补缺。
3、思路回顾
许多同学在一股脑刷了很多题之后,再看做过的题会发现忘了不少。可能大家都是这样的吧。我觉得是因为在刷题的时候过于心急,理解了大概就过了,或者类型做的太杂,没有留下印象。
我比较喜欢的方式是偶尔会重新看看曾经做过的题,就看题目然后想思路,再画一画步骤演进,没时间就不细敲了。这样可以增强一下思维记忆,之前理解过的东西,再回忆起来还是非常快的。
⑷ 我目前在自学算法,但是我感觉很吃力啊。有时候一个稍微复杂的算法,想很久都不能明白。希望前辈们给点建
复杂算法难理解是肯定的
比如波利亚计数定理,就算我写出程序了也没有完全理解
其实弗洛伊德最短路算法也挺难理解的
可以自己先试着解答题目,然后再去看算法
或者debug,单步调试看看算法是怎么工作的
⑸ 秋招笔试算法题不会做还怎么办
可以通过不断地思考,总结,归纳,不断刷题来提高自己算法题的水平,没有什么困难的,你需要尽力去学习,祝取得好成绩。
如何提高学习效率
时间长并不一定有用,问题的关键是:你的单位时间内的学习效率有多高!看着同学们一天到晚都在学习,但为什么效果不佳?这是一个学习中的老大难问题,也是最令家长、老师、学生感到困惑的问题。解答这个问题的钥匙就是利用效率法则——高效利用时间,提高学习效率。
在伏尔泰的作品中曾经提到过一个谜语:“世界上有一样东西,它是最长的也是最短的,它是最快的也是最慢的,它最不受重视但却又最受惋惜。
没有它,什么事也无法完成,这样的东西可以使你渺小的消灭,你伟大的永续不绝。善于利用时间学习中,不仅要懂得珍惜时间,更要学会运筹时间,使自己在最短的时间内,得到最大的学习效合理分配精力在学习中。
学会排除干扰在学习中,来自外界和自身的一些干扰都会影响你的学习效率,你必须要学会排除和隔离这些学习中的消极因素,将它们的负面效应降到最低你想到这样唯一的东西是什么了吗?没错,它就是时间。
学习是在时间中进行的。无可置疑,谁能拥有更多的时间,谁就能获得更多的知识。长久以来,人们一直在探索怎样勒住时间的缰绳,以增强自己利用时间的能力。掌握一些高效利用时间的方法,如优化事序、最佳安排、排除干扰等方法能使你的有效学习时间比别人多很多倍。
⑹ 数据结构,只会做选择填空题,算法编写题不会写怎么办,谁有方法让我三个月内学会写算法题
大哥,你这是在开玩笑吧,计算机领域中三大难学科之一,哪有那么容易学会,算法最好是经常敲代码,多翻书,估计3个月内最多能掌握链表,栈,队列和串,个人感觉图,树,递归这三个数据结构要有逆天的大脑和逻辑思维才写得出来