算法想得慢
‘壹’ 一天弄懂一个算法很慢吗
慢。一个算法也就三四个小时吧,学习算法不仅只是学习,还要查阅资料,所以我想至少需要3个小时。学习算法需要多长时间?不得不说,为了高考取得好成绩,在中学时代,学校的老师大都灌输了高考这条狭路的思想。其实除了高考我们还有很多选择,一次失利不代表人生就没戏了。
‘贰’ 我目前在自学算法,但是我感觉很吃力啊。有时候一个稍微复杂的算法,想很久都不能明白。希望前辈们给点建
复杂算法难理解是肯定的
比如波利亚计数定理,就算我写出程序了也没有完全理解
其实弗洛伊德最短路算法也挺难理解的
可以自己先试着解答题目,然后再去看算法
或者debug,单步调试看看算法是怎么工作的
‘叁’ 编程想不出算法怎么办
首先假设你是计算机专业的大学生,或准备报考计算机专业的高中生。
需要先搞清楚自己是以下哪一类症状:
1. 对于简单的数学问题(如楼主提到的找质数、算阶乘)想不出思路(想出非最优思路也算合格)。
2. 想得出数学思路,但是不会转化为代码(代码冗长也算合格)。
如果是第1类,那么考虑转行比较实在吧;
如果是第2类,而且题主学习编程语言已经超过1个月,那么也请考虑转行吧;
如果是第2类,但是题主初学编程语言时间<1个月,那么请继续坚持,多读现成代码,然后自己编写。如此1个月仍不乐观,参考上一条。
对于用程序来解决数学问题,一个比较有效的方式是从对数学问题的定义入手。
再强调一遍,没有思路的时候,试着从定义入手。
比如寻找质数的简单(并不高效)算法,有如下思维过程:
1. 质数的定义:只能被1和自身整除的大于1的正整数。
2. 从定义提炼判断条件:
2.a. 不能被1或自身之外的任何数整除;
2.b. 大于1的正整数。
3. 用自然语言描述算法过程:
3.a. 2是质数;
3.b. 对每一个大于2的正整数(N)进行如下验证:用2到N-1除N(实际上到N的正平方根即可),若出现整除,则此数不是质数,否则是质数。
4. 将上述步骤翻译为伪代码或代码。
5. 优化算法(如剔除不必要的除法操作)。
熟练之后对于简单问题可以在脑中进行迅速的问题定义和条件提炼,并在脑中想出模糊的算法过程,然后直接写代码。
‘肆’ 算法该怎么学感觉好难
很多人都会说"学一样东西难",一开始我也觉得很大程度是因为每个人的智力水平等等不可改变的因素. 但是后来我发现,有一个东西也很能决定一个人是否会觉得一样东西难学,那就是理解方式.
一件事物通过不同的途径让一个人理解效果差异是很大的.就比如说数学里面教你一个圆,有的人看到一个圆就能很快明白什么是圆,有的人却非得看到x^2+y^2 = r^2这种式子才有感觉,甚至有的人需要"到定点距离为定长的点集"这种描述才能理解. 那这个不一定是说谁的智力水平更高,而是因为他们对不同形式事物的敏感程度不同.
回到算法上来.算法本质是一种数学.他是抽象的操作集合.(看这么说你可能会觉得不知所云,但是如果我说他只是一种解决问题的办法可能就好理解). 所以很多书,论文,或者很多老师教的都是一种数学描述的算法,这样子的算法就我个人而言相当难理解,看了就想到代数高数什么的.. 但是如果找一个图文并茂的解释,或者找个人一步一步把一个算法给你我比划一下,我立刻就能理解. 说白了,就是你一定要找很多很多不同的角度来尝试接受一种东西,你一定可以找到一种你相当敏感的角度,用这个角度学习你就会游刃有余. 智力因素并没有太大影响的.
具体点说,你可以试试这几种不同的角度.
直接看数学形式的算法.我个人最无法接受的形式,但是有人很喜欢..例子就是算法导论上面那种描述.
听一般语言描述,最理想是找一个明白的人,给你用通俗语言讲讲原理.这个不错,很多我是这么理解的
图形理解,叫理解的人给你画插图,分布图,结构图等等,来分解一个算法,找到他的思路.说到图,有一个人的博客这方面做得很好:matrix67.
程序理解.找到一种算法的实现程序,对着程序理解,可以尝试分布运行,观察一下变量的变化,这样来理解算法.
实在太难的算法,可以边写边改来理解.当时我学习插头dp的时候就是这样,不论怎么总是一知半解,最后硬着头皮写了一遍,改了很久,但是改过了的时候,也就真的明白了是怎么回事了.
也许还有别的什么办法,因为人对事物的接受角度实在是太多了.多想想你平时学习什么比较容易,找出你最敏感的理解方式就行了.
有感而发说的一些东西,不一定都是正确的,只供参考,欢迎指正.
‘伍’ 如何衡量一个算法的快慢
如何衡量一个算法的快慢
用具体的操作数来衡量
当我们说衡量一个算法的快慢时,我们是希望找到一种方便的统一标准,使得对于同一个算法,我们的衡量标准不会受到一些不重要的因素影响而保持一致;对于不同的算法,我们能够比较它们的优劣并在实际的应用中进行选择。
一个自然的想法是测量这个算法运行所需要的时间,然后选择跑得快的算法。但是不同的机器运行的速度是不一样的,一个同样的算法在不同机器上测出来的时间可能非常不同。而且,每次想要知道一个算法的快慢如果都要在机器上通过计时来测量的话,是一件非常痛苦的事情,因为有些算法可能一次要跑上一天,一个月,甚至一个世纪。
一个有效的替代方法是通过计算一个算法用了多少次操作(或者说运算量)来衡量它运行的快慢,比如用了多少次加减法,乘除法,函数调用和赋值等操作。操作数越多,运行的所需要的时间就越多。这样的一种想法保证了我们对算法的衡量不会因为测试环境的变化而变化,也不用通过实际运行来测量,只需通过计算就能得到操作数的数量。
用函数来衡量
仅仅计算操作数的一个问题是:一个固定的算法,针对不同的输入规模,它所需要的操作数量是不一样的。比如一个排序的算法,排100个数字和排10000个数字相比,排10000个数字所需要的运算量会大很多。也就是,操作数是随输入规模变化的一个函数。
所以,我们假如输入规模是n,那么操作数就是f(n)。有时候,输入规模不只有一个,比如关于一个矩阵的算法需要的操作数,可能和矩阵的长和宽都有关系,这时候,ff就变成了一个关于长和宽的二元函数,比如f(w,h)。这种扩展是合理的,但是为了讨论方便,我们先只考虑规模只是一个变量n的情况。
‘陆’ 我大一学计算机的 感觉c语言那些循环 什么的算法很难想出来,我该怎么办,求帮助,我觉得自己不够聪明
我是电子工程师,现在主演搞嵌入式方面,这个我深有体会,在学校都是书本教育,不太理解,容易糊涂,到了实力项目,激汪袜慢慢陵搜摸索就会恍然大明激户的,现在建议你做些设计项目,电子比赛之类,跟着书本理论慢慢实践,你很快上手