教你学算法
1. 竟然是个教算法的老师
如果你真是要学习编程,而编程不是为了竞赛、考试,那么你遇上一位教算法的老师真是有福了。
有空你可问问你的老师,如何看待Donald E. Knuth所写的《计算机程序设计艺术》,你就会知道算法对你的学习是多么的有帮助。
比尔盖茨曾说过,“如果你认为你是一名真正优秀的程序员,就去读第一卷,确定可以解决其中所有的问题。”“如果你能读懂整套书的话,请给我发一份你的简历。”
这本书有三卷:
The Art of ComputerProgramming:
1.Fundamental Algorithms; 《基本算法》
2.Seminumerical Algorithms;《半数值算法》
3.Sorting andSearching。《排序与查找》
我现在收集到2、3卷的中文版(34MB)和1、2、3卷的英文版,PDF文件。 谁有第1卷中文版,告诉我。
2. 算法怎么学
贪心算法的定义:
贪心算法是指在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,只做出在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。
解题的一般步骤是:
1.建立数学模型来描述问题;
2.把求解的问题分成若干个子问题;
3.对每一子问题求解,得到子问题的局部最优解;
4.把子问题的局部最优解合成原来问题的一个解。
如果大家比较了解动态规划,就会发现它们之间的相似之处。最优解问题大部分都可以拆分成一个个的子问题,把解空间的遍历视作对子问题树的遍历,则以某种形式对树整个的遍历一遍就可以求出最优解,大部分情况下这是不可行的。贪心算法和动态规划本质上是对子问题树的一种修剪,两种算法要求问题都具有的一个性质就是子问题最优性(组成最优解的每一个子问题的解,对于这个子问题本身肯定也是最优的)。动态规划方法代表了这一类问题的一般解法,我们自底向上构造子问题的解,对每一个子树的根,求出下面每一个叶子的值,并且以其中的最优值作为自身的值,其它的值舍弃。而贪心算法是动态规划方法的一个特例,可以证明每一个子树的根的值不取决于下面叶子的值,而只取决于当前问题的状况。换句话说,不需要知道一个节点所有子树的情况,就可以求出这个节点的值。由于贪心算法的这个特性,它对解空间树的遍历不需要自底向上,而只需要自根开始,选择最优的路,一直走到底就可以了。
话不多说,我们来看几个具体的例子慢慢理解它:
1.活动选择问题
这是《算法导论》上的例子,也是一个非常经典的问题。有n个需要在同一天使用同一个教室的活动a1,a2,…,an,教室同一时刻只能由一个活动使用。每个活动ai都有一个开始时间si和结束时间fi 。一旦被选择后,活动ai就占据半开时间区间[si,fi)。如果[si,fi]和[sj,fj]互不重叠,ai和aj两个活动就可以被安排在这一天。该问题就是要安排这些活动使得尽量多的活动能不冲突的举行。例如下图所示的活动集合S,其中各项活动按照结束时间单调递增排序。
关于贪心算法的基础知识就简要介绍到这里,希望能作为大家继续深入学习的基础。
3. 如何提高算法
计算的准确性不但在“应试教育”中占主要地位,在“素质教育”的今天同样重要。因为式子题的计算是学生解决实际问题的基础,是每个小学生必须掌握的数学基础知识和基本技能。只有计算过硬,才能进一步学好应用题和其他学科知识。式子题计算是各年级的重要内容,根据学生的考试和作业看,造成成绩不理想的原因是计算能力差,准确率不高。造成这种现象的原因是多方面的:首先是低年级忽略了口算训练,其次是在各年级中轻视了式子题的教学,误认为计算式子题只要弄清计算顺序,便能算出来,这种想法造成学生计算不细心,准确率低,从而缺乏攻克复杂式子题的兴趣和信心。
计算准确,要从低年级抓起,不仅要教学生算法,更要重视口算的训练。口算是笔算、估算的基础,只有让学生在理解的基础上掌握了口算的方法,坚持练习,逐步达到熟练的程度,才会在中、高年级中熟练、准确地计算。同样,中高年级也不能忽视口算的练习。
式子题的训练,还要从读题做起,读题要求学生正确规范,这样有助于弄清运算顺序。有括号题,如(a+b)c,可读作a与b的和乘以c,不能把括号读出来,严格要求学生读准,从中悟出运算顺序,确定自己的算法。弄清计算顺序是计算的前期。不这样训练,学生容易忽略和弄错顺序,对“准确”没有把握,长期这样,学生会对数学失去信心,失去积极性,教师也会对学生的计算失去信心。
文字题是式子题的读题与列式计算的训练,在读题的基础上,让学生列出算式,正反结合训练,会对学生的计算进行强化。文字题既然是计算题的叙述,那么解决文字题就是列出综合算式,它与应用题的解答有别,不能用分步计算,但可以用分步式分析。分析后列出综合计算是解决文字题的正确做法。
加强运算定律和运算性质的教学,多用于实际计算,让学生充分理解算理,掌握法则,鼓励学生运用简便算法。除题目要求简算外,教师要有意识地要求学生能简算的奥运用简算,提高学生的简算兴趣,使简算贯穿于一切计算之中,逐步摸索计算的技巧,做到计算合理,灵活,准确,迅速,有力的提高学生的计算能力。
计算准确性的训练要常抓不懈,养成检查、验算的习惯。对于一般的学生,式子题做完了不愿意检查、验算,造成准确率低的现象。针对这种现象,要有意识的训练,培养学生验算,长此以往,“准确”就有保证了。
在式子题的计算中,采用适当的计算方法也要给与指导和练习。如高年级的分数、小数、百分数的混合运算,要根据题和自己的特长确定具体算法。让学生针对题型动脑思考,自做练习,在和他人比较,找到巧妙的算法,也是准确性的训练。
对学生经过长期多方面的计算训练,培养学生严格、认真、对计算结果负责的良好习惯以及有毅力、肯动脑、克服困难的意志,学生的计算能力就会明显提高,为下一步学习打下坚实基础
4. 小学数学有哪些简便算法,你知道吗
对于那些成绩较差的小学生来说,学习小学数学都有很大的难度,其实小学数学属于基础类的知识比较多,只要掌握一定的技巧还是比较容易掌握的.在小学,是一个需要养成良好习惯的时期,注重培养孩子的习惯和学习能力是重要的一方面,那小学数学有哪些技巧?
一、重视课内听讲,课后及时进行复习.
新知识的接受和数学能力的培养主要是在课堂上进行的,所以我们必须特别注意课堂学习的效率,寻找正确的学习方法.在课堂上,我们必须遵循教师的思想,积极制定以下步骤,思考和预测解决问题的思想与教师之间的差异.特别是,我们必须了解基本知识和基本学习技能,并及时审查它们以避免疑虑.首先,在进行各种练习之前,我们必须记住教师的知识点,正确理解各种公式的推理过程,并试着记住而不是采用"不确定的书籍阅读".勤于思考,对于一些问题试着用大脑去思考,认真分析问题,尝试自己解决问题.
二、多做习题,养成解决问题的好习惯.
如果你想学好数学,你需要提出更多问题,熟悉各种问题的解决问题的想法.首先,我们先从课本的题目为标准,反复练习基本知识,然后找一些课外活动,帮助开拓思路练习,提高自己的分析和掌握解决的规律.对于一些易于查找的问题,您可以准备一个用于收集的错题本,编写自己的想法来解决问题,在日常养成解决问题的好习惯.学会让自己高度集中精力,使大脑兴奋,快速思考,进入最佳状态并在考试中自由使用.
三、调整心态并正确对待考试.
首先,主要的重点应放在基础、基本技能、基本方法,因为大多数测试出于基本问题,较难的题目也是出自于基本.所以只有调整学习的心态,尽量让自己用一个清楚的头脑去解决问题,就没有太难的题目.考试前要多对习题进行演练,开阔思路,在保证真确的前提下提高做题的速度.对于简单的基础题目要拿出二十分的把握去做;难得题目要尽量去做对,使自己的水平能正常或者超常发挥.
由此可见小学数学的技巧就是多做练习题,掌握基本知识.另外就是心态,不能见考试就胆怯,调整心态很重要.所以大家可以遵循这些技巧,来提高自己的能力,使自己进入到数学的海洋中去.
5. 学习java编程时,什么时候学习算法好点
java里面本身是包含算法的,只不过它的算法比着大数据python 那些,还是显得有点low的。在java编程学习的过程中,你会接触到一些排序,比如冒泡排序,选择排序,希尔排序,归并排序等,这可以当作是学习算法的入门吧。下面我们从几个阶段来讨论:
1.学习阶段
刚开始学习java编程,主要还是熟悉它的基本语法,以及常用的框架,做到能够开发企业级项目,对于一些算法你可以作为了解,毕竟初级阶段,你出去面试找工作,人家也不会难为你问到一些复杂的算法。
2.工作阶段
这个阶段你已经步入职场了,在职场中,你会发现,算法几乎用不到,可能是你还没到那个价格,但是这并不意味着,你就不需要学习算法了。相反,在你工作的同时,你就要留意公司里面所用的框架,关键的技术点,尤其是用到的算法。有了大致了解后,你就需要利用你工作之余的时间,开始学习算法了,因为你不会是想当一辈子的程序员吧?不想的话,你就要下足功夫去学算法,开源的框架等。
综上所述,你在学习阶段学习一些简单的算法,以及对算法有一个大致的了解,就足够了。而且在吉林北大青鸟学习期间,老师自然会教什么时候才是你学习算法的好时机。
6. C语言里面的算法觉得很难,这样才能学好算法
学好C语言首先要学好他的语法,就比如说英语和语文,你必须要学好他的语法啊,并且要会用他的”单词”,然后就是算法了,这其中要有数学的计算和思想,但是你可以学好的,如果你学好VB那就更好了,因为VB和C语言、很都语法都是共通的.C重要的是思想和算法..
如果要成为高手的话,那就必须数学基础扎实,因为要到高级的话会用到很多的函数问题,编程也要逻辑性好,而且C就是一种模式,找到了很容易学的。
说实在的,有些东西当初我拿到书的时候是天天琢磨,月月思考,还真别说,有些当初我以为超级老难的问题就愣是这么给琢磨出来了。不过前提是我的数学和逻辑思维真的不错。
慢慢来啊,呵呵,就像当初我以为我自己也学不会,结果还是让我给征服了。其实入门比较困难一些,这都是过程,保持好的心态,如果真的想学就不要放弃,经过时间的积累我想一切都会晴朗的。
7. 算法该怎么学感觉好难
很多人都会说"学一样东西难",一开始我也觉得很大程度是因为每个人的智力水平等等不可改变的因素. 但是后来我发现,有一个东西也很能决定一个人是否会觉得一样东西难学,那就是理解方式.
一件事物通过不同的途径让一个人理解效果差异是很大的.就比如说数学里面教你一个圆,有的人看到一个圆就能很快明白什么是圆,有的人却非得看到x^2+y^2 = r^2这种式子才有感觉,甚至有的人需要"到定点距离为定长的点集"这种描述才能理解. 那这个不一定是说谁的智力水平更高,而是因为他们对不同形式事物的敏感程度不同.
回到算法上来.算法本质是一种数学.他是抽象的操作集合.(看这么说你可能会觉得不知所云,但是如果我说他只是一种解决问题的办法可能就好理解). 所以很多书,论文,或者很多老师教的都是一种数学描述的算法,这样子的算法就我个人而言相当难理解,看了就想到代数高数什么的.. 但是如果找一个图文并茂的解释,或者找个人一步一步把一个算法给你我比划一下,我立刻就能理解. 说白了,就是你一定要找很多很多不同的角度来尝试接受一种东西,你一定可以找到一种你相当敏感的角度,用这个角度学习你就会游刃有余. 智力因素并没有太大影响的.
具体点说,你可以试试这几种不同的角度.
直接看数学形式的算法.我个人最无法接受的形式,但是有人很喜欢..例子就是算法导论上面那种描述.
听一般语言描述,最理想是找一个明白的人,给你用通俗语言讲讲原理.这个不错,很多我是这么理解的
图形理解,叫理解的人给你画插图,分布图,结构图等等,来分解一个算法,找到他的思路.说到图,有一个人的博客这方面做得很好:matrix67.
程序理解.找到一种算法的实现程序,对着程序理解,可以尝试分布运行,观察一下变量的变化,这样来理解算法.
实在太难的算法,可以边写边改来理解.当时我学习插头dp的时候就是这样,不论怎么总是一知半解,最后硬着头皮写了一遍,改了很久,但是改过了的时候,也就真的明白了是怎么回事了.
也许还有别的什么办法,因为人对事物的接受角度实在是太多了.多想想你平时学习什么比较容易,找出你最敏感的理解方式就行了.
有感而发说的一些东西,不一定都是正确的,只供参考,欢迎指正.
8. 算法到底应该怎么学
刷与不刷ACM ICPC的人在算法能力上会有巨大差距。
如果真想深入掌握各种算法,还是先刷题吧。刷到一定境界再去看更高级的算法书。
不得不承认现实生活中,一般码农工作对算法能力要求太低了,这一度让人们(包括我)认为算法似乎不那么重要。其实学习算法所锻炼出来的对各种问题敏感的反应和融会贯通能力还是非常重要的。
编程嘛,就是操作数据输出结果
算法和数据结构是配套的,你应该掌握的主要内容应该是:
这个问题用什么算法和数据结构能更快解决
这就要求你对常见的结构和算法了熟于心,你不一定要敲代码,用纸手写流程是更快的方式。
对你不懂的数据结构,你要去搜它主要拿来干嘛的,使用场景是什么。
细节出错是你对编程语言不熟悉才会导致的问题,跟你懂不懂算法没关系,这个你应该多写写练手小程序,背代码是很愚蠢的行为。
其实我觉得你这么迷茫不如实现一下stl的函数好了
我的经验就是去模拟(当然模拟只限于基础的算法)。甚至是手动模拟,比如我之前学深搜,学递归,代码很简单,但是因为涉及到栈,而你的大脑短时间内存储的栈深度只有几层(临时变量越多你大脑能模拟的栈深度就越少),实际上你没办法用大脑去想。比如学习图的深搜,一开始我是不理解的,对递归没办法理解。后来我就在纸上模拟出来,建立好邻接表以后,按照代码步骤一步步纸笔来模拟,慢慢就知道了代码的工作过程。你学习快排也是,当然你背代码也能写出来,但是可能不理解,很快就忘了。《算法导论》书上就有比较细致的执行过程,你手动模拟下partition和quicksort的过程,一开始就用很简单的用例,把整个过程都手动执行一遍,慢慢就了解了。很多算法都有一个循环不变式,你代码如果逻辑正确并且能够维持循环不变式,一般写出来就是正确的。
建议找本《算法》或者《算法导论》这些教材,每学习一个算法就先大致浏览下, 然后细致分析每一步代码的执行过程(纸笔模拟或者代码单步调试),当确认你真正明白之后,尝试不看代码就靠对算法过程的了解和正确的逻辑去自己实现。
当然,我不认为你写出很多算法就是高手了,现在大部分高级语言不需要你重复造轮子,你造出来的质量也远逊于库中那些高手的代码,可以去学习他们代码的实现,比如看看stl源码。真正工程用到的代码与一般算法实现还是有很多改进的。
最重要的不是你会写这些算法了,而是学会了很多思想。比如二分的思想,递归的思想,分治的思想,动态规划,贪心等,以及现实中很多数据结构的抽象等。难的不是学会了算法,而是如何运用这些算法思想去解决问题。
9. 初学者如何学算法
先看看两本书,一本数据结构,一本离散数学。。。看完以后你就会。。。。