由快速排序引申而来--如何学习算法.docVIP

由快速排序引申而来--如何学习算法.doc

  1. 1、本文档共3页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
由快速排序引申而来--如何学习算法

由快速排序引申而来--如何学习算法 大部分人都知道,其实我们一般都不需要去学什么算法。除非是,要么是学生(立志参加ACM),或者做纯粹算法研究的专业人员,再者要么是为了进一些大公司而准备面试,要么是纯兴趣使然。真正因为参加工作要用很多算法的人实在是少之又少。当然,或许做图像处理或者数据处理,数据挖掘,再或者,有关搜索引擎等等之类的东西(恕我才识浅陋,从这篇文章看各自相关算法的应用领域:当今世界最为经典的十大算法--投票进行时,亦可窥知一二)。我甚至认为,绝大部分的人是肯定掌握了一些跟数据结构有关的基本算法的,所以,总而言之,我始终相信,一个人,尤其是学生,实在是没有必要花太多精力在算法相关上的。 但有两个朋友关于快速排序的理解,让我对此前的观点--认为不需要多学算法,稍稍产生了怀疑。 在7月初找工作的时候,一位朋友(以前做过面试官)跟我聊天时谈到,刚毕业的学生当中,十个人有九个人不能把快速排序写出来。我当时就震惊了。因为,我不信。我无法理解一个如此基础而重要的简单的快速排序竟有那么多的人写不出来。总共才二十多来行代码阿。于是,我想试试自己的临场发挥能力。便当即把快速排序写了出来(不过,到底还是有一些细节性的错误,后来又修改了一次)。这是其一。 昨晚认识了两个在广东的朋友,他们于第二天将到我现在这家公司实习。其中一位朋友谈到他在公司面试的时候,面试官问他快速排序的时间复杂度和空间复杂度时,他说他完全懵了,此前根本就没有这个意识,不知道。我当即告诉他,说快速排序的时间复杂度平均为O(N*logN),最坏为O(N^2),空间复杂度由于是由数组存储,所以,当然是O(N)。我对他说,你拿一张纸和一支笔,在五分钟之内,我能当场把快速排序准确无误的写出来。朋友连称厉害。我当时明白了两点:1、的确有人对快速排序不够理解,写不出快速排序,甚至连最基本的了解都没有;2、很多人称我厉害,原来我只是知道一些他们不知道的但同时又够简单的基础算法。 自从我开始写经典算法研究系列之后,便有很多很多的朋友叫我写一篇如何学习算法的文章,或者谈谈算法学习方面的心得与体会。本来之前是因为一来算法这个东西在实际工作中应用不多(就像上面提到的快速排序算法,标准库里一个sort直接搞定,根本不再需要你去写十几行的代码,既如此,又何必重复造轮子)。二来是我个人觉得,学习这种事情你学就对了,只要你有兴趣,便什么问题都能解决。应该不用像一些“大家”,“专家”那样扯起长篇大论。但现在,情况已经不同了(我特别讨厌那些在我面前装的人。说什么自己算法很牛逼,或者自以为是,或说一个搞算法研究的人可以去做图书编辑,搞笑)。 关于如何学习算法,下面,个人简略谈三点(大方之家见谅): 兴趣。学好任何一个东西,首先便必须得具备兴趣。算法也不例外。如果你对算法实在没有兴趣,劝你别因此浪费时间。 态度,重试程度。如果你觉得因为算法在实际工作中应用不多,或者标准库里都封装了一切。或者认为,最基本的快速排序都不必去了解,那么此文可以一扫而过了。 实践。看书,如数据结构方面的教材,一定要把各种最基本的数据结构,如数组,字符串,栈,堆,队列,树,图弄得通通透透(其实,看我之前整理的微软面试100题,也有很大帮助,因为那些面试题大多都跟数据结构和算法相关的,而我也是这么做过来的)。然后可以读编程珠玑,算法导论(很多人都说算法导论看不懂,实则是其上面的很多数学证明,我也不是很懂。具体可多在纸上画画,如红黑树的相关操作及代码),再加上推敲--反复思考,反复研究,最后实践--结合实际应用,编码实现(写代码实现一个算法比研透一个算法更有用)。仅以上,无它也。 很多朋友还问到,我是怎么学习算法,或者说学习过程是怎样的,我是这样子学的:从去年12月开始接触算法起(写第一篇算法文章,A*搜寻算法),我先是因为要写有关算法的文章,所以很多的时候都要去参考资料,包括书籍和网上的,特别注重把一个算法真正阐述清楚,而要阐述清楚的话,那么我自己本身就得先把那个算法真正弄懂弄透,即只有自己懂了,我才可以讲明白。然后是我一直在做那有关微软等公司的面试题(大部都涉及到数据结构和算法),然后,再与他人多多交流,最后,在反复推敲和思考某一个算法之后,我便开始编写代码实现某个算法了。这就是我学算法的学习过程。 ok,闲不多扯,接下来,咱们来具体看看快速排序算法的实现。如下图所示,是前两天在公司练习的快速排序,诸位可以参考下: 个人认为,完整写出这个快速排序还是不难的,不过要注意很多细节问题,如: 我们知道,快速排序的分治partition过程有两种方法,一种是上面所述的两个指针索引一前一后逐步向后扫描的方法(算法导论上采用的是这种方法),还有一种方法是两个指针从首位向中间扫描的方法(大多数的人和一般的教材采用的是这第二种首尾向中间扫描法)。

文档评论(0)

peain + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档