V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
hackzx
V2EX  ›  程序员

自学编程 9 年,想学算法,有可以推荐的书吗?

  •  
  •   hackzx ·
    Aunger-ops · 2020-05-28 22:24:24 +08:00 · 6982 次点击
    这是一个创建于 1673 天前的主题,其中的信息可能已经有所发展或是发生改变。

    rt,题主从小学起开始自学编程,但总觉得每每会了入门了一门语言却很难有所提升,总感觉无论怎么学都跟大佬们相差了很大距离。由于没有老师,9 年来学会的东西很多,从前端到后端,从嵌入式到计算机软件,各类流行技术、框架,语言等等都有进修。

    始终觉得自己学的越多,越觉得自己菜的到家。

    今日浴室奇想,醒觉算法也许可以让我停滞的修为有所提升。但因为此前没有怎么接触了解过如何去体系化学习算法,想找些书看。有些编程基础,请问我应该找哪本书看会更适合呢?

    51 条回复    2020-07-08 20:58:04 +08:00
    wujieyuan
        1
    wujieyuan  
       2020-05-28 22:44:48 +08:00
    学许多语言有什么用, 关键要看自己的需求,需要什么就学什么, 啥都会一点还不如只精通一门
    hdbzsgm
        2
    hdbzsgm  
       2020-05-28 22:47:56 +08:00
    统计学习方法 李航
    hackzx
        3
    hackzx  
    OP
       2020-05-28 22:49:02 +08:00
    @wujieyuan 话是这样没错,就是因为总觉得在一个语言上迟迟没有进步,才跑去学另一门语言的
    em70
        4
    em70  
       2020-05-28 22:54:03 +08:00   ❤️ 1
    提升语言能力的途径不是算法而是项目,9 年你做过多少有价值的产品? 有多少用户因你而受益?
    nguoidiqua
        5
    nguoidiqua  
       2020-05-28 23:20:31 +08:00   ❤️ 5
    学再多都没用的,技术不是学术,得去用、去练才能掌握。只是看看原理做做题目,而没有运用到实践中去,那是不能真正融会贯通的。

    能够熟练运用书本上的知识了,才能谈提高。这个时候就需要去挑战自己能力的边界,去解决那些自己感觉棘手的问题,这个过程你可能要经过各种思考、尝试、查找资料,当你解决完一个又一个以前解决不了的难题之后,你的水平也就提高了。

    总之,要带着问题去学习,不要泛泛而学。与其考虑该看什么该学什么,不如好好想想你学编程是想干什么或是解决什么问题。找到这个目标之后,一路打过去就行了,然后再向另一个更高的问题出发。
    sudoy
        6
    sudoy  
       2020-05-28 23:30:48 +08:00
    Learn by doing bro! 我也是自己学的,边学边应用到工作中,写出 bug 了再去 StackOverflow 搜,还可以上 V 站请教大佬
    hackzx
        7
    hackzx  
    OP
       2020-05-28 23:40:50 +08:00
    谢谢楼上的各位前辈给的建议。

    我学编程也就是爱好吧,因为喜欢什么而去学什么。

    当然希望以后毕业也能投身到自己热爱的事业中去,我学习的方法也和 @sudoy 一样,一边做项目,一边学习,至今也做了许多项目,也都因为小和对自己写的菜的认识,也都没有开源。

    在网上也经常听说各位前辈也有一年经验干了两三年,没办法进步的事。想找算法书也是希望能有所提升
    lbfeng
        8
    lbfeng  
       2020-05-28 23:44:51 +08:00   ❤️ 1
    coursera 上有 princeton 的算法课。看视频和里面的教材。
    hackzx
        9
    hackzx  
    OP
       2020-05-28 23:49:44 +08:00
    其实写了那么多年代码,一直觉得自己都是在应用层逻辑上舞刀弄枪,只会用别人写好的库,遇到无解问题基本完蛋。这才是我感触最深,觉得自己与大佬相差甚远的重点。
    hackzx
        10
    hackzx  
    OP
       2020-05-28 23:51:22 +08:00
    @lbfeng @hdbzsgm 十分感谢❤️
    zouzou
        11
    zouzou  
       2020-05-28 23:56:28 +08:00
    编程是手艺活,系统点的话,大学里有专业叫计算机科学与技术,照着里面的课程学。
    Mistwave
        12
    Mistwave  
       2020-05-28 23:57:13 +08:00 via iPhone
    算法 第四版 中译本也是相当好的
    就是上面所说的 Princeton 的算法课教材
    KousukeSakurako
        13
    KousukeSakurako  
       2020-05-28 23:57:28 +08:00 via Android
    @hackzx 同感,目前正在学习数据结构和算法,以及离散数学
    sudoy
        14
    sudoy  
       2020-05-29 00:04:56 +08:00
    @hackzx 我目前也都使用别人现成的库,尤其是 python 我想用的库都有人写好,MIT license 免费用,而且写的人水平还很高。但是你可以学一学自己造个轮子啊,找个简单但是你认为写的很好的库依葫芦画瓢
    ZztGqk
        15
    ZztGqk  
       2020-05-29 00:10:23 +08:00 via iPhone
    看了下描述,建议先看一下 SICP,B 站有课程。
    Hieast
        16
    Hieast  
       2020-05-29 00:35:07 +08:00   ❤️ 6
    算法就是指解决问题方法的清晰描述,我认为分布式网络的一致性算法、传输层的拥塞控制算法甚至量子计算机专用的退火算法都属于宏观上的算法,但是通常所指的算法是使用通用程序语言求解一般数学问题的方法。

    计算机解决一个应用问题的方法就是 1. 把应用问题建模成一个已有算法的数学问题 2. 实现该数学问题的算法 3. 把应用的参数传到算法里。
    业务架构师工作重点在第一步,算法工程师工作重点在第二步,开发工程师重点在第三步,这就是为什么很多人感觉自己只是调包侠。

    实话说恰饭的话用不上算法,会用顺序选择循环把参数传到合适的包里就能恰上饭了,但是既然你想学,那就说说我的看法。
    钢铁直男的学法是先学离散数学,熟悉计算机领域数学问题的描述方法,然后啃「算法导论」,能啃完前四部分应该就超过大部分人了。
    不那么头铁的方法是找资源更丰富的课程学习,我推荐学堂在线邓俊辉的数据结构,直接送上书的地址,视频、助教、示例代码、OJ 功能齐全。不要担心没有提升,我也没学完就找到工作了,后面就研究怎么恰饭了。就我观察 99% 的人是学不完的。学多少是能力,学不学就是兴趣啦,加油,祝你能打通。
    https://cloud.tsinghua.edu.cn/d/902db8d098bc4479b82e/files/?p=/%7Edeng/ds/dsacpp/dsacpp.pdf
    impl
        17
    impl  
       2020-05-29 00:41:13 +08:00
    如果是小白入门的,可以看算法图解 grokking algorithms
    RangerWolf
        18
    RangerWolf  
       2020-05-29 00:42:40 +08:00   ❤️ 1
    不知道楼主有系统学习过一些基础课程, 比如 数据结构、计算机系统?
    个人感觉好好学完之后,水平上升了一个层次
    PS: 我也是自学

    另外, 学完这些之后假如您还不需要立即找工作,比如正在读书。 建议找一两个你喜欢的开源项目,先看看人家的代码。如果你能有一些 commit 被合并进去, 以后找工作肯定是一大亮点
    CoderGeek
        19
    CoderGeek  
       2020-05-29 01:25:06 +08:00
    基础在学校的时候容易学 年轻有精力 考试生啃都可以 后面就会越来越理解 2333
    HeapOverflow
        20
    HeapOverflow  
       2020-05-29 02:36:09 +08:00
    每个语言每个框架都有做出来比较大的 project 吗?光学那么多东西又不用,学的再多有何用?
    djs
        21
    djs  
       2020-05-29 03:16:06 +08:00 via iPhone
    楼主数学基础怎么样呢,我现在在看程序员的数学,补充一些然后再学习算法之类的
    findex
        22
    findex  
       2020-05-29 03:21:07 +08:00 via iPhone
    编程是一辈子的事。算法其实都不难。关键在于理解。
    自学一下计算机原理。然后按照计算机的思路,用数学逻辑方法找最优解的时候就能体现出算法的魅力。不外乎编程语言。
    有理论基础,学算法的时候会快很多。

    Python 是节约时间,快速解决问题。这是一个解决问题的工程师思路。更好的解决问题,优化算法等,这是另一个思路。

    计算机科学才刚刚开始,感觉永远学不完。我也是自学而来的。不要有太大心理压力。也别被什么老板吹牛而被动敬畏。回过头来看看,那些都是毛毛雨。真正厉害的,不用吹,看看历史对他们的评价比自吹自擂更让人信服。
    ranio
        23
    ranio  
       2020-05-29 03:54:38 +08:00
    语言是相通的,算法是灵魂。伯克利,斯坦福,MIT 的算法课找个对胃口的刷。
    hehheh
        24
    hehheh  
       2020-05-29 04:31:42 +08:00
    算法做做 leetcode 其实挺好的,做 300,400 道,把最起码的二叉树,图搜索,dfs,bfs,stack 弄清楚其实就够了。我觉得对我的提升挺大的
    bojue
        25
    bojue  
       2020-05-29 07:54:17 +08:00 via iPhone
    计算机基础学科的学习:现代操作系统,算法和数据结构,编译原理,网络
    wuweidong0107
        26
    wuweidong0107  
       2020-05-29 07:58:06 +08:00
    跟算法一点关系都没,你的问题是你没有也不知道怎么建立知识体系。
    hanxiV2EX
        27
    hanxiV2EX  
       2020-05-29 08:10:07 +08:00 via iPad
    学数学吧
    MrCurly
        28
    MrCurly  
       2020-05-29 08:12:28 +08:00 via iPhone
    老哥大学还没毕业?
    QingchuanZhang
        29
    QingchuanZhang  
       2020-05-29 08:13:38 +08:00
    pkm
        30
    pkm  
       2020-05-29 08:58:16 +08:00 via iPhone
    《算法竞赛入门经典》《算法竞赛入门经典训练指南》《挑战程序设计竞赛》 配合 codeforces.com 食用
    busfool
        31
    busfool  
       2020-05-29 09:04:14 +08:00 via iPhone
    找个老师教教吧 然后找份工作
    ifxo
        32
    ifxo  
       2020-05-29 09:17:30 +08:00
    学算法需要精通数学吧,不过觉得很难的,不用学那么多语言,就学一门,各个方面都精通了,怎么可能越学越菜呢,多跟大佬交流下
    monkeyWie
        33
    monkeyWie  
       2020-05-29 09:21:02 +08:00
    直接刷 LeetCode 吧
    gaigechunfeng
        34
    gaigechunfeng  
       2020-05-29 10:07:17 +08:00
    绝对是人才!我虽然本科,研究生都是计算机专业。但真正开始写代码都读研了。

    非常后悔大学 4 年都浪费,没有好好学习。

    楼主这么早就学习编程,而且还很喜欢这行的话,绝对未来可期。
    Ariver
        35
    Ariver  
       2020-05-29 10:13:15 +08:00
    直接刷 leetcode.
    hackzx
        36
    hackzx  
    OP
       2020-05-29 10:28:46 +08:00
    十分感谢楼上前辈们的建议,我想我也有了大致的认识。❤️
    hackzx
        37
    hackzx  
    OP
       2020-05-29 10:34:09 +08:00
    目前大一,电子科学与技术专业。下星期三就参加转计算机科学与技术专业考试。

    请问有转专业成功经验的前辈们指点些建议吗?
    Coverlove
        38
    Coverlove  
       2020-05-29 10:54:53 +08:00   ❤️ 1
    lz 可以啊,年纪轻轻就有 9 年编程学习经验了。我虽然是计算机专业出身,但真正走向编程之路是大三下的实习阶段,现在有些后悔了。后生可畏啊
    24bit
        39
    24bit  
       2020-05-29 11:06:34 +08:00
    数据结构与算法分析 - xx 语言描述
    wysnylc
        40
    wysnylc  
       2020-05-29 11:08:38 +08:00
    下次我就简历加上十年编程经验
    namelosw
        41
    namelosw  
       2020-05-29 11:16:25 +08:00
    大部分工作中其实很少用到算法,如果用的话一般也只是过度设计而已。

    找了很多算法入门的资料,其实没有太好的,只能反反复复看一看,最后从适合自己,或者自己感兴趣的入手。

    基本上分几类,严肃点的就是 CLRS,如果 CLRS 太复杂就从 Princeton 开始。另外 Amazon 前 CTO 写比较有意思,书名好像也叫算法导论,不过好像有人也翻译成引论,那本书主要专注于数学归纳法相关的算法,可以解决很多问题。
    还有就是课,比如 MIT 的 OCW 有 Erik Demaine 教的算法和高级算法和数据结构感觉不错。
    还有就是科普向的书,比如上面说的 Grokking algorithms,可以入门试试。
    还有就是一些旁门左道,比如我最近发现一本 Common Lisp 的算法书,打算试试。
    最后就是一些各领域的不同风格算法,比如分布式算法,比如 persistence data structure 的算法 - CMU 有一本 Okasaki 之类额。
    LoNeFong
        42
    LoNeFong  
       2020-05-29 11:18:39 +08:00
    看山是山,看山不是山,看山是山, 反复横跳,很正常的
    keshawnvan
        43
    keshawnvan  
       2020-05-29 11:50:34 +08:00
    极客时间上的数据结构与算法之美
    121121121
        44
    121121121  
       2020-05-29 12:07:01 +08:00
    刷 acm 的题目
    HerrDu
        45
    HerrDu  
       2020-05-29 13:59:17 +08:00
    编程学明白了?
    HerrDu
        46
    HerrDu  
       2020-05-29 14:00:28 +08:00
    高纳德 出过一个系列的书,你先慢慢看着。
    Meli55a
        47
    Meli55a  
       2020-05-29 23:19:27 +08:00
    兄弟,非得干这一行吗?
    irgil
        48
    irgil  
       2020-05-29 23:29:56 +08:00   ❤️ 1
    我只推荐我看过的,
    先看算法第四版,有公开课。
    然后看 csapp,也有公开课。
    两个都要做课后作业 。
    然后学习 mit 6.828 。

    其次你还是学生,好好学线性代数、微积分、运筹学,很有帮助。
    ChanKc
        49
    ChanKc  
       2020-05-30 00:05:28 +08:00 via Android   ❤️ 1
    Introduction to Algorithm 。不过这个的前置课程( prerequisites )是数据结构,线性代数(有涉及矩阵乘法)和高等数学(有涉及到无穷级数)
    dearmymy
        50
    dearmymy  
       2020-05-30 02:05:39 +08:00   ❤️ 1
    @hackzx
    你在大学那就可以慢慢学了,算法前置技能太多了。数学,数据结构都是。建议你算法放到后面几年在动。
    geemaple
        51
    geemaple  
       2020-07-08 20:58:04 +08:00
    《算法技术手册》/ Algorithms in a Nutshell

    《 STL 源码剖析》/ The Annotated STL Sources

    《算法心得:高效算法的奥秘》/ Hacker's Delight, 2nd Edition

    《数学之美》

    《编程之美 : 微软技术面试心得》
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2669 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 15:30 · PVG 23:30 · LAX 07:30 · JFK 10:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.