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

各位帮忙看下我写的算法 blog,各位能读懂么。

  •  
  •   haixiao3156 · 2016-10-04 20:13:09 +08:00 · 4910 次点击
    这是一个创建于 2962 天前的主题,其中的信息可能已经有所发展或是发生改变。

    本人本科 985 毕业几年了,专业非 CS 但是相关专业,今年 6 月份练车之余突然对编程有兴趣了,国庆这几天在看 Algorithms 4th ,本人英文还过的去,书直接是看的是英文原版(我编程书都是英文因为中文的书和资料我实在看不懂,翻译拗口逻辑不通,英文虽然厚但是看起来很简单),视频直接在 YouTube 上看普林斯顿老教授的课。因为本科不是 CS 所以我的英文翻译过来怕别人读不明白,还有我写的语句和排版别人是否能看懂,所以请你们帮忙看下我写的各位能读懂么。下面是两篇的链接。

    时间复杂度 Big O notation,并查集 Union-find

    47 条回复    2016-10-09 13:42:16 +08:00
    Mirana
        1
    Mirana  
       2016-10-04 20:34:20 +08:00
    太矫情,有些中文书翻译的还可以的
    yidinghe
        2
    yidinghe  
       2016-10-04 21:08:39 +08:00 via Android   ❤️ 2
    稍显罗嗦哦,比如 N+1 次我大概会这样解释

    “ i 初始值为 0 ,首次循环就会与 N 比较一次,以后每次加一都会再与 N 比较一次;最后一次比较时 i=N (然后就跳出循环了),所以一共比较了 N+1 次。当 N 为 0 时也至少会比较一次,同样是 N+1 。”
    livc
        3
    livc  
       2016-10-04 21:17:40 +08:00
    并查集不就找爸爸么
    haixiao3156
        4
    haixiao3156  
    OP
       2016-10-04 22:37:37 +08:00
    @Mirana 这我觉得不对,不知道你说的哪本书翻译的好,我是觉得《算法》和《算法导论》都翻译的稀烂,我虽然英语不算好,但看这本书我需要查的单词也不算多而且大部分是给我中文我也不懂其意思类似拓扑这种词。我感觉整个计算机的世界观就是建立在英语之上,这就和看动漫要用日语读唐诗要用粤语才能领略它们的真谛,用 The story of stone 来研究红楼梦一辈子也研究不出来红学,除非用英语看不懂听不懂才会这么想,用原版才是最吼滴。
    haixiao3156
        5
    haixiao3156  
    OP
       2016-10-04 22:41:08 +08:00
    @yidinghe 我就是想问这些,我自己能看明白但是怕看的人看不懂,怕表达不出来,可能是还没理解透彻。
    haixiao3156
        6
    haixiao3156  
    OP
       2016-10-04 22:48:30 +08:00
    @livc 这么写书和 blog 我觉得 MIT 的学生都理解不了。我现在告诉你平行线是相交的不告诉你为什么你肯定以为我疯了,但我认真的告诉你这真的是对的(^-^)!
    yidinghe
        7
    yidinghe  
       2016-10-04 22:50:04 +08:00 via Android
    @haixiao3156 表达是关乎别人如何理解,所谓“表达不好是因为理解不透彻”是纯粹装逼的说法,不可信。
    haixiao3156
        8
    haixiao3156  
    OP
       2016-10-04 22:59:08 +08:00
    @yidinghe Bingo
    lightening
        9
    lightening  
       2016-10-05 01:14:32 +08:00
    @yidinghe 术语一直看中文的话到了 GitHub 上没法和人交流……
    Xs0ul
        10
    Xs0ul  
       2016-10-05 01:48:03 +08:00   ❤️ 1
    1. Example : 1-Sum 里,看起来是 C\C++? 为啥没有大括号。。也没有缩进。

    2. O(f(n) 漏了个后括号?

    3. "而当一个算法大于等于 2n 时就比较蠢了", 至少写成 2^n 吧。

    感觉有不少笔误需要修正一下。
    Lxxyx
        11
    Lxxyx  
       2016-10-05 01:54:06 +08:00 via Android
    @yidinghe 简单易懂……解决了我之前看简单 for 循环时,不理解为什么时间复杂度是 n+1 而不是 n 的问题。
    skydiver
        12
    skydiver  
       2016-10-05 02:37:44 +08:00
    1. 既然看的资料都是英文的,为什么笔记不直接用英文写
    2. 你不小心把.DS_Store 也提交进来了
    skydiver
        13
    skydiver  
       2016-10-05 02:41:45 +08:00
    @haixiao3156 「读唐诗用粤语」抱歉,唐朝人不说粤语。关于粤语是不是更接近古代发音这个问题已经月经了,自己百度一下吧
    bkjzs
        14
    bkjzs  
       2016-10-05 03:00:18 +08:00 via Android
    orz ,请问能不能讲一讲 asymptotic running time ,就大 O 、小 o 、还有ω、θ那些。今天上课讲这些没听懂==
    haixiao3156
        15
    haixiao3156  
    OP
       2016-10-05 09:40:53 +08:00
    @Xs0ul 我改了一下谢谢
    haixiao3156
        16
    haixiao3156  
    OP
       2016-10-05 09:42:32 +08:00
    @Lxxyx 能看懂就好,那我就不改了,
    haixiao3156
        17
    haixiao3156  
    OP
       2016-10-05 09:53:53 +08:00
    @bkjzs 刚起床还没看这部分,待会看一下书估计晚上能写出来,我看了一眼 wiki 小 o 这不就是高阶无穷小么- -, f(x)/g(x) x 趋近于一个数时, f(x)/g(x)等于零,说明 f(x)是 g(x)的高阶无穷小,计作 f(x)=o(g(x)),是这样吧!如果是,你应该上的不是 cs ,应该去复习下高数了😓 ,推荐我们学校自编的高数课本,哈哈!
    haixiao3156
        18
    haixiao3156  
    OP
       2016-10-05 10:00:53 +08:00
    @skydiver 主要想记录下笔记,我上学的时候看书从来不记笔记,我看比我学习好的也没几个人记,反倒是一大堆人笔记能拿出去当参考资料卖了,考试却不咋滴。而且想找份工作啊,起码 hr 能看懂么,再说了母语,写东西第一天性都是母语吧。对了楼主没工作,看了 4 个月会点写 swift 和 java 吧,最近在看 python ,一款 app 上线一款聊天 app (类似微信)在审核,你们各位感觉距离在北京能找到份实习的 iOS 工作还多远距离。
    bkjzs
        19
    bkjzs  
       2016-10-05 10:02:35 +08:00 via Android
    @haixiao3156 跪,我上的就是 CS 。教授从 efficiency 谈到的小 o ,然而我课上这些定义并没有听懂,要死了
    starvedcat
        20
    starvedcat  
       2016-10-05 10:11:41 +08:00
    英文冒号后面要加空格,中英文冒号不要混用
    deeporist
        21
    deeporist  
       2016-10-05 11:50:50 +08:00
    我就连高数都不想看中文的怎么办(我要死.jpg) 同济的书 例题和习题就是 2 个世界 例题 1+1=2 习题哥德巴赫猜想
    我是看了《从牛顿到勒贝格》和 wiki 的高等数学才明白通彻的 再回头看同济 7 版 简直看不下去
    haixiao3156
        22
    haixiao3156  
    OP
       2016-10-05 11:58:06 +08:00
    @bkjzs 我刚刚看了算法,这本书上没有这部分,我又去 YouTube 上看了 MIT 算法导论的公开课,忍受了一个印度口音叨叨半小时,我只弄懂了小 o 和θ,还终于弄明白了为什么在 java 中 variable declaration =2 但我没看到有ω,不知道你看的哪本书,我只有 algorithm 4th 的实体书,没有算法导论的实体,你可以发一份你的书给我看一下。
    小 o 就是高数里面的定义,比如 g(n) = (1/2) n^2+( 1/2 ),f(n)=n^2 , g/f=1/2,你可以计作大 O(n^2),而小 o 则一定要是高阶无穷小, f(n)=n^3 就是 g/f=0,计作小 o(n^3),你可以理解为用大 O 的时候 g/f 可以是等于 0 或者等于 C ,但小 o 一定要等于 0,至于θ就是 f 严格等于 g , f(n)等于(1/2) n^2+( 1/2 ),而大 O 只需要 f(n)=n^2 ,你可以计作用θ时候 g/f 一定要等于 1 。
    PS :楼主非 CS 专业,编程最近才开始看,不过自认为对自己感兴趣的事情理解能力比较强,如果解释的不对,下面的人一定要告诉我,别误导别人,待会我会更新一下大 O 的文章。
    haixiao3156
        23
    haixiao3156  
    OP
       2016-10-05 12:03:42 +08:00
    @deeporist 我感觉中国的教科书都是跟苏联学的哪一套,书特别薄,字字珠玑,但不告诉你怎么来的,上来就一堆公式证明。国外的书厚的能当凶器,但是从这个问题的起源到现在的应用都给你写了进去没准还来点发现人的八卦,很有趣味性,但是很啰嗦,像我这种注意力不专注的人就喜欢看国外跟小说一样的教科书,但学霸到哪里什么书都没问题。
    不喜欢同济推荐看下我们学校的高数书,因为我很喜欢那个遍书的老师,私信我告诉你,哈哈。
    haixiao3156
        24
    haixiao3156  
    OP
       2016-10-05 12:44:42 +08:00
    没有给我找工作提个意见的么。。。。我想求份北京或者沈阳的 iOS 开发实习工作,我有 demo 的,而且上架 app store 了。要求就是能学到东西,工资就以不用搭钱上班为准,公司最好有 VPN 和台式电脑用,笔记本用的蛋疼。
    zzNucker
        25
    zzNucker  
       2016-10-05 12:45:48 +08:00
    读唐诗要粤语才能读懂我拒绝同意。
    yangff
        26
    yangff  
       2016-10-05 12:53:45 +08:00
    没有复杂度分析是怎么写出这么长的……

    不做复杂度分析的话, disjoint set 的思想很简单啊,
    1. A 和 B 在一棵树上,则 AB 在一个集合里
    2. 合并两个集合就是合并两棵树
    3. 充分利用复杂度,降低之后操作的复杂度。具体来说就是按秩合并和路径压缩(每次操作把访问到的节点提升到根)
    4. 观察 1 、 2 、 3 之后,发现我们只需要记录每个点的父亲就行了,因为不会有访问孩子的需求

    然后代码就很自然的是那样了。
    skydiver
        27
    skydiver  
       2016-10-05 14:13:56 +08:00 via iPad
    @haixiao3156 V2EX 什么时候有私信了。。。
    haixiao3156
        28
    haixiao3156  
    OP
       2016-10-05 15:48:28 +08:00
    @skydiver 不好意思我刚注册,不了解哦,唐诗那个就算了。
    haixiao3156
        29
    haixiao3156  
    OP
       2016-10-05 15:51:33 +08:00
    @yangff 就按视频的思路写的啊。
    moyang
        30
    moyang  
       2016-10-05 16:02:53 +08:00 via Android
    不知道中文算法书翻译的是不是不好,但是用 cs 术语用英文来理解来交流是完全可行的。反之,如果一个人所有 cs 术语都只知道中文译名不知道原文,那才是问题
    GentleSadness
        31
    GentleSadness  
       2016-10-05 16:54:57 +08:00 via Android
    就是因为有你这种又菜又以为自己牛逼的人才会增加老子的工作量

    说真的,真牛逼,发论文去,一篇真正有效加快排序与查找的论文,学位,工作,要啥有啥
    haixiao3156
        32
    haixiao3156  
    OP
       2016-10-05 17:24:46 +08:00
    @GentleSadness 素质可以啊,喷人不费电啊,不过无所谓,有的人能看懂就行,喷人能让你生活的更开心就好。
    haixiao3156
        33
    haixiao3156  
    OP
       2016-10-05 17:35:10 +08:00
    看到别人能看懂我写的就好,帖子也不再回复了,倒不是因为楼上的回复,我就是想了解一下别人能否读懂,因为我从小就没记笔记这个习惯。算法的东西会慢慢更新,总觉得能理解算法是一步,能自己写出来是一步,可以做题是一步,以后伪代码和题也会更新,争取 2 年内弄完这个工程,我出去吃火锅了, Have a nice night , 88 。
    Aspx
        34
    Aspx  
       2016-10-05 18:48:42 +08:00
    @haixiao3156 平行线不相交是基于欧几里德的定论,如果不适用欧的定论,平行线就可以相交嘛。纯属猜测,不知对不对,求解答
    wenxw1997
        35
    wenxw1997  
       2016-10-05 20:26:06 +08:00
    @Aspx 搜索一下平行公设就知道了。
    欧氏几何:给定一条直线,通过此直线外的任何一点,有且只有一条直线与之平行。
    罗氏几何(双曲几何):给定一条直线,通过此直线外的任何一点,可以引至少两条平行线。
    黎曼几何(椭圆几何):给定一条直线,通过此直线外的任何一点,一条平行线也不能引。
    后两者通称非欧几何。

    这里的平行是指两直线不会相交。
    直接去掉平行公设则可以得到更一般的几何。

    我个人认为这个知识对非数学专业的人来说基本算是数学的一个通识吧,当兴趣了解一下就好。如果没有严格的数学逻辑思维本来就很难发现平行公设的问题。其实虽然楼主用这个举例,但我还是很怀疑楼主对这个能有多少了解……事实上,楼主连平行的定义都没有给出……所以我并不能看懂平行线会相交指的是什么,感觉楼主只是知道一点科普知识就来炫耀了(只是感觉,如果冒犯了不好意思)……但我并不认为这种问题也会普遍出现在国内教材中……

    看了楼主的博客,很好奇楼主是认为口语化的语言可读性更强吗……我觉得逻辑清晰才是最要紧的。感觉楼主也有些自以为是的地方。比如 log ,我们学数学分析时默认就是以 e 为底(因为其他底基本没怎么用),而计算机领域一般默认以 2 为底,以 10 为底在其他领域计算则对判断大小很有帮助,只能说不同的领域有不同的简写习惯(反正我认为高中教学教以 10 为底是最好的)。看了 wiki 才知道 lg()一般就是指以 10 为底的。楼主居然是用国内和国外来区分……

    还有这句: O(f(n)):这是一个解析数学中的概念,你只要记住最后求出复杂度用 O(f(n)( big O notation ),其中的 f(n)就为其复杂度上界。
    解析数学是什么?国内一般也没有这样的叫法,你指的是数学分析吗?

    还有,感觉楼主有可能为了避免和国内译法雷同,特意生造了一些翻译……

    相信楼主发出这个帖也是为了让大家把你批判一番,我虽然目前还只是个非 CS 专业的本科生,但真心不认同楼主对原作 /译作,国内教材 /国外教材的看法。准确度什么的,其实很多教材都做得相当好了(有一点输入的错误在所难免),读中文书我觉得对于不常用英语的人来说是比较高效的做法,你应该批判的是那些写了一些垃圾来骗钱骗关注的作者(也希望楼主不要制造这种垃圾,就像 @GentleSadness 说的,增加了读者的工作量)。我觉得对一般人来说英语好到能看懂一个具体问题的解释就可以了,没有用英语进行日常阅读。

    当然了,我说的也有点多,所以上述内容也可能因为我见识比较浅而错漏百出……
    yangff
        36
    yangff  
       2016-10-05 20:32:44 +08:00
    @haixiao3156 苏联的书…… 书架上躺灰的三本《微积分学教程》不服
    GentleSadness
        37
    GentleSadness  
       2016-10-05 20:52:27 +08:00
    @wenxw1997 怎么说呢,对于一个自以为是菜鸡,你这么认真不太好

    然后因为看到你这么认真,我就看了几眼楼主写的东西

    前面那个居然是翻译关于时间复杂度的符号含义

    很醉,一个本科生,居然以为自己被那些教授级人物牛逼

    勉强看到:为什么将 int count = 0 这一语句算成 2 frequency,这是因为和 java 的底层 reference

    这句,说真的, CS 专业基本都学过 C ,然后真有认真学过的,基本都会一点底层

    关于 java 的引用, 王垠的博客是这样说的: http://www.yinwang.org/blog-cn/2016/06/08/java-value-type

    说真的,写这些东西来吹,只能说楼主,妈的智障

    要扯,本科就去扯,编译器,服务器,操作系统,我记得第四个好像是文本编辑器?
    GentleSadness
        38
    GentleSadness  
       2016-10-05 20:54:18 +08:00
    喷人不费电啊

    废话,喷人要用脑力还不如去搞其他事

    上面那堆东西,都是以前学的,现在用来喷你,不用花一点时间来查资料
    ryd994
        39
    ryd994  
       2016-10-05 20:58:00 +08:00 via Android
    自己记笔记还共享出来自然是好的
    但是实际上还是直接看书更快,所以上面才有人说这是垃圾
    说句不好听的,鹦鹉学舌复述一遍,以为别人不会看书么?

    而且算法这个,更多的是一种思路,见多了很快就有感觉的,什么情况用什么,就算不是最优解,大体上不会错。有点灵性的人,看到一小段就大致有数了,后面随便一点就通。

    说学算法入门难的,基本是自己写程序从来不过脑子,只以能跑通为目标。认真写程序的,总是会想有没有更好的写法,最后证明没有。又或者看到别人的解,会拍手称妙。

    举个例子,判断某数是不是 2 的整数次方,最直接的想法就是 log ,其次是连除,其次是移位取余。然而网上搜一搜,其实用位逻辑就行。
    ryd994
        40
    ryd994  
       2016-10-05 21:03:47 +08:00 via Android
    刚好看到楼上说到 2 frequency
    我看到这段只觉得很扯,就像茴字有四种写法一样
    从算法而言, 1 和 2 根本没有区别,因为都是 O(1)
    haixiao3156
        41
    haixiao3156  
    OP
       2016-10-05 21:51:45 +08:00
    @GentleSadness @wenxw1997 哦去吃火锅了,我 gg 了,你们强无敌,比我以前在 VS 1 房遇到的喷子不知道高到哪里去,关于翻译吧,我就是 google 一下那个词,我就写,你可以说我心机婊我还挺喜欢的,我老婆都说我没心眼。我不会终结帖子,这我第一个在这论坛发的帖子,也是最后一个,算法这东西我会一直更新,刚刚回来还写了个三个元素和的二分查找。顺便说句我的以前工作跟编程无关,我这人只是对自己喜欢的东西感兴趣而已,我去年还为了个考试还看了流体力学,理论力学,有机化学,材料力学,工程经济。我上学的时候就没集中力,学习也一般,出国考研也懒,可能是因为家里人是大学教授的关系,讨厌学习,只喜欢干自己的事。我本科不是 CS ,我 6 月份开始要练车还有个百天的孩子要管,我看编程时间很短,你们说的好多我都不懂,这只是我的一个最近的兴趣,不好意思侮辱你们的生活工具了,不过这东西还挺有意思,你们喷的开心就好。 @GentleSadness 看了你以前的帖子感觉你百分之八十在喷别人,戾气好重,愿你生活的更阳光点,哈哈 God bless you 。
    GG :技不如人,甘拜下风!
    有事的 gayhub 上留言交友,欢迎你们继续喷,这个论坛 GG 思密达
    ryd994
        42
    ryd994  
       2016-10-06 10:52:13 +08:00 via Android
    @haixiao3156 我本科 major materials engineering, double degree in computer science, minor in economics. 不懂你有啥可以委屈的。也不懂一个算法入门有啥难的。更复杂更精妙的算法多了去了。
    Mirana
        43
    Mirana  
       2016-10-06 13:46:04 +08:00
    楼主上来就给出了这么一句话:'我编程书都是英文因为中文的书和资料我实在看不懂,翻译拗口逻辑不通,英文虽然厚但是看起来很简单',直接把积累多少年的翻译资料全给否定了,口气之大可见一斑。

    大概楼主意思就是我是新手,刚看英文资料,翻译出了一篇文章,你们以前看的中文都是垃圾,快来跪舔我。

    楼主是初学者,大家指出了你的文章的一些问题,你反而觉得别人是在喷你,明显没有把自己放在一个初学者的位置上。

    后来你又说家人是大学教授,有老婆还有孩子什么的,出身高贵,大概跟你们这些贫民不是在一个等级上。

    像楼主这种人,智商不知道有多高,情商这么低,目中无人,在网上混不下去,估计现实生活中也比较失败。
    helihuo
        44
    helihuo  
       2016-10-06 16:01:20 +08:00
    其实楼主的核心意思是:“大家快点表扬我,如果你不表扬我,我就骂你!”
    q397064399
        45
    q397064399  
       2016-10-06 17:31:11 +08:00
    一个 Java Util 打楼主的脸
    q397064399
        46
    q397064399  
       2016-10-06 19:31:52 +08:00
    你实现的这些算法其实老没意义了(我承认知晓原理 能在解决一些问题上,站在更底层的位置上思考问题) ,但是各大标准库都有标准的实现,工作中有需要就直接调用轮子就是了,
    一个 Java Util 库里面打你脸,无论是接口实现 还是 代码复用,

    @GentleSadness
    另外快排已经被证明是最快的排序查找了, nlogn 是极限,当然根据不同的场景,还是有优化的地方
    woostundy
        47
    woostundy  
       2016-10-09 13:42:16 +08:00
    上来就是各位能读懂吗 [dog]
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5647 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 03:33 · PVG 11:33 · LAX 19:33 · JFK 22:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.