对于一名优秀的程序员来说,面对一个项目的需求的时候,一定会在脑海里浮现出最适合解决这个问题的方法是什么,选对了算法,就会起到事半功倍的效果,反之,则可能会使程序运行效率低下,还容易出bug。因此,熟悉掌握常用的算法,是对于一个优秀程序员最基本的要求。
那么,常用的算法都有哪些呢?一般来讲,在我们日常工作中涉及到的算法,通常分为以下几个类型:分治、贪心、迭代、枚举、回溯、动态规划。下面我们来一一介绍这几种算法。
一、分治算法
分治算法,顾名思义,是将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。
分治算法一般分为三个部分:分解问题、解决问题、合并解。
分治算法适用于那些问题的规模缩小到一定程度就可以解决、并且各子问题之间相互独立,求出来的解可以合并为该问题的解的情况。
典型例子比如求解一个无序数组中的最大值,即可以采用分治算法,示例如下:
def pidAndConquer(arr,leftIndex,rightIndex):
if(rightIndex==leftIndex+1 || rightIndex==leftIndex){
return Math.max(arr[leftIndex],arr[rightIndex]);
}
int mid=(leftIndex+rightIndex)/2;
int leftMax=pidAndConquer(arr,leftIndex,mid);
int rightMax=pidAndConquer(arr,mid,rightIndex);
return Math.max(leftMax,rightMax);
二、贪心算法
贪心算法是指在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。
贪心算法的基本思路是把问题分成若干个子问题,然后对每个子问题求解,得到子问题的局部最优解,最后再把子问题的最优解合并成原问题的一个解。这里要注意一点就是贪心算法得到的不一定是全局最优解。这一缺陷导致了贪心算法的适用范围较少,更大的用途在于平衡算法效率和最终结果应用,类似于:反正就走这么多步,肯定给你一个值,至于是不是最优的,那我就管不了了。就好像去菜市场买几样菜,可以经过反复比价之后再买,或者是看到有卖的不管三七二十一先买了,总之最终结果是菜能买回来,但搞不好多花了几块钱。
典型例子比如部分背包问题:有n个物体,第i个物体的重量为Wi,价值为Vi,在总重量不超过C的情况下让总价值尽量高。每一个物体可以只取走一部分,价值和重量按比例计算。
贪心策略就是,每次都先拿性价比高的,判断不超过C。
三、迭代算法
迭代法也称辗转法,是一种不断用变量的旧值递推新值的过程。迭代算法是用计算机解决问题的一种基本方法,它利用计算机运算速度快、适合做重复性操作的特点,让计算机对一组指令(或一定步骤)进行重复执行,在每次执行这组指令(或这些步骤)时,都从变量的原值推出它的一个新值。最终得到问题的结果。
迭代算法适用于那些每步输入参数变量一定,前值可以作为下一步输入参数的问题。
典型例子比如说,用迭代算法计算斐波那契数列。
四、枚举算法
枚举算法是我们在日常中使用到的最多的一个算法,它的核心思想就是:枚举所有的可能。枚举法的本质就是从所有候选答案中去搜索正确地解。
枚举算法适用于候选答案数量一定的情况。
典型例子包括鸡钱问题,有公鸡5,母鸡3,三小鸡1,求m钱n鸡的所有可能解。可以采用一个三重循环将所有情况枚举出来。代码如下:
五、回溯算法
回溯算法是一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。
许多复杂的,规模较大的问题都可以使用回溯法,有“通用解题方法”的美称。
典型例子是8皇后算法。在8 8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问一共有多少种摆法。
回溯法是求解皇后问题最经典的方法。算法的思想在于如果一个皇后选定了位置,那么下一个皇后的位置便被限制住了,下一个皇后需要一直找直到找到安全位置,如果没有找到,那么便要回溯到上一个皇后,那么上一个皇后的位置就要改变,这样一直递归直到所有的情况都被举出。
六、动态规划算法
动态规划过程是:每次决策依赖于当前状态,又随即引起状态的转移。一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划。
动态规划算法适用于当某阶段状态给定以后,在这阶段以后的过程的发展不受这段以前各段状态的影响,即无后效性的问题。
典型例子比如说背包问题,给定背包容量及物品重量和价值,要求背包装的物品价值最大。
❷ 程序员一定要算法能力强吗
算法能力强对于低级点的程序员不是必须但是成为高级的程序员就是必须的了,算法学的好的话,不论对你思考问题的方式还是对你编程的思维都会有很大的好处。算法的学习不只是理论的支持,更需要你不断的在理论的基础上去code,去思考。
❸ 大部分已经干了两三年的程序员水平是怎样的
见过四年的比十年的强,不过又过了一年,被反超了,关键是行动,学习!
❹ 大家都知道高级程序员很吃香,那么高级程序员和黑客到底谁更厉害
非从业人员对于程序员和黑客的外在形象就存在着不一样的认知,因为电视电影和网络上的段子,普通的程序员一般都是有才能却一点不风趣的男性,常年一件格子衬衣,几根稀疏的头发,虽然赚的钱不少,却不会花钱装扮自己;而黑客的形象就完全是另一种,他们很神秘,可能我们身边随便一个人在暗地里都可以是黑客,黑客还喜欢穿黑衣服,带黑色的帽子,不喜欢以真面目示人。
相对的,普通程序员也不会关注黑客关注的很多点,比如CAPTCHA这种可能就直接引入个第三方的来防御了,并不会自己去实现一遍。还有加密算法这种,也几乎只有黑客才会去研究。普通程序员可能研究的就是压缩算法。黑客的攻击手段多种多样,有的甚至不会写代码,比如《我是谁–没有绝对安全的系统》里就有一位,根本不写代码,通过翻垃圾桶,开锁偷看资料这类操作搜集很多有用的信息,从而发起攻击。一般称这种为手段‘社工攻击’。
❺ 你见过最厉害的程序员是怎么样的
以前曾经做过十余年的编程,见识过不少程序员,其中有两位是比较厉害的。
第一位,J同学,非科班出身,粮食专业毕业的,之后在一个食品厂工作,因为比较清闲,于是他突发奇想,想考某个211的计算机研究生,就去买了书来看,但是要实践啊,他又没有计算机,就有空总去公司的电脑室蹭机器用,电脑室的人,就让他帮忙开发一个工资管理系统,不知道是不是想为难他,结果他研究生是没考上了,但是经过一个月的摸索之后,居然把工资系统给做出来了。让电脑室那些科班毕业的人脸上挂不住啊!
之后他就斗胆去了一个国内知名的企业应聘程序员,居然还给应聘上了,慢慢做到了华南区的技术总监,再后来他几个同事出来创业,高新挖走他。
他这个人就是传说中的怪侠,非常低调,朴素,不按时上班,不按时下班,工作效率非常高,爱抽烟,请教他什么问题,他一时想不出来的话,就去外面抽根烟,烟抽完了,回来就会有答案,反正非常神奇。
第二位,B同学,科班出身,211大学计算机研究生,当时是他的导师跟我们单位有来往,推荐过来的,我面试的他,惜话如金,听说他C语言非常厉害,但是当时我们做项目需要PB,他说他不会,我就说,那给你一个星期的时候,你回去学习一下,再来面试。一个星期后,再过来,给他一个小模块,很快就做出来,非常棒,之后,项目的技术难题,大部分都是他解决的。平时,他也不怎么跟我们来往,但是有事就做,也不打 游戏 ,按时上班,按时下班,非常讨厌加班。
遇到技术问题,下班后打电话给他,他不接的。有一次,我们第二天系统要上线,大家都在忙着测试,加班,他到点就走了,领导追到电梯门口,问他,XX哥,你走了,他说了一个字,是,就进电梯了。后来也是被高薪挖走,听说到现在40岁也还没结婚。
我们公司有一位非常厉害的程序员,基本上一个人当做一个排兵力使用。也就是说一个人写代码的效率基本上抵得上10+人的能力,一年随随便便写个几十万高质量的代码。这种人对编程语言的理解已经到了登峰造极的地步,且能够灵活自如地使用。
在自己编码能力强的同时,对架构的理解能力也是超强,一个大的系统能够很快地进行模块拆分,快速的定义不同模块间的交互接口,可以快速的安排任务下去。
另外代码的质量基本上没地说,导致跟着他的测试人员几乎发现不了Bug,这哥们在写代码的同时基本上顺手就把单元测试写好了,代码质量高的简直出奇。
当然了,至于学习什么新的开源框架或者新的技术架构,基本上就是2-3天的功夫,就可以全面掌握。
目前为止,公司一直当做宝一样供着。
我见过最厉害的程序员,是在2001年入职的一间香港电路板公司的电脑部经理,他也是最值得我尊重的程序员,那他最厉害的地方在哪里呢?
编程语言只懂Foxpro DOS版本,但所有的ERP流程,英文、管理方法说得滴水不漏,有一次和财务的同事聊天,才知道他的月薪达8万多。
很多程序员最怕大老板提问题,但在他的眼里,大老板提问题就是一个商机,多多少少都要老板加工资加设备。 高情商的表现就是无论下属或老板通通管理得服服帖帖,包括我自己,甚至老板还没有说话就己经知道老板的心思了。
老板分配的编程任务应期三天完成,绝对不过4天。软件开发效率的提高,自然要依赖下属心甘情愿的加班付出才行,做到这一点,真的是难能可贵。
最厉害也是我最佩的一点就是,40多岁了头发还没有一点白的迹象,每天高效率的工作,下班后就抛开工作的烦恼,尽情桑拿按摩享受。
我认为最厉害的程序员不是编程技术,而是如何利用编程技术,不知道你认不认同?
应该是读研时的学长,精通java和Python,毕业后进去微软研究院工作。
当时和他在一个项目组,他独立完成了教学平台语言分析模块,NLP 模块。我们团队任何问题都能很快给出解决方法,前端后端都擅长。
当时我刚接触linux,他就已经把Linux作为工作学习唯一的选择。经常用terminal 操作,敲起代码太帅了
诚邀,本人在杭州华为研究所工作,之前在一家创业公司工作过,公司里一个工作10年的大神,撑着整个创业公司,老板总能拿到某些项目源代码,不同语言的,c c++ .net java总之很多,给他,一礼拜就可以全懂了,所有语言基本都是1礼拜搞定(玩代码的都知道精通一门语言后学其他的特别容易,不外乎面向对象的,面向过程的,然后就是各种API )上手做项目,之前很多不懂的问题问他都可以从本质上分析得很明白,主要是基本上看几眼就可以知道哪里错了。或者大概方向,我后来去华为,都是他建议的,现在还在那公司的他听说是技术总监了,应该不怎么敲代码了。
核心的代码总是有那一两个程序员来实现的。比方说现在微信的一开始的核心代码。
比方说Linux的核心代码, 都是由林纳斯·托瓦兹编写的, 并且为了能够让开源社区的人一起进行开发, 又编写了Git版本控制。当你不满意某个软件或者系统的时候, 能够自己实现并制作出更好的也许就是厉害的程序员吧。一直到现在很多的系统分支都是来源于Linux的内核。
最后如何成为最厉害的程序员, 还是要学习基础核心的知识, 操作系统, 数据结构, 算法, 编译原理, 计算机网络, 在这个基础上学习编程都是为了更好地实现自己的心中所想。为什么这样写, 这样写会产生什么效果。 为什么Golang最近这么热, 为什么鸿蒙会被看好, 它又和其他的有什么区别, 就可以自我判断, 而不是见风就是雨。
最后希望自己也成为那个最厉害的程序员。
很久以前,我用win98的时候有次我系统崩溃了,因为我是电脑白痴,我朋友给我介绍了一个高手来帮我修电脑。
他看了一下电脑,问我有没有98的盘,我说没有。
他想了一下,叫我把固定电话拿给他,我想修电脑要电话干什么,但人家是高手,我也不好说什么,就把电话拔下来给他了。
他把电话线空着的一头接在电脑的一个插孔内,然后进入dos,就开始在电话上不停的按着键,他按键的速度异常快,但是只按0,1两个键,我搞不懂这有什么用,但也不敢问,看了半个多小时,他还是不停的按这两个键,我徐徐的有些困,我问他这东西要搞多久,他说要几个小时,我给他倒了杯茶,就一个人去隔壁睡觉了。
醒来的时候,一看已经过了4个多小时,我起身到隔壁,看见他正在98里面调试,过了一会儿,他说,你试试,我坐上椅子用了一下,真的好了,我当时也不懂电脑,谢过人家就走了。 后来我慢慢对电脑有了了解,终于了解,原来当时那位高手是用机器语言编了一个98系统,我后来问我朋友那位高手的下落,我朋友说前几年去了美国之后,杳无音讯....
五年前有幸在一家软件公司做产品经理。小的软件公司。坐标西安。招人还挺不好招的。虽然给的薪水还不错。但是真心不好招人。这种小软件公司没有名气。真正牛逼的人都不来。
百试几百人,包括做产品和前端的也算在里面。光程序员这块。有百分之六十的投简历的都是从某培训机构出来的。所以的项目经历。和待过的公司都是一模一样,有明显的人为的痕迹。
但是后来实在没有人手。招了一两个,差。差。差。真是差到极点
后来又经人推荐,招了一个,说是做安卓开发的。结果连个软件的心跳包都调不好。软件的升级这块都搞不定。最后还是我这个外行,逼着他。一点一点卡,才把软件升级这块稍微搞上路了。
说出来真是让大家笑话,华为的外包中软国际。有个孩子实在忍受不了里面的虐待,在里面工作了一年半。然后跳到我们公司。这个孩子,才是稍微让人可以用一下。就是起码。你给他的工作。他能完成。其他的人都是在摸鱼。因为这个公司的老板以前也不是做手机软件这块。没有资源,不认识人。
他是做电脑PC软件,到后面做BS系统多一点。其实这种没有技术含量,找的别人的框架。去修改。
普通人见不到最牛逼的程序员,最牛逼的程序员,一定是在最牛逼的软件或者互联网公司的深宫后院里面。还没出世的。就像当初的张小龙,史玉柱,裘伯君一样。
你现在能看的牛逼的,感觉牛逼的。都是因为你不懂这个。你才觉得牛逼。包括前几年比较活跃的黑客们,制造一些病毒。这都不是牛逼。包括熊猫烧香的李俊,普通人觉得他可牛逼了。但是真正的他出来后,去金山 360这种公司,提鞋别人都不要。
因为搞破坏不是牛逼。也不是自己水平有多牛逼。
我来讲一个我见过最厉害的程序员。
这个程序员是我第一份工作碰到的大牛,我的第一份工作在中兴通讯成都研究所,当时是做操作系统研发的。
我们当时经常会做一些培训和技术分享,那时候我才入职3个月,我发现公司里有个人每次技术分享时候,就很多人去听,并且会议室爆满,连站的地方都没有,然后我有次也去听了一下, 第一每次目睹大牛的风采,因此操作系统是最底层的研发工作,会涉及到内核这块知识,而linux内核知识特别抽象,看书根本很难看懂,但是这个大牛能把很难的东西讲的很容易理解,并且在会上面对大家的提问总是能对答如流,实在是厉害。
而后我通过公司里的老员工才了解到,这位大牛是自学成才的,他的文化程度才初中,破格录取到中兴通讯,当时是操作系统部门的技术专家,他都能自己编写操作系统,对各硬件都非常了解,也出了很多书。可见兴趣是最好的老师,让他能够在程序员中发光。
必须是ACM大神,楼天成,楼教主。不了解他的可以网络之。是个天才一般的存在。
几年前清华大学找同学玩,他那时是清华软件学院的学生,突然说要带我去见他的偶像,还说是最后的机会了,我们跑去计算机学院,当时博士正在答辩,通过在场的同学找到了他,他很腼腆的千呼万唤始出来。他们两在那里交流了半个多小时,最后互留了EMail,我跟他聊了些我专业的内容,他还蛮好说话。 后面还通过这位同学认识另一位ACM届大神,上海交大的戴文渊。我对编程略有了解,主要还是崇拜天才。
❻ [探讨]优秀程序员和一般程序员差别在哪
还记得研发频道此前发表过的一篇《白班程序员 VS. 夜猫子程序员》吗?在这个世界上有两种程序员,我们称之为:Day Programmers(白班程序员)和Night Programmers(夜猫子程序员)。本文我们将探讨优秀程序员和一般程序员有哪些差别,看看您是属于那一种?来自知乎网上的大牛们各抒己见,一起来看下他们是如何区分的。创业者郭凛:如果纯以编码能力来看,可分为五类1. 拷贝型拷贝型选手就是传说中的“代码拷贝员”了,他们对实现功能几乎没有思路,所作的事情就是从网上或是之前其他团队成员写的代码中拷贝出片段,然后放到项目中,如果运行项目出现了期望结果,则表示任务完成。这类人只会改代码,却不会写代码。他们大多对编程毫无兴趣,只是希望以此糊口而已。2. 新手型当产品有功能需求时,由于经验有限,程序员并不完全知道要如何实现这个功能,需要通过学习、寻找资料等方式来解决问题。这种情况下的编码过程,程序员的主要目标是“完成功能”,那么很难有多余的心思去考虑边界条件、性能、可读性、可扩展性、编码规范等问题,因此代码bug可能较多,稳定性不高,常常会发生开发花费1个月,改bug却要改上好几个月的事情。3. 学习型这类程序员对所在领域的语言已经比较了解,对于一般功能可以有较为清晰的实现思路,给出需求时可以通过自己的思路来实现,并且会一定程度上考虑边界条件和性能问题。但仅此而已,他们对可读性和可扩展性考虑很少,也没有项目级别的考虑,主要是希望通过实现代码来练手或是学习。这类程序员最大的表现在于喜欢“创造代码”,即使有现成的实现,他们也希望自己来实现一套,以达到“学习”的目的。他们不喜欢复用别人的代码,看见项目中别人实现了相类似的功能,他们会以“需求不同”的借口来自己重新实现一套。这类人一般来说对技术有着较为浓厚的兴趣,希望能够通过项目来进行学习。从项目的角度来说,这种做法最大的麻烦在于开发周期可能较长(相比直接使用现成的实现),并且会使得项目代码膨胀,影响未来的维护。但这类程序员由于有兴趣,如果好好培养或许会成为明天的牛人。4. 实现型这类程序员一般有较为丰富的经验,由于写得太多,因此不再追求“创造代码”来进行学习,同时对所在领域可能涉及的很多第三方框架或是工具都比较熟悉,当接受到产品需求时,对功能实现方案已经了然于胸,因此他们可以快速的实现需求,并且对边界、性能都有一定程度的考虑。因为能够快速实现需求功能,经常会被团队评价为“牛人”。但他们一般仅仅停留在“完成功能”级别上,对代码的可读性、可扩展性、编码规范等考虑较少,对项目总体把握也较少(例如控制项目膨胀、方便部署等架构级别的东西)。这类程序员最大的表现在于喜欢“开发项目”,却不喜欢“维护项目”。他们产出的代码最大的问题就是维护较为困难,可能过上几个月回头看自己的代码都会晕头转向。因此即使是自己写的代码,仍然不愿意维护,一般会苦了后来人。因为接口设计的缺乏,当需求变更时,发现代码要改的东西太多,然后抱怨需求变化,却很少认为是自己的代码问题。这样的项目如果经过长时间的变更维护,最终会变得难以维护(一般表现在需求变更响应时间越来越长)甚至无法维护,最终要么是半死不活,要么是被推倒重来。5. 架构型这类程序员比实现型更进一步,他们经验丰富,对相关框架和工具等都很熟悉,“完成功能”、“稳定性”、“性能”这些已经不再是他们的追求,更优美的代码、更合理的架构才是目标。这类程序员代码设计大多建立在对需求的详细了解和对需求变更的预测上——可扩展性较好;代码细节也尽量多的考虑边界情况、性能——稳定高效;代码命名和注释都恰到好处——可读性较高;同时在开发过程中他们会不断重构,对代码做减法——保证项目可持续发展等等,但由于考虑问题较多,单从“实现功能”阶段来看,完成速度不一定会比“实现型”要快。只是到了项目中后期优势才会慢慢体现出来。知乎删代码工程师 安江泽:创造型、管家型、学院派、钟表型、折腾型1. 创造型/创新型以创造/创新为乐的程序员。以新的方法解决现有问题,发明方法解决尚未解决的问题。问题本身并不限于技术领域。硅谷很多技术创始人具备这类的品质。虽然他们创业后都不再全职写代码,但他们这种品质贡献了他们事业的第一步。2. 管家型以管系统演化为乐的程序员。有洁癖,有强迫症,容不得系统有一点的瑕疵。如果你招聘了一个程序员/架构师,2-3年后你的互联网产品再也没有在可见/可扩展性上遇到瓶颈,他多半是这种程序员。3. 学院派型通常在CS某一领域拥有博士学位,或者深受他们的影响的人。对该该领域兴趣浓厚,通常参与企业核心竞争力相关的研发工作。当然,也有一部分也具备第一种特质,中途去改变世界去了。4. 经验型在行内具有多年丰富的经验,可承担责任,考虑全面。团队拥有了这种人,通常会少走很多弯路。但面对新的挑战还是要和其他人站在同一起跑线上的。5. 钟表匠型喜欢并擅长把一个系统从里到外研究通透的人。分享出来都是从里到外让人垂涎欲滴的干货。很多后端工程师都是这种类型。6. 折腾型擅长“折腾”,方案没有最好的,只有最难的。兴趣广泛动手能力强,通过折腾留下很多技术积累。想用哪一块的新技术?先问问他把,8成他很久前就已经玩过了。7. 肉盾型哥甲高血条长,加班如同切菜一般,逼急了不睡觉也行。只伸手要过两件东西:原型和咖啡。适合打闪电战。当然,可能事后要打打后勤重构下代码。iApp4Me创始人、iOS开发者郝培强:七大标准 逻辑思维很重要优秀程序员的标准:要懂逻辑,这点其实挺难达到,很多很不错的程序员其实逻辑能力不行,所以我觉得限制了他们更深一层次的发展,或者说限制了他们解决特别复杂问题的能力。要有分析能力。这也是解决复杂问题不可或缺的能力。要会自学,技术发展速度很快,如果没有自学能力会被淘汰的。所以在中国英语要好,不然看不懂最新的技术走向。要有良好的时间管理习惯和意识。要有耐心,肯于付出。要有良好的工作习惯。会看且勤于看文档。产品管理、IT项目管理 何明璐:优秀程序员具有较明显的自恋和偏执特征对编程有浓厚的兴趣,由兴趣能驱动自己的探索和钻研精神,优秀程序员一般喜欢用业余时间探索和自己琢磨点东西,研究点开源框架和源代码,关注新技术,喜欢研究和探索算法,逻辑方面的内容。优秀程序员一般比较懒于做重复的事情,对于重复事情有独有的程序员思维,即通过程序或其它自动化方式解决重复问题,而留更多时间去思考。优秀程序员更多的会从简单功能实现,花哨的界面转移到对安全,性能,可扩展等底层架构的关注。优秀程序员一般有较明显的自恋和偏执特征,有较为希望独自工作的特征,比较难于被非技术背景管理者驾驭,高度强调自我能力价值的被认可,而且很多优秀程序员并不是好教练。优秀程序员一般有较为扎实的算法,数据结构等理论知识的基础。这些让他们在迅速进入新领域的时候快人一筹。总结:不管是优秀程序员还是一般程序员,小编认为只要你喜欢思考,爱学习,对编码有兴趣,那么你就是最好的。当然掌握技术才是硬道理,套用别人的一句话“不想当CEO的程序员,不是好的产品经理”。程序员们,加油吧!
❼ 大多数程序员算法很垃圾吗
大多数程序员算法垃圾。根据查询相关信息显示:大多数程序员的算法是根据课本上的老旧的算法,效率低,冲突率大。
❽ 普通的程序员和大神级的程序员有什么区别
❾ 编程技术人员是不是都是很牛逼
不见得都是牛逼的。
但牛逼不牛逼 有多个维度衡量
例如 BUG率,代码风格,解决问题的能力。
❿ ACM:参加过ACM的大牛是不是练习时都要把每个算法敲几十几百次呢
ACM比赛可以带纸质资料,准备一份模板是很有必要的,所以算法模版很重要,记住模版一定要权威,不要网上杂七杂八的拿来当模版,一份好的模板一定会对你的编程习惯和算法实现打下良好的基础。但是,ACM比赛的等级越高,模版的作用就越小,毕竟比赛不是套模板。
没有人会把每个算法敲几百遍,大牛更加不会,敲十遍还记不住的话,一百遍也没用的,重要的是对算法本身的理解。如果你真正理解了算法但写不出来,那是你编程水平问题,这样应该多看看大牛的代码,多看看模板。
大牛不是算法模板敲的多,而是对算法理解的深刻并加上做的题目多,算法就像数学公式,你记住公式难道就能考高分了吗。重要的是运用啊,一个数学高手对于新学的公式他可以随时推导出来,因为对公式真正理解啊,推的多了自然记住了,不是吗。对于新手,先不要学算法,先去poj做水题,就是简单的题目没什么算法,水题不要做太多,100题就差不多了。接下来就该系统的学习一下算法了,《算法导论》和《算法艺术与信息学竞赛》是我觉得必看的两本书。另外,历届NOI国家队选手的论文也是很有价值的,也属于必看。接下来继续去poj做题,多思考,做不出来就网络,google,poj做题的人非常多。做题可以查漏补缺,之前没碰到过的 算法都可能在题目中体现,碰到没学过的算法就网络学习,然后选一个好的放到你的算法模板库,poj做题1000以上想不成大牛都难!
我只想说大牛基本上都是这么过来的,当然不排除个别天才,不过我没碰到过也没听过谁不做大量的题就能成为牛人的,毕竟天道酬勤。