程序员是怎么学习算法的?_程序员应该怎么学

由网友 新虎城 提供的答案:

程序员学习算法时,建议先从以下几个方面开始:

1. 基础算法学习:学习算法基础知识,如排序、查找、哈希、树、图等基本算法。可以通过看相关书籍和视频,参加相关课程和学习群,或者参考网上的相关博客或论文进行学习和实践。

2. 练习算法实现:学习一个算法后,应该通过编写代码来实现和练习这个算法。可以在LeetCode、洛谷、CodeForces等OJ平台上练习算法实现。

3. 多思考和交流:练习算法的过程中,遇到问题应该及时记录问题、思考答案并与他人交流,以便更好地理解和掌握算法。

4. 刷题和做题:刷题是学习算法中的重要方式,可以在OJ平台找到大量的题目进行练习,提升算法实现能力和效率。

5. 参加比赛:加入编程比赛和算法竞赛,可以提供更好的学习和交流环境,进一步加深对算法的理解和掌握。常见的比赛包括ACM/ICPC、Google Code Jam等。

总之,学习算法需要有耐心、细心,需要多加练习和思考,遇到问题应该及时与他人交流和讨论。不断地学习和提高自己的能力,才能更好地应对未来的编程工作和挑战。

由网友 胖子随感 提供的答案:

把自己变笨,要进入计算机的世界,每次只能进行一步计算。最难的算法都是需要迭代理解,比如链表逆转,如果空间足够大,可以把所有链条断开并且都保存起来,用递归:头部的指针直接给临时指针,临时指针变头部指针继续循环,直到找到尾部的指针,然后头尾交换,完成转换。

public Node reverseList(Node node) {

if(node.next == null) {//当最后一个节点的时候返回return node;

}

Node temp = node.next;//得到当前节点的下一个节点

Node returnNode = reverseList(temp);

temp.next = node;//下一个节点的下一个节点为当前节点实现逆转

node.next = null;//实现逆转前链表的头结点为为节点

return returnNode;//返回逆转后的链表的头节点

}

如果没有大空间,就需要头指针自己迭代,保存头部的指针,头部的指针变头头部指针(第一次为尾部空),头头部指针变头指针,头指针变头部指针,这一轮结束,下轮开始,直到末尾。

public Node reverseList2(Node node) {

Node frontNode = null;//头结点逆转的时候前一个节点为null

Node headNode = node;//当前节点为头节点

Node tempNode;//临时变量保存下一个节点while(headNode != null) {

tempNode = headNode.next;

headNode.next = frontNode;//实现逆转

frontNode = headNode;

headNode = tempNode;

}

return frontNode;

}

由网友 勇哥java实战分享 提供的答案:

其实你我都心知肚明,除非特殊场景,在中国的 IT 环境里,大多数场景下,学习算法的目的在于通过笔试算法题。

但算法书林林总总,有时候乱花渐欲迷人眼。

杜甫有诗云:读书破万卷,下笔如有神。不管选择哪本书,只要深入学习,分层次,逐层进阶,一定可以将算法攻克。

笔者强烈推荐一个 Github 开源项目 LeetCode-Go,你不仅可以把他当做一本开源算法书,也可以当做一个学习和交流的平台。

1 项目简介

github 地址:https://github.com/halfrost/LeetCode-Go

作者写算法书的目的很利他:

刷题刷了一年了,想和大家分享分享一些做题心得,解题方法。想和有相同爱好的人交个朋友,一起交流学习。对于自己来说,写题解也是一种提高。把一道深奥的题目讲给一点都没有头绪的人,并能让他完全听懂,很能锻炼人的表达能力。在讲解中很可能还会遇到听者的一些提问,这些问题可能是自己的知识漏洞,强迫自己去弥补。笔者在公司做过相关的分享,感受很深,双方受益都还不错。

2 便于阅读

离线版本的电子书《LeetCode Cookbook》PDF Download here

通过 iOS / Android 浏览器安装 PWA 版《LeetCode Cookbook》至设备桌面随时学习

3 图书目录

为了让读者一步步学习,作者将图书分为四个部分:

1、序章:算法的基础知识(数据结构知识 & 算法知识 & 时间复杂度)

2、算法专题

3、一些模版

4、LeetCode 题解

由网友 天涯学馆 提供的答案:

首先基础知识要牢固

基础知识包括数学基础,计算机基础;数学基础研究生以前的数学都是基础数学,严谨的数学逻辑思维。计算机基础包括计算硬件知识,计算机网络知识,计算机软件知识。

其次编程技术要牢固

最起码要擅长两三门编程语言技术,熟悉他们底层开发逻辑原理,熟悉常见的数据结构和算法。

算法研究

熟练使用常见的各种算法,不但学习和研究新的算法逻辑,从开源算法研究中归纳总结和改进提出自己的意见。

由网友 数理土豆饼 提供的答案:

我的经验,动态演示网站,看每种算法运行过程的动态过程,比纯粹看书,理解的快的多,先搞清楚设计算法的目的,运处,看了动态演示 以后,再通过文字叙述和程序 理解算法的实现细节。另外 普林斯顿大学 cos 226 课程 的在线 ppt ,也写的非常好,内容丰富,可以帮助和加深理解。比如他在说明算法渐进复杂度时,说了一个,1000个数,计算所有三个数组合和等于0的个数的例子,这个一般教材没有,促使人思考。某些教程 作者 自己也 没有理解到位,把简单的事情,叙述的难懂了

由网友 欧文看数据 提供的答案:

我认为方式主要有以下3种:

  1. 问题驱动型, 当你碰到特定问题时, 去学习该问题相关的算法; 例如当你碰到某段程序排序运算特别慢的时候, 就会去了解有没有高效的/利用更多内存的排序, 以空间换取时间. 进而你会了解到冒泡排序, 插入排序, 堆排序, 快速排序等等.
  2. 领域驱动型, 当你的工作遇到了新的领域, 例如你接手一个项目, 需要对一些信息进行加密和解密. 可能你从来没做过加密解密的算法, 这个时候, 就需要较好的理解学习一下对称加密/非对称加密, 加密的本质, 提高加密安全度等等.
  3. 面试驱动型, 最后一个很多程序员特色哈, 是为了面试而准备的. 比如现在面试题动不动就问红黑树, B-Tree, 平衡二叉树/非平衡二叉树, 哈希算法, 任务分发等. 可以说程序员大部分时间做着CRUD和UnitTest, 只有到面试前了, 才去看那些有的没的各种算法.

程序员是怎么学习算法的?_程序员应该怎么学

由网友 军事力量AgxK 提供的答案:

程序员最重要的是学习能力, 算法只是其中一环,至于是否必须我的看法是不一定,只需要理解掌握基本算法即可, 因为很多算法都已经现成集中在很多库中,例如排序,只要会使用就行。

考验程序员的关键还是如何合理的 有效的利用 各种接口来实现具体需求,最重要的还是学习能力。基本的数据结构全要掌握。慕课网实战搜一下相关的课程。买本程序与数据结构慢慢研读,提升数学水平,结合进行实战

由网友 杨小杨影视 提供的答案:

在网络上流行一句话:算法分三种,竞赛的算法、面试的算法、算法。虽然这么分非常让人无语,但其实可以去这么理解,因为竞赛、面试和纯理论的要求和限制是不同的,所以算法在不同的要求中展现了不同的样子。

对于竞赛来说,每道题对输入参数和样本量的要求都是非常明确的,同时规定的非常明确的还有空间的限制和运行时间的限制。每一个竞赛选手都非常熟练怎么根据这些提前给好的限制,反推出自己需要实现一个什么样复杂度的解法才能通过。每一行代码包含着前辈和自己思考过的优化。

而对于面试来说,限制往往并不明确,造成这个现象的原因也很好理解。竞赛中当然是分数最重要。在面试的过程中,与面试官的交流和体现自己想事情的方式、体现自己逻辑的严密更重要。所以同一道题,在竞赛中必须写清楚限制,而在面试中一道题刚开始的限制没那么多,目的就是缩短你理解题目的时间,让面试者先写出一点什么,然后和面试官展开讨论,随着讨论的深入,再逐渐的把限制聊清楚。总之在面试的场合就是想看看你想问题的习惯、轨迹以及表达能力是否符合要求。

当然,不管是什么要求下的算法,经常练习算法和数据结构题目对一个人在逻辑上的提升都是显而易见的,在学校参加ACM并取得很好成绩的同学,如果不是表达能力特别差的话,是一定会收获很多offer的,因为思维被锻炼的很好。

对于算法,给大家的建议

先找到线团,然后进入线团里学着怎么玩。为了进入线团,需要先把基础知识掌握好。《算法和数据结构》(教材),你一定要看完+理解。这里面讲的都是不能再基础的东西了,觉得讲得不好,自己搜维基百科。没办法,如果坚持不下来,后面就受罪去吧。

对于线上刷题平台的题目,先不找解答,先自己实现,实现的多low,复杂度多差,都坚持写完。

然后分析出复杂度。接下来去网上找答案,看到复杂度和你一样或比你低的,直接略过。看到比你好的,重点看,一定要理解,然后分析为什么比你的好,如果你真的理解了,你一定能找到别人优化的点。

这个过程可能是最奇妙的过程,不要给自己太大压力,这个过程其实可以很欢乐,有想法并创造出来,练习了自己的coding能力。

别人有更好的实现,推翻了你的所有模型和幻想,你幻灭了,却也因此找到了让你血脉喷张方法。这个阶段看似苦,实际上其乐无穷。

在学习别人解法的过程中,又了解了很多算法和数据结构。而且付出的每一滴汗水,都是结果导向的,可量化的,实实在在的。

写写简单的测试函数就可以发现自己方法的运行时间和更好的解法就是没法比。这是一个非常培养自驱力的阶段,这是一个只追求解法更快更强的阶段。

看到很多经典的结构,学到很多很不错的优化。比读那些让你吃力的书更加快乐,也能够一直启发你走下去。你苦苦寻找啊,觉得好的不能再好的方法啊,直到有一天,突然看到一个更优的解法,相信你一定会一整天都在贤者时间里。

不建议刚开始刷题的人就直接在网络上搜集文章开始学习,因为太散了,而且需要花很多时间去鉴别正确与否。

当这些内容都掌握之后,再开始在网上搜集各种各样的题,并与网友参加各种各样的讨论,会比较高效。

把底子打好之后,对于专项算法的学习就得心应手了,而且会学的很快。 对于很庞大的算法,找例子来引导自己的思路,一点一点的接近算法的核心。唯一需要注意的是,一定要写代码,光看没有用的。

对于经典算法的学习,大体上分成几个阶段:

  • 第一阶段:对于某一个具体的算法,首先要搞清楚这个算法解决的问题是什么,可能是实现一个具体的功能,也可能是在某些方面,比如时间复杂度或者空间复杂度方面很卓越,总之搞清楚这个算法被研究出来的目的是什么。
  • 第二阶段:然后就要弄清楚这个算法的生存环境了,也就是看看你此时研究的东西是不是对别的知识有依赖,应该先把底层依赖的知识理解并掌握。这些问题都解决之后,就进入到算法本身的学习,理解一个算法是一件辛苦的事情,刚开始看必然会产生很多的困惑,比如经常会怀疑作者讲述的内容的重要性?这些内容和这个算法有什么联系呢?经常会有这种摸不着头脑的感觉,其实作者做的铺垫都是为了建立起描述算法主要内容的基础,只有接受和理解这些基础,才能逐渐触碰到算法的精髓,所以耐心是很重要的。
  • 第三阶段:算法的主要过程看完之后,往往还是会感到困惑,主要是不知道这个过程好在哪,这就进入了下一个阶段,理解作者对这个过程在功能性或者效率卓越这件事上的解释和证明。这才真正触碰到算法最精髓的部分,也就是深度的理解算法的主要过程所带来的好处,这才是最锻炼人理解能力的地方。
  • 第四阶段:上面几点是算法学习阶段的过程了,接下来就是研究算法的代码实现,自己设计测试用例亲自跑一下代码,以及从代码运行时间的角度分析这个算法的优势,这也是加深对算法的理解的过程。
  • 第五阶段:最后是配合相应的题目练习,让自己通过题目练习的方式,会用、善用学习到的算法,并对这个算法产生一定的敏感程度,具体是指看到某些题目时,能够根据题目的特点,产生与该算法的对应,也就是具备举一反三的能力。

学习永无止境,不管是算法小白,还是有一定的算法基础,提升算法永远都是刚需。

部分文章源于互联网收集,不代表默子网络立场,版权归原作者所有,如若转载,请注明出处:https://www.html369.cn/10042.html