算法工程师和程序员区别在于:
算法工程师其实比较代表一些料研能力较强的工程师,一般是在一个产品的初期,去解决技术上的难题,提供一些技术方案,也包括方案的初步算法实现,主要负责数据挖掘,机器学习领域相关的内容。
㈡ 怎么看待程序员普遍缺乏数据结构和算法的知识
在很多程序员看来,数据结构,算法这一类的东西感觉没用,在实践中都不常用,所以都会很忽视这类内容,但是在很多公司看来,尤其是大公司看来数据结构和算法这种东西确实最有用,而且经常在笔试和面试中出现。
2、数据结构和算法在面试的时候最容易量化和体现能力什么意思呢?在面试或者笔试的时候,面试数据结构和算法,可以面出你的思维能力,思考能力,这个能力对于编程来说很重要。比如:如果面试你使用过什么框架吗?你说:会,使用过,然后你谈了谈使用这些框架的一些知识和遇到的坑,以及怎么解决的?通过这样的问题,不能看出的思维能力和编程能力,只能看出你确实会用这个东西。而面试算法和数据结构不一样了,以为面试这种东西可以让你写出来,或者写伪代码,而且这些能力如果你有,你的成长空间也高。
面试你编程的实践能力,不可能让你上机去敲一个模块的实现吧?而让你写个算法和数据结构却很方便,也可以量化。所以,很多人平时不用算法和数据结构,在跳槽的时候,也会提前去复习算法和数据结构的知识,因为这是面试中很常见的问题。但是我还是建议大家能够一直有这种能力。不要因为不常用而忽视这些基本的东西,这些东西才是精华。
㈢ 大多数程序员算法很垃圾吗
大多数程序员算法垃圾。根据查询相关信息显示:大多数程序员的算法是根据课本上的老旧的算法,效率低,冲突率大。
㈣ 程序员,感觉技术停滞了怎么办
你是一名程序员,感觉技术停滞了。那你就去深造呗,就是你可以选择各种的程序任务去做。哦!针对自己有弱点的地方,然后去学习。活到老,学到老。
㈤ 编程员与算法工程师哪个更难考
算法工程师更难考。
算法工程师要比编程员难考,算法工程师是利用算法处理事物,不同的算法可能用不同的时间、空间或效率来完成同样的任务。算法工程师是一个比较高端的职位,大多数是硕士学历及其以上,是非常难考的。
编程员是协助软件开发代码编写及IT日常报障维护,应用程序开发、OA办公系统服务器、MES系统和数据库系统的维护和管理。
㈥ 算法不扎实的程序员,每一个都很慌
初学者经常问这样的问题,然而这些其实是错误的问题。
对于初学者而言,你最应该优先考虑的是,哪些东西构成了程序的基础?
最经典的一句话: 程序 = 数据结构 + 算法 。
如果说编程语言是程序的血肉,那么算法就是程序的灵魂。
人不能没有血肉之躯,但是没有灵魂的人依然只是一个死人。
不能单纯依靠算法衡量一个程序员的好坏,但是面试的时候考算法绝对是简单高效的筛选手段。近些年大厂的面试几乎必考算法也是这个原因。每一个算法学的不扎实的程序员,在面试的时候都很慌。
下面这些书籍应该是算法方面最常见的经典书籍。我有幸都读过,有些读完了,有些半途而废,不过基本上也都算是熟悉。顺序上由易到难,从薄到厚,每本书下面我会简单的介绍一番,希望能对你的学习有所帮助。
首先是两本算法入门书籍,也可以当做算法读物:
《啊哈!算法》
用他的自我介绍的来讲:“这不过是一本有趣的算法书而已,和别的算法书比较,如果硬要说它有什么特点的话,那就是你能看懂它。”
图文并茂,而且画风有趣,适合新手入门,但是代码是C的,看着比较累,文字也略显冗长。
图是非常棒的,启蒙用,非教科书
《算法图解》
和《啊哈》类似,他的介绍是:“像小说一样有趣的算法入门书。”
书里面讲的很好,python代码也很容易读懂,比之《啊哈!算法》,书中的例子没有那么有趣,但是图很清晰,文字和代码不冗杂。
缺点同样是非教科书,非常浅显,三四个小时就看完了。有一种刚刚热身的感觉。
接下来这几本都是最常见的书了:
《数据结构与算法分析C语言描述》
这本书的作者几乎不浪费笔墨在一些简单的地方。书很薄,但是覆盖面很广很深,作者实在是非常厉害。
不过反过来说,就是有些地方讲的语焉不详……
这本书还有java语言版本的,但是相比之下C的更好一些。
挺好的一本书。
还有一点是翻译不是很给力,好多人都没坚持看完。
《数据结构与算法Python语言实现》
英文版评分非常高,中文版评分非常低……
据说是也翻译的不好。另外就是本书自身错误也不少……几版过后依然很多没有改过来。
书中数学证明和介绍比较简单。因为采用Python语言的原因,比较易读。
浅显易懂,内容上循序渐进,环环相扣。相比于上一本,我会更推荐一些。厚度也不算厚。
《数据结构与算法 Python语言描述》
北大教授裘宗燕的书,这本书前面写的挺好的,尤其是在面向对象还有ADT等思想的阐述,都很不错。
但是读到后来给我一种虎头蛇尾的感觉,前面气势如虹绪论就写了很长,最后三章感觉有点草草收尾的意思。就像编辑在催稿,而作者很忙的样子……
另外就是这本书的编排顺序我个人也不是特别喜欢。
接下来是两本大部头,都是非常厚的书。
他们最大的特点就是:出现率远大于看完率
《算法导论》
算法书中的权威,MIT的6.046J就是按照这个来讲的。
公认最好的算法书,组织结构合理,内容详尽。引导读者从思维方式上对算法进行领悟。
书中对算法的数学结构进行了详尽的阐述。有非常多的数学证明。
这本书我说不出什么缺点,只能说有些内容是因为我还没到大牛的境界,暂时还无法体会理解。
我个人的观点是:不要纠结于详细的伪代码,不用纠结于连篇累牍的讲解。体会其中算法的精髓就好。
《算法》第四版
如果说,《算法导论》是学术上最好书,那这本应该是实际应用最好的书。
它对数学的要求比《算法导论》低很多,摒弃了算法的证明。
书中具体给出了每位程序员应知应会的50个算法,深入浅出,大量图解。非常棒。
java基础的话你能撸出来Hello World基本上就可以开始看这本书了,这本书最大的不友好之处在于它的第一章非常长,没看过的人又不知道哪里可以跳过。
这本书后面的翻译感觉不如前边了,不知道是换人了还是DDL了……
翻开书就会看到很多的图,配套作者在coursera上面的课程学的话事半功倍!
接下来的几本我看的比较少,简单介绍一下,希望大家自己去发现和了解,不要漏下这些好书:
《编程珠玑》
很薄一本啊,但是我放在那还没看完……
这本书被称为: 历史 上最伟大的计算机科学着作之一
融深邃思想、实战技术与趣味轶事于一炉的奇书。
内容不深,但是不是一个知识点一个知识点的给你讲解算法原理的。
这本书的核心思想是让你了解如何正确选择和高效地实现算法。书中还有一些趣闻轶事,看着倒是很有意思~
有兴趣的同学可以看看~
《算法竞赛入门经典》系列
算法竞赛入门经典书,ACM必备书籍吧算是。书中题目对于竞赛来说比较简单,但是对于一般我们平时工程来说偏难。语言用的是C/C++,请好好做例题好好做作业,读书的时候好好思考和复习~
反正我是没读过,捂脸……
《剑指Offer》
这个书很有意思,对于在校生来说我个人觉得是必看的书。没有任何工作经验的同学在面试的时候真的会被问懵的。这本书可以让你了解如何应付考官日常问题,在解答面试问题的时候,书中很多方法和思路会让考官觉得你思考的很全面,给你加不少分。
我面试的时候也曾快速扫过一遍这本书,让我在回答问题的时候条理更清晰。书中代码是C的,emmm,于是代码部分我就没太看……
《用Python解决数据结构与算法问题》
最后给大家推荐一本在线的 免费 的算法书。
https://facert.gitbooks.io/python-data-structure-cn/
不是大部头,也不是读物,新手入门足够用,书中介绍了大多数日常需要的算法,并且讲的比较浅显~转行的新手基本可以通过这本书来快速掌握常用基本算法了~
反正免费,是否适合自己看两页也就get了~
如果需要PDF版,可以在“程序员必修课”公众号后台回复:“Python算法书”获取。
㈦ 程序员算法基础——贪心算法
贪心是人类自带的能力,贪心算法是在贪心决策上进行统筹规划的统称。
比如一道常见的算法笔试题---- 跳一跳 :
我们自然而然能产生一种解法:尽可能的往右跳,看最后是否能到达。
本文即是对这种贪心决策的介绍。
狭义的贪心算法指的是解最优化问题的一种特殊方法,解决过程中总是做出当下最好的选择,因为具有最优子结构的特点,局部最优解可以得到全局最优解;这种贪心算法是动态规划的一种特例。 能用贪心解决的问题,也可以用动态规划解决。
而广义的贪心指的是一种通用的贪心策略,基于当前局面而进行贪心决策。以 跳一跳 的题目为例:
我们发现的题目的核心在于 向右能到达的最远距离 ,我们用maxRight来表示;
此时有一种贪心的策略:从第1个盒子开始向右遍历,对于每个经过的盒子,不断更新maxRight的值。
贪心的思考过程类似动态规划,依旧是两步: 大事化小 , 小事化了 。
大事化小:
一个较大的问题,通过找到与子问题的重叠,把复杂的问题划分为多个小问题;
小事化了:
从小问题找到决策的核心,确定一种得到最优解的策略,比如跳一跳中的 向右能到达的最远距离 ;
在证明局部的最优解是否可以推出全局最优解的时候,常会用到数学的证明方式。
如果是动态规划:
要凑出m元,必须先凑出m-1、m-2、m-5、m-10元,我们用dp[i]表示凑出i元的最少纸币数;
有 dp[i]=min(dp[i-1], dp[i-2], dp[i-5], dp[i-10]) + 1 ;
容易知道 dp[1]=dp[2]=dp[5]=dp[10]=1 ;
根据以上递推方程和初始化信息,可以容易推出dp[1~m]的所有值。
似乎有些不对? 平时我们找零钱有这么复杂吗?
从贪心算法角度出发,当m>10且我们有10元纸币,我们优先使用10元纸币,然后再是5元、2元、1元纸币。
从日常生活的经验知道,这么做是正确的,但是为什么?
假如我们把题目变成这样,原来的策略还能生效吗?
接下来我们来分析这种策略:
已知对于m元纸币,1,2,5元纸币使用了a,b,c张,我们有a+2b+5c=m;
假设存在一种情况,1、2、5元纸币使用数是x,y,z张,使用了更少的5元纸币(z<c),且纸币张数更少(x+y+z<a+b+c),即是用更少5元纸币得到最优解。
我们令k=5*(c-z),k元纸币需要floor(k/2)张2元纸币,k%2张1元纸币;(因为如果有2张1元纸币,可以使用1张2元纸币来替代,故而1元纸币只能是0张或者1张)
容易知道,减少(c-z)张5元纸币,需要增加floor(5*(c-z)/2)张2元纸币和(5*(c-z))%2张纸币,而这使得x+y+z必然大于a+b+c。
由此我们知道不可能存在使用更少5元纸币的更优解。
所以优先使用大额纸币是一种正确的贪心选择。
对于1、5、7元纸币,比如说要凑出10元,如果优先使用7元纸币,则张数是4;(1+1+1+7)
但如果只使用5元纸币,则张数是2;(5+5)
在这种情况下,优先使用大额纸币是不正确的贪心选择。(但用动态规划仍能得到最优解)
如果是动态规划:
前i秒的完成的任务数,可以由前面1~i-1秒的任务完成数推过来。
我们用 dp[i]表示前i秒能完成的任务数 ;
在计算前i秒能完成的任务数时,对于第j个任务,我们有两种决策:
1、不执行这个任务,那么dp[i]没有变化;
2、执行这个任务,那么必须腾出来(Sj, Tj)这段时间,那么 dp[i] = max(dp[i], dp[ S[j] ] ) + 1 ;
比如说对于任务j如果是第5秒开始第10秒结束,如果i>=10,那么有 dp[i]=max(dp[i], dp[5] + 1); (相当于把第5秒到第i秒的时间分配给任务j)
再考虑贪心的策略,现实生活中人们是如何安排这种多任务的事情?我换一种描述方式:
我们自然而然会想到一个策略: 先把结束时间早的兼职给做了!
为什么?
因为先做完这个结束时间早的,能留出更多的时间做其他兼职。
我们天生具备了这种优化决策的能力。
这是一道 LeetCode题目 。
这个题目不能直接用动态规划去解,比如用dp[i]表示前i个人需要的最少糖果数。
因为(前i个人的最少糖果数)这种状态表示会收到第i+1个人的影响,如果a[i]>a[i+1],那么第i个人应该比第i+1个人多。
即是 这种状态表示不具备无后效性。
如果是我们分配糖果,我们应该怎么分配?
答案是: 从分数最低的开始。
按照分数排序,从最低开始分,每次判断是否比左右的分数高。
假设每个人分c[i]个糖果,那么对于第i个人有 c[i]=max(c[i-1],c[c+1])+1 ; (c[i]默认为0,如果在计算i的时候,c[i-1]为0,表示i-1的分数比i高)
但是,这样解决的时间复杂度为 O(NLogN) ,主要瓶颈是在排序。
如果提交,会得到 Time Limit Exceeded 的提示。
我们需要对贪心的策略进行优化:
我们把左右两种情况分开看。
如果只考虑比左边的人分数高时,容易得到策略:
从左到右遍历,如果a[i]>a[i-1],则有c[i]=c[i-1]+1;否则c[i]=1。
再考虑比右边的人分数高时,此时我们要从数组的最右边,向左开始遍历:
如果a[i]>a[i+1], 则有c[i]=c[i+1]+1;否则c[i]不变;
这样讲过两次遍历,我们可以得到一个分配方案,并且时间复杂度是 O(N) 。
题目给出关键信息:1、两个人过河,耗时为较长的时间;
还有隐藏的信息:2、两个人过河后,需要有一个人把船开回去;
要保证总时间尽可能小,这里有两个关键原则: 应该使得两个人时间差尽可能小(减少浪费),同时船回去的时间也尽可能小(减少等待)。
先不考虑空船回来的情况,如果有无限多的船,那么应该怎么分配?
答案: 每次从剩下的人选择耗时最长的人,再选择与他耗时最接近的人。
再考虑只有一条船的情况,假设有A/B/C三个人,并且耗时A<B<C。
那么最快的方案是:A+B去, A回;A+C去;总耗时是A+B+C。(因为A是最快的,让其他人来回时间只会更长, 减少等待的原则 )
如果有A/B/C/D四个人,且耗时A<B<C<D,这时有两种方案:
1、最快的来回送人方式,A+B去;A回;A+C去,A回;A+D去; 总耗时是B+C+D+2A (减少等待原则)
2、最快和次快一起送人方式,A+B先去,A回;C+D去,B回;A+B去;总耗时是 3B+D+A (减少浪费原则)
对比方案1、2的选择,我们发现差别仅在A+C和2B;
为何方案1、2差别里没有D?
因为D最终一定要过河,且耗时一定为D。
如果有A/B/C/D/E 5个人,且耗时A<B<C<D<E,这时如何抉择?
仍是从最慢的E看。(参考我们无限多船的情况)
方案1,减少等待;先送E过去,然后接着考虑四个人的情况;
方案2,减少浪费;先送E/D过去,然后接着考虑A/B/C三个人的情况;(4人的时候的方案2)
到5个人的时候,我们已经明显发了一个特点:问题是重复,且可以由子问题去解决。
根据5个人的情况,我们可以推出状态转移方程 dp[i] = min(dp[i - 1] + a[i] + a[1], dp[i - 2] + a[2] + a[1] + a[i] + a[2]);
再根据我们考虑的1、2、3、4个人的情况,我们分别可以算出dp[i]的初始化值:
dp[1] = a[1];
dp[2] = a[2];
dp[3] = a[2]+a[1]+a[3];
dp[4] = min(dp[3] + a[4] + a[1], dp[2]+a[2]+a[1]+a[4]+a[2]);
由上述的状态转移方程和初始化值,我们可以推出dp[n]的值。
贪心的学习过程,就是对自己的思考进行优化。
是把握已有信息,进行最优化决策。
这里还有一些收集的 贪心练习题 ,可以实践练习。
这里 还有在线分享,欢迎报名。
㈧ 程序员如何提高解决问题的能力
就和你编程一样。决策树算法的逻辑,移植到实际问题的解决。甚至可以升级为,决策森林算法,深度森林算法。
遇到问题就开始分类。然后根据自己的现状与实力,确定可行域,然后找最优解,最起码也得是可行解中的效率较高的。