V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
liyu4
V2EX  ›  程序员

因为是野路子走出来的码农,一直觉得自己算法这方面特别烂。

  •  
  •   liyu4 · 2016-12-02 10:21:21 +08:00 · 10176 次点击
    这是一个创建于 2912 天前的主题,其中的信息可能已经有所发展或是发生改变。
    话说那一年,我还在杭州做其他行业的时候,学了个把月的 go ,投了几封简历,然后上海有一家公司电话和我面试,对方公司可能也并不需要找很高级的工程师,就问了我知道排序算法有几种,诚然我是知道一些的,就比如大学时候大家都耳熟能详的冒泡排序,然而我也只知道这些,毕竟大学不是学这个专业的也不是能搪塞如此尴尬的借口,自 2016 年初来到上海,掐指一算也有春夏秋冬了,但是之前没有弄明白的至今依旧是一片空白。不知道各位亲爱的同学是否也有跟我一样情况的。所以我在 github 上给自己开了一个 repository ,有需要的同学我们可以一起讨论和学习,水平实在有限,路过的大神愿意的指点一二,在下也是感恩涕零。

    address: https://github.com/liyu4/learn-algorithm-365

    ps:为什么楼主现在不会用到算法,其实也会,但是一般都是使用别人写好的,或者说是 golang 自带的 sort ,就比如说你想要一个安全的 set ,别人已经帮你写好了,安全的 map 没问题, github 也有人写好了,这种情况不再赘述。另外就是本人的工作比较杂,有时候是写 api ,或者是做一些简单的前端开发(公司没人),有时候还会去写一些其他的东西,还有就是和数据库的一些交集。
    94 条回复    2016-12-13 18:21:09 +08:00
    Mithril
        1
    Mithril  
       2016-12-02 10:30:02 +08:00
    还是先学学英语吧。。。
    lixile
        2
    lixile  
       2016-12-02 10:32:52 +08:00
    转行路茫茫 我还在学习的路上 同在杭州 在其他行业 准备入程序员坑
    dtysky
        3
    dtysky  
       2016-12-02 10:38:04 +08:00 via Android
    不要在一开始就给别人说自己要干啥干啥……至少做一半再说吧

    https://github.com/dtysky/Algorithm

    拿来练手的,很不工程,没用智能指针和虚函数啥的……
    realpg
        4
    realpg  
       2016-12-02 10:43:01 +08:00
    算法烂并不怕 很多场景用不到很强悍的算法

    结构要清晰 思路要明确 另外好好学习英语
    liyu4
        5
    liyu4  
    OP
       2016-12-02 10:43:28 +08:00
    @Mithril 感谢提点,英语确实很差,目前的情况是读没有问题,写和听不好,业余时间还翻译了一些资料。
    liyu4
        6
    liyu4  
    OP
       2016-12-02 10:44:10 +08:00
    @dtysky 谢谢。
    liyu4
        7
    liyu4  
    OP
       2016-12-02 10:44:54 +08:00
    @realpg 开个玩笑,比如写 html 。
    liyu4
        8
    liyu4  
    OP
       2016-12-02 10:46:04 +08:00
    @lixile 加油,我之前的情况是自学的,历时大概三个月,过程还是很痛苦,建议你报培训班,可能学起来系统些,也能快一些。
    lixile
        9
    lixile  
       2016-12-02 10:48:20 +08:00
    @liyu4 还要上班 又不想靠家里 只能下班自学
    liyu4
        10
    liyu4  
    OP
       2016-12-02 10:50:41 +08:00
    @lixile 我也是在边上班变学的,当时工作可能比较轻松,所以学的时间比较多, 我是 14 年毕业的,现在学什么方向?
    gimp
        11
    gimp  
       2016-12-02 10:51:23 +08:00   ❤️ 7
    http://zh.visualgo.net/

    之前也不喜欢算法,后来想一想,学学没坏处,就重新学习了,发现很多大一大二看起来挺头大的东西,现在看起来都挺简单的
    liyu4
        12
    liyu4  
    OP
       2016-12-02 10:55:08 +08:00
    @dtysky 可能误会我的意思了,我不是你口中的那种人,我已经开始做了。虽然我英语没你好😄。
    liyu4
        13
    liyu4  
    OP
       2016-12-02 10:56:34 +08:00
    @gimp 很有意思的站点, 我是跟着算法导论学习的,很枯燥呢。 还是谢谢你的分享。
    lixile
        14
    lixile  
       2016-12-02 10:57:57 +08:00
    @liyu4 java 大学专业学过简单的 c 和汇编 朋友推荐我从 java 入手 我就这样开始了看书 自学
    Mithril
        15
    Mithril  
       2016-12-02 10:59:10 +08:00
    @liyu4 个人认为重要性和优先级应该是 英语 > 计算机基础 > 算法
    基础包括计算机专业那些主课,网络,组成原理,体系结构和编译原理什么的。
    liyu4
        16
    liyu4  
    OP
       2016-12-02 11:01:46 +08:00
    @Mithril 我现在很痛苦的是,写特别差。看来要好好练练表达了。
    66beta
        17
    66beta  
       2016-12-02 11:02:19 +08:00
    @gimp 好网站收藏了

    同楼主,野生码农,学校里学过 C++和数据结构,现在做前端
    ldrljq
        18
    ldrljq  
       2016-12-02 11:06:17 +08:00
    其实我比较好奇的是,为什么有人上来就说 LZ 英语不好,这是怎么看出来的?
    enenaaa
        19
    enenaaa  
       2016-12-02 11:08:38 +08:00
    @ldrljq github 里的 readme 。虽然我英语不会比楼主好, 但还是看得相当别扭。
    x13945
        20
    x13945  
       2016-12-02 11:11:02 +08:00
    @ldrljq Readme 里一股中国味:smile:
    yoke123
        21
    yoke123  
       2016-12-02 11:12:10 +08:00
    @gimp 谢谢分享的链接
    liyu4
        22
    liyu4  
    OP
       2016-12-02 11:16:48 +08:00
    @ldrljq 指点的同学应该是看了我的 github 才说的, write 确实不好,我还是很诚心的接受他的意见。我现在的英语大概就是六级的水准, 425 分的那种😄。
    liyu4
        23
    liyu4  
    OP
       2016-12-02 11:17:45 +08:00
    @enenaaa 可否指导一条明路,如果优雅的写 eg
    liyu4
        24
    liyu4  
    OP
       2016-12-02 11:19:21 +08:00
    @66beta 加油!
    liyu4
        25
    liyu4  
    OP
       2016-12-02 11:23:44 +08:00
    @lixile 我有几个同学也是学的 java ,时间也抓紧啊,听他们说现在工作不好找了。
    enenaaa
        26
    enenaaa  
       2016-12-02 11:26:44 +08:00
    @liyu4 我的做法是适当藏拙。不会的或不确定的词句用中文,自己会的或查了几遍词典觉得能接受的才用英文。
    dtysky
        27
    dtysky  
       2016-12-02 11:32:41 +08:00
    @liyu4 我英语渣渣啊,前面几个项目英文文档写的和 S 一样,后面学乖了多查字典少写字。。。
    mko0okmko0
        28
    mko0okmko0  
       2016-12-02 11:32:55 +08:00
    那个题目本身就有问题,何不问问某情况下,你会用什么方法解决,
    所以出题的也许只是学院派?
    打野出身没什么,学院派只会讲的比会写得多很多.
    建议找个想法先做小产品或是小 DEMO.
    拿这些(半)成品去面试投履历可能比较有机会,

    像我都不问新同事这些的,
    我都先问有那些(半)成品,先看看然后直接问他某部分的实作,
    尤其是该部分我推测有很多种实作方法的.还会问他为何不用 XX 作法,
    然后根据对方实作的选择跟理由评估这个新人到底是能信任的同事还是不能期待的.

    最讨厌一直问排序法的,一堆现成的库 /包 /框架不问有没有听过,找过,用过,在那里问学院问题,听到火大.

    资工的自学叛逆分子留.
    q397064399
        29
    q397064399  
       2016-12-02 11:37:33 +08:00
    总而言之,不要重新发明轮子,如果你要做的事情看起来是十分常见的,有可能类库中已经有某个类完成了这样的工作,如果确实是这样,就使用现成的。如果还不清楚是否存在这样的类,就去查一查。
    ----当我每次忍不住自己实现一个常见的算法功能时候,我都会
    jiangzhuo
        30
    jiangzhuo  
       2016-12-02 11:46:54 +08:00
    读个在职的相关专业的研究生,抱大腿署名几篇论文,基本就可以摆脱算法弱的形象,然后摇身一变 title 变为 XX 首席科学家了
    xiamx
        31
    xiamx  
       2016-12-02 11:53:54 +08:00
    建议先学英语
    nsxuan
        32
    nsxuan  
       2016-12-02 12:32:56 +08:00
    同非科班,感觉操作系统相关内容更欠缺
    jyf007
        33
    jyf007  
       2016-12-02 13:13:53 +08:00 via Android
    没有好好学,什么都不懂的感觉很遭,只能带逛了。
    TaMud
        34
    TaMud  
       2016-12-02 13:14:49 +08:00
    奥数多做做
    算法是一个脑力工作
    你要有那个基础才行
    flymemory
        35
    flymemory  
       2016-12-02 13:28:50 +08:00   ❤️ 3

    @liyu4 可以借助 grammarly 之类的软件做辅助。
    PS :表示书写能力的时候,应该用名词的 writing , write 是动词。
    skydiver
        36
    skydiver  
       2016-12-02 13:37:42 +08:00
    问排序算法回答冒泡的基本不合格。

    冒泡根本就不是一个实际会拿来用的排序算法,最开始引入也是为了说明 for 循环如何使用。
    owlsec
        37
    owlsec  
       2016-12-02 13:59:01 +08:00
    @flymemory 感谢推荐网站
    linkdesu
        38
    linkdesu  
       2016-12-02 14:10:46 +08:00
    @flymemory 好东西,感谢分享~~
    liyu4
        39
    liyu4  
    OP
       2016-12-02 14:17:07 +08:00
    @flymemory 有心的你还特意把我写的错的东西指出来了。谢谢!
    liyu4
        40
    liyu4  
    OP
       2016-12-02 14:18:04 +08:00
    @TaMud 可能心里还是执拗吧,毕竟从小到达都觉得自己还有些小聪明。可能也是作茧自缚。
    liyu4
        41
    liyu4  
    OP
       2016-12-02 14:18:26 +08:00
    @jyf007 我的感觉跟你一样。
    liyu4
        42
    liyu4  
    OP
       2016-12-02 14:20:59 +08:00
    @skydiver 那还是冬天,确实回答的拙劣,让此时的自己想起来也是尴尬万分。确实是说明 for 是如何使用的,慧眼识珠呢。
    liyu4
        43
    liyu4  
    OP
       2016-12-02 14:22:23 +08:00
    @nsxuan 恩。
    skydiver
        44
    skydiver  
       2016-12-02 14:28:25 +08:00
    @liyu4 慧眼识珠是什么鬼……怎么忽然出现这个成语……
    liyu4
        45
    liyu4  
    OP
       2016-12-02 14:28:54 +08:00
    @flymemory 已经更正过来了,向你学习!
    liyu4
        46
    liyu4  
    OP
       2016-12-02 14:29:26 +08:00
    @skydiver 就是能发现事情本质的能力啊 😄😄
    liyu4
        47
    liyu4  
    OP
       2016-12-02 14:30:03 +08:00
    @skydiver 当然这是夸你的
    lxgeek
        48
    lxgeek  
       2016-12-02 14:31:13 +08:00
    leetcode 写写。
    lixile
        49
    lixile  
       2016-12-02 14:56:45 +08:00
    @liyu4 再快 也要年后了 现在的水平 完全没信心找到工作 看了楼上 我这个英语渣感觉无路可活 英语是全校倒数 无论是高中还是大学
    wcj
        50
    wcj  
       2016-12-02 14:59:12 +08:00
    表 栈 队列 树(二叉树为主,包含二叉平衡树)散列 堆(二叉堆为主) 图(包含 Dijkstra 等经典算法)
    简单排序算法 希尔排序 堆排序 归并排序 快速排序 桶排序
    复杂性分析 分治 动态规划 贪心算法 回溯法 分支限界法
    以上大致是本科计算机学的数据结构和算法
    tyrealgray
        51
    tyrealgray  
       2016-12-02 15:09:13 +08:00
    当初自学 C ++的时候,学完并没有急着开始找工作,又去买了本本科的计算机算法教程,从表学到二叉堆,二叉平衡树,直到红黑树看不明白才停下的。
    otakustay
        52
    otakustay  
       2016-12-02 15:27:51 +08:00
    我是正规路子出来的,算法也特别烂
    liyu4
        53
    liyu4  
    OP
       2016-12-02 15:38:37 +08:00
    @tyrealgray 佩服你的毅力和坚持,这个世界就是因为有你们这样可爱的人,才会变的好一点。
    liyu4
        54
    liyu4  
    OP
       2016-12-02 15:39:09 +08:00
    @otakustay 正规军,不要混到野战部队里来。
    liyu4
        55
    liyu4  
    OP
       2016-12-02 15:39:42 +08:00
    @wcj 总结的很像 算法导论, 看来你学的很扎实,本科的东西还记得呢。
    jyf
        56
    jyf  
       2016-12-02 15:39:50 +08:00
    我是自学的 也确实想跟你一样把所有常用的过一遍 一起努力吧
    liyu4
        57
    liyu4  
    OP
       2016-12-02 15:40:45 +08:00
    @lxgeek 可以考虑,不过我们这些半路的孩子,还是先吧各位同学提到的基础,学好了,再去刷题吧。
    liyu4
        58
    liyu4  
    OP
       2016-12-02 15:42:40 +08:00
    @jyf Follow me 今晚一起学习堆排, 或者你也可以关注我的 github , 我会在上面留下我的联系方式。
    sgissb1
        59
    sgissb1  
       2016-12-02 16:28:16 +08:00
    不知道是大家学的时候被误导,还是被部分书籍误导了。下面是关于“算法”一名词的解释:

    https://en.wikipedia.org/wiki/Algorithm
    http://baike.baidu.com/link?url=VNoc5pXiMd4x6tZNYc4oZcitXLKJCwbrPpfnpBHR2sQW8EkCdNr-GvTlgkjciCQn9pk6j4ck5mu7s7adKq6OZUxkrL-H5gZq15JuVg_ndze

    事实上,关于比较常见的几种排序、树、时间复杂度的衡量方式,以及常见的集中排序、查找的时间复杂度我已经忘的差不多了。最近有两次面试还被人问道,起初还觉得比较惭愧;不过发现后来对方带着有色眼镜在看问题时,我就只能呵呵了。

    “算法”大概可能还是分为两类:
    1. 解决实际工程问题的一种方法或者步骤
    2. 在已有的解决方法或步骤中,寻找一种更有效(性能更好)的方法和步骤

    第一类是解决问题的思路和方法,第二类除了包括解决问题的思路和方法以外,还有一些数学的背景知识,或者一些额外的知识面。


    首先我也不是科班出生,但数据结构也学过,不过当时在校期间也一笔带过(老实带着过,学生自己也不不知道为啥学,所以更加带过。)
    但这不影响解决问题的实际情况,问题就是分两类:工程问题和科学问题。

    工程问题更多强调的是如何寻求解决方案,并一点一点改造成符合实际场景的方案。
    科学问题更多的强调理论知识储备和支撑。

    哥们还是应该客观一点看,就像我一个老师说的一样:“考研这件事其实就是在考大家的英语,对于理工科学生来说,大家其他科目水平一般都差不多”,面试问‘算法’一样,谁能保证答得出来的人招进来后就一定能干活(可能是我身边例子太多了)?

    说这么多,“算法”这玩意要看,我也正在一点点的抽时间去看,但也要注意一些工程问题的解决思路和方法。面试有时就是纸老虎,不必太过纠结。
    JFM0530
        60
    JFM0530  
       2016-12-02 16:34:42 +08:00
    现在用 golang 的人好少呀。。。。
    jyf
        61
    jyf  
       2016-12-02 17:57:07 +08:00
    @liyu4 堆排已经写过了 :D
    liyu4
        62
    liyu4  
    OP
       2016-12-02 18:13:03 +08:00 via iPhone
    @jyf 向你学习
    liyu4
        63
    liyu4  
    OP
       2016-12-02 18:13:19 +08:00 via iPhone
    @JFM0530 是呀,快失业了。
    liyu4
        64
    liyu4  
    OP
       2016-12-02 18:13:44 +08:00 via iPhone
    @sgissb1 你的回答非常中肯。
    DreamCMS
        65
    DreamCMS  
       2016-12-02 18:15:41 +08:00
    先实现及王道也! facebook 早先年的代码,也不是一般垃圾。所以成功者想到做到,我们已经这里浪费了 1 分钟,不说了。
    liyu4
        66
    liyu4  
    OP
       2016-12-02 18:26:40 +08:00 via iPhone
    @DreamCMS 也需要偶尔的放空。
    hitmanx
        67
    hitmanx  
       2016-12-02 18:58:13 +08:00
    这有什么,不要自己吓自己了,这些并不难。我也不是科班出来的,研究生毕业后,找工作前花了几个月在图书馆刷了好多书。每天早上 9 点到下午 6 点,中间没时间吃午饭,回家后再上机写几个小时。

    - 比如算法,从零开始学的,陆续读了<algorithms>(启蒙特别有帮助), July 的编程之法(浅显),剑指 offer ,编程之美,编程珠饥, crack the code interview(部分),重写过大部分常见的各种算法,以及绝大多数剑指 offer 和编程之法里的题。别看书多,很多题是重复的,思路也是可以举一反三的。
    - 比如操作系统,从零开始学的,陆续看了哈工大孙志岗老师的公开课(笔记记了满满一本),清华的公开课(部分),然后看了部分的<Moden OS>, CSAPP 。着重看了日本人那本 30 天自制 OS 和国人写的那本 Orange OS ,完整地从头照着写了一个操作系统内核,后期又往上加了好多 feature ,包括移植了一个游戏模拟器。
    -比如 C++,刷完了 Primer Plus, Accelerated C++, Effective C++(前半本), STL (前半本)
    -比如计算机网络,这个纯粹是面试需要。花了一周刷了国内那本绿封皮的清华大学的教材。
    等等
    holyghost
        68
    holyghost  
       2016-12-02 19:03:21 +08:00
    奥利给,啥都别说,干就得了。
    hdbean
        69
    hdbean  
       2016-12-02 19:21:32 +08:00
    古有八股文,今有 Leecode
    vtoexshan
        70
    vtoexshan  
       2016-12-02 20:13:17 +08:00
    数学门槛高,望之兴叹
    TaMud
        71
    TaMud  
       2016-12-02 20:45:17 +08:00
    没事的
    算法,就是你解决问题的方案,方案有多种,最优的那种,需要很强的大脑思维能力
    社会是讲究分工的
    你可以找个思维能力很强的人一 起工作
    你照样可以一起参与伟大的项目

    找准自已的优点,充分利用自已的优点
    TaMud
        72
    TaMud  
       2016-12-02 20:47:55 +08:00
    多做做奥数题
    对算法的提升会很有帮助
    boyhailong
        73
    boyhailong  
       2016-12-03 10:06:21 +08:00
    什么鬼的野路子 算法不是程序员必须吗?
    aksoft
        74
    aksoft  
       2016-12-03 10:55:41 +08:00
    我的档次好低。。。
    liyu4
        75
    liyu4  
    OP
       2016-12-04 17:20:55 +08:00 via iPhone
    @boyhailong 哥,你说的对,只是借口吧。
    liyu4
        76
    liyu4  
    OP
       2016-12-04 17:21:56 +08:00 via iPhone
    @aksoft 我也在这条线上。
    fhefh
        77
    fhefh  
       2016-12-04 20:44:38 +08:00
    @flymemory 截图发的是哪个网站 嘿嘿
    numberwolf
        78
    numberwolf  
       2016-12-05 00:33:17 +08:00
    @liyu4 如果可以翻译资料的话,我觉得你英语不差,可以独立看懂文档就够了,不需要听这方便太强。
    算法只要肯刷,没什么难的,又不是去写导弹轨迹。
    hd7771
        79
    hd7771  
       2016-12-05 04:26:52 +08:00 via Android
    讲道理,野路子不是应该见到算法题就高兴吗?毕竟可以短时间提高的,并且效果最明显。现在科班出生都不屑与我们这种只会刷题的为伍,呵呵。
    owt5008137
        80
    owt5008137  
       2016-12-05 09:23:13 +08:00 via Android
    每次随机都初始化种子是错误的
    liyu4
        81
    liyu4  
    OP
       2016-12-06 10:07:01 +08:00
    @owt5008137 哥 你是说跳表那里吗?
    liyu4
        82
    liyu4  
    OP
       2016-12-06 10:07:32 +08:00
    @hd7771 恩 7771
    liyu4
        83
    liyu4  
    OP
       2016-12-06 10:08:49 +08:00
    @numberwolf 但是写很差 看的懂和写出来或者听出来差别太多了。感谢大家的指正,这个只能考虑报个班或者好好学习下基础了。
    owt5008137
        84
    owt5008137  
       2016-12-07 01:33:47 +08:00 via Android
    @liyu4 是的,我只瞄了眼跳表
    hd7771
        85
    hd7771  
       2016-12-07 22:59:08 +08:00
    @liyu4 给你推荐一本书,刘汝佳的《算法竞赛入门经典》(《算法导论》废话太多),你买那本薄的,刷完上面的题就能应付找工作的算法了。其实厚的那本合作者还是有点意思,半路出家,有妻儿,最后还是静下心提高算法。
    liyu4
        86
    liyu4  
    OP
       2016-12-09 15:12:18 +08:00
    @owt5008137 恩 我回头看看
    liyu4
        87
    liyu4  
    OP
       2016-12-09 15:12:53 +08:00
    @hd7771 恩,谢谢你的建议!
    sensui7
        88
    sensui7  
       2016-12-09 17:05:23 +08:00
    算法这种东西, 现用现学就好了, 我指的是业务需要的算法, 像排序这种算法, 你确定要自己写, 不用语言内置库函数?人家可能有编译器优化过的。
    至于领域算法, 比如数据分析, 图像识别,这种专业算法跟上述内容是 2 个东西。
    liyu4
        89
    liyu4  
    OP
       2016-12-09 17:49:13 +08:00
    @sensui7 日常开发是会选择内置的函数,拿来就可以用,图像识别的算法我也没有自己写,也是用的别人写好的,自己去写可能要花些时间,数据分析我们有一些自己的实现。

    为什么要学习算法,我个人是感觉自己这方面没有系统的(就当没学过吧)学习过,所以想学习一下 这些基础的东西,可能并不是要自己碰到了就自己要写,这些东西也不会耗费我很多的时间和精力,都是下班在做,目前算法导论看了有三分之一,就当自己的乐趣吧。 还是谢谢你诚恳的意见。
    liyu4
        90
    liyu4  
    OP
       2016-12-09 17:51:35 +08:00
    @sensui7 就比如 redis 的 set 用了跳表, mysql 用了 b+树,我在看这些东西的就会燃起兴趣去了解它,这些原动力很多也是在工作中碰到的。积攒多了,心里就有点不痛快,既然自己不聪明,也不算太笨,总是可以搞懂的,可能就像你说的没有什么太多的意义。但是谁能说人生不就是折腾两个字呢。
    Magic347
        91
    Magic347  
       2016-12-09 18:18:13 +08:00
    算法和数据结构虽说是老生常谈的话题,但是对于哪怕是科班出身的 CS 专业的学生来说,也是需要很长的时间去慢慢消化和品味的。有些特别经典的,甚至值得一辈子去慢慢参透,比如 quick sort ,比如 KMP 算法, etc.
    ghostcir
        92
    ghostcir  
       2016-12-12 22:16:33 +08:00
    我英语也很烂,但是算法这种,个人感觉除了特殊行业,一般都有现成的,但是英语真的很麻烦。。。
    liyu4
        93
    liyu4  
    OP
       2016-12-13 18:20:17 +08:00 via iPhone
    @ghostcir 我英语也不是很好,可以加好友一起分享学习英语的心得。
    liyu4
        94
    liyu4  
    OP
       2016-12-13 18:21:09 +08:00 via iPhone
    @Magic347 有道理。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2938 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 00:09 · PVG 08:09 · LAX 16:09 · JFK 19:09
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.