作者:empty 页数:419 出版社:empty |
致谢数据结构和算法在计算机科学里,有非常重要的地位。此系列文章尝试使用Go lang编程语言来实现各种数据结构和算法, 并且适当进行算法分析。
心灵一问:在面试中,你是否对面试官喋喋不休,反复问你关于快速排序,红黑树的各种细节问题而感到无奈,在工作多年后,已经在工程实践中岁月蹉瓦的你,想重拾数据结构和算法的回忆,不妨读读这本书。盛年不重来,一日难再晨,及时当勉励,岁月不待人简单总结:此书作者将通过几个简单的章节教大家入门Go lang编程语言,然后开始介绍计算机科学基本的方法论,如分治法,递归和算法复杂度,紧接着从基本数据结构开始,慢慢介绍到排序和查找算法。
前言数据结构和算法在计算机科学里,有非常重要的地位。此系列文章尝试使用Go lang编程语言来实现各种数据结构和算法,并且适当进行算法分析,系列文章首发于:(ar原始文档托管) Git hub代码仓库:https://github.com/hunterhug/goa.c.一直保持最新) Doc sify风格的网站:https://goa.lenggirl.com。目前有部分网站,未经许可分发了此系列内容,存在更新延后的风险,之前存在部分的笔误,都已经更正了,请以此网站为准!
学而不思则罔,思而不学则殆。意思是说,学习之后如果不做自己的思考,那么会很迷罔,没有收获,成为一个工具人,但是如果你天天思考,而不学习,那么你就会很疑惑,因为你不知道你是对的还是错的,你需要去向其他人学习,去吸收其他人已经留存的知识。学习离不开思考,思考也不能脱离学习,二者相辅相成,缺一不可,这是学习的最基本方法。一起参与如何建议和贡献自己的知识库,可以前往https://github.com/hunterhug/goa.c的仓库提PR和建议。开源书籍的评论使用的是Git Talk, 可以打开https://goa.lenggirl.com阅读后评论自己的心得。章节代码所有章节的代码可以在Git hub仓库根目录下的https://github.com/hunterhug/goa.c/tree/master/code文件夹中找到。
前言读大学前,并不知道是什么是计算机科学,只知道电脑很神奇,可以打游戏,可以看视频。那时候的手机还是翻盖式的诺基亚,没有现在的触屏,拿着塞班系统的诺基亚,登录短信版的QQ读大学后才知道计算机是什么,是一个可以运算的机器,你写了指令告诉它,它就会执行,具体底层怎么实现仍然不知道。后来学了计算机组成,操作系统,编程语言,计算机网络,计算理论,编译原理,才知道原来是那么的朴素。走入社会后,大学学的很多东西都融合进了日常的工作开发中。但是看到很多从其他专业转入,或者中途入门的其他同事们,他们对计算机基础知识如此苍白,导致写出的代码可维护性,可读性,可用性受到极大的影响为了自己能够温故而知新,也为了方便其他非科班的朋友们,可以了解这些朴素的计算机知识。所以写了这一本和编程有很大关系的书:数据结构与算法(Go lang实现) 。毕竟,编程是写代码,而代码与数据结构和算法,关系最密切。大家都知道,计算机编程语言没有好坏之分。最好的接近计算机底层本质的高级语言仍然是C语言,但是它太难学,有许多头文件,编译环境也经常出问题,对于刚入门的人实在不算太好的语言。同时Java语言太重,学习时间太长,概念太多,太抽象。而Python和PHP脚本语言又过份自由。Go lang语言很接近c语言,语法相对简单,历史包袱也比较轻。所以,我会用Go lang语言来实现数据结构和算法。在后面的章节中,我将会用精简的语言来描述相关的知识,尽可能让没有计算机基础的人也可以看懂。
Go lang语言语法简单, 支持多平台交叉编译(Linux/Mac/Windows) , 支持内存自动GC(垃圾回收),支持嵌C开发,并且实现了语法层面的线程调度,开发多线程程序十分方便。语法很像C/Python/JavaScript等高级编程语言。设计这门语言的设计者有以下几位:1.Ken Thompson:在贝尔实验室与Dennis M.Ritch e发明了c语言和Unix操作系统, 与Rob Pik发明了UTF-8编码,图灵奖得主。2.Rob Pike:也参与开发了Unix操作系统,UTF-8编码发明者之一。3.Robert Griese mer:参与过开发了unx操作系引擎和JIvaV 8 JavaScriptJava HotSpot虚拟机的研发。前两位比较知名,现在都已经退休了,其他人有兴趣可以谷歌一下,
二、安装并简单使用安装Golang:https://golang.org/dl:Windows操作系统点击msi按提示安装, Mac操作系统可以使用brew install go lang安装。打开命令行终端输入:1.go version显示以下结果即为成功:1.go version go 1.13 darwin/amd 64在任一文件夹下新建一个文件main.go(Go lang语言编写的程序文件后缀必须都为
2021年补充, 写这篇文章已经过了两年, 看起来那个时候有点年轻, 主要吹捧Go lang的, 但后面的预言成真了,真的越来越多的公司用了,就业者也多起来了。但是,我强调一下,服务端开发工作语言不是问题的本质,你要全都会!哪里需要哪里学,重点还是在于广度和深度的技术积累。用Java还是Go lang开发,还是其他语言?针对服务端开发工程师(后台开发)。持有一种观点:选择哪种计算机语言,在普通人的世界里,其实就是选择哪种谋生的技能和工具。虽然语言的本质并不同,但每次选择都有机会成本,就像你选择开四轮,六轮,还是八轮的汽车,都有一个熟悉和填坑的程,所以,有必要在职业生涯的前期选择一个可持久的工具,它足够地持久,不会被社会给边缘或淘汰。
我为什么不继续把Java作为主力语言我曾经做过一段时间的Java开发, 而在做Java开发前我做过一段时间的PHP。以前互联网应用不是很多,很多都是小型软件或者用户数不多的系统,比如一个面向业务的系统,一般不超过100人使用,这个时候都是单体架构,举个例子:2012年-2014年左右, 很多做ERP和CRM的外包公司或传统IT公司, 他们面对企业用户, 这个时候一般都是PHP或Java开发。我们只讲Java, 这时候叫Java EE企业级开发, 那时刚从servlet/jsp解放到struts/spring/hibernate, 程序员的生产力提高, 一般都是复制粘贴使用框架做报表系统。我们大多数的时间都是在写前端js代码, Java功底其实要求井不高, 因为很多企业已经自己积累了自己的框架,比如A公司有个A框架,B公司有个B框架,从一个公司到另一个公司,就要学习另一个框架,当然学习后就又是复制粘贴,员工可替代性特别强。这个时候,程序员朋友遇到什么问题呢,整个系统是一个单体架构, 使用maven管理有一堆的模块, 启动一个系统, 时常编译半小时以上, 巨卡无比, 而且Java使用注解开发Web, 而很多组件又经常升级, 这个时候有什么问题呢, 不敢轻易升级组件, 因为升级后公司的框架就用不了了,程序员朋友遇到问题了,只能靠猜,因为百度到的注解已经是过时了,老技术的文档已经缺失或者不再维护。而系统开发后,部署也是很粗暴的,直接数据库和应用程序都部署在一台机器,可满足几百个人的使用,政府机关或学校,比如选课系统一旦人多起来,就巨卡无比,这就是单体的缺点,但优点就是省运维,毕竟不要求高并发。这个时候有大批的PHP, Java培训班, 大把低等程序员培训后涌入市场, 成为CURD复制粘贴机器人,而这时, 前端发展也是J quey+div一把梭, 就业形势大好, 一片红海。人才的要求相比现在, 十分的低,很多人也赚了自己的第一桶金。2015-至今互联网发展迅速,很多做传统IT的人发现跟不上并发量了,所以从单体架构开始拆,拆成不同的系统,系统间互相通信。因为技术发展很快, 市面上出现了Spring框架, 写得特别好, 生态特别好, 大家发现自己不用造轮子了,高兴的用起来,但仍然有些公司还是在用老框架,他们缺乏跟进。后来微服务盛行, 而阿里巴巴作为Java最多的使用者, 内部孵化了Dubbo, 大家就又跟上了, 这个时候有很多软件工程方法轮出来了, 一开始SO A, 也就是面向服务的体系, 把系统拆成一个个服务, 然后服务间互相调用, 后来换了一个词, 叫微服务, 这时框架生态高速发展, sping Cloud出来了, 养活了一堆程序员, 不再需要从一个公司到另外一个公司要学新框架, 你只要学会Sping Cloud, 就可以找到工作!技术的变革, 导致了新的问题, Java人才的分化很严重。因为框架Spring Cloud的大统一, 一部分人对该框架不需要多了解,就可以开始干活,类似于堆代码,对后期维护十分不利,因为框架太大,参考手册初学者很快就可以写出一个Web系统, 但是缺乏细节或者计算机理论的理解, 同样需要一遍又一遍面向百度编程。但是, 对于人才来说, Java是一门成熟生态蓬勃大语言, 只要努力专研, 就可以去阿里巴巴那样的公司, 阿里巴巴的成功证明了Java是一门好语言。可以选择Java, 前提是招到好人才, 而好人才都在阿里系。目前杭州估计是对Java程序员需求最多的城市。Java生态大, 导致了入门难度高, 精通难, 而且编译运维部署都需要专业的学习,招到好的人才可以说很难。我为什么选择Go lang来工作因为我做的是服务端开发, 所以一直在微服务, 中间件的场景来回地折腾。对于高性能场景来说, Java已经不能满足了,要上C++。分析一下Java, Go lang和微服务:Java是一门生态完善的语言, 从业者多, 而且历史悠久, 目前稳稳地在原地不动。Go lang目前生态正在完善,已经达到高潮,愈演愈烈。微服务本身是不受语言限制的, 你可以使用Java, Python, Go lang开发不同的服务, 然后服务和服务直接互相调用。有些服务是业务型服务, 对性能要求低, 所以可以用Java/Python写, 但有些对性能高的服务都用c/C++写,尤其是大公司产品里面,从上至下分为业务服务,中间件服务,基础底层服务。