精华内容
下载资源
问答
  • 大数据行业前景看好,有很多朋友对大数据行业心向往之,却苦于不知道该如何下手,或者说学习大数据不知道应该什么书。作为一个零基础学习大数据,成为一名大数据工程师,我们应该该哪些书? 在互联网公司广泛...

    大数据行业前景看好,有很多朋友对大数据行业心向往之,却苦于不知道该如何下手,或者说学习大数据不知道应该看些什么书。作为一个零基础学习大数据,成为一名大数据工程师,我们应该该看哪些书?

    在互联网公司广泛招聘,偏平台业务方向,ETL和OLTP等,主要是基于Hadoop技术栈来处理大数据,算法要求不是特别高。

    经典图书推荐:

    《Hadoop权威指南》

    《Hive编程指南》

    《Hbase权威指南》

    《大数据技术全解》

    《大数据挑战NoSql》

    《Mahout实战》
    人工智能、大数据、云计算和物联网的未来发展值得重视,均为前沿产业,多智时代专注于人工智能和大数据的入门和科谱,在此为你推荐几篇优质好文:
    大数据工程师就业培训哪个好?
    大数据工程师培训,需要学习的有哪些课程?
    如何成为一名优秀的大数据工程师


    多智时代-人工智能大数据学习入门网站|人工智能、大数据、物联网云计算的学习交流网站

    多智时代-人工智能大数据学习入门网站|人工智能、大数据、云计算、物联网的学习服务的好平台
    展开全文
  • 编程什么书

    万次阅读 2014-07-17 16:46:38
    虽然一直想写点什么,但是感觉自己怎么写肯定都不如书上写的好,所以到最后感觉还是推荐点书比较好。 下面列举一些自己感觉还不错的书,可能会和以前的有重复,就当做总集篇吧。一般好书都有些难度,而且

    下面列举一些自己感觉还不错的书,可能会和以前的有重复,就当做总集篇吧。一般好书都有些难度,而且看很多书还需要一些铺垫的知识,我只从我自己知道的提一些,不足之处还请见谅

    编程基础




    书名:《C++编程思想》

    推荐理由:虽然很多人推荐《C++ Primer》,而且确实我也觉得那本书写的挺好的,不过如果真觉得哪本书把C++讲的更让我舒服一些,我还是选择它。里面对于虚函数与虚函数表、多态、晚捆绑、模板、多重继承等问题都做了很详细的介绍,甚至还对类方法调用的机器码都做了详细介绍,从原理上弄明白了C++到底算什么。



    书名:《Effective C++》

    推荐理由:在看这本书之前建议还是先看看《C++编程思想》这本书,在没有太多基础的情况直接看《Effective C++》是相当痛苦的一件事情,这本书不针对整个C++体系进行介绍,而是专门针对C++在具体应用过程中非常重要的一些内容,如构造、析构、虚函数、多态、异常、模板、常量等一些我们容易忽略的细节问题中给出了详细的讨论。看这本书不仅是让我们写出给优美的代码,目的更是让我们加深对C++的理解。不知道是不是我个人的原因,感觉看侯大翻译的很诡异,感觉看的时候语句变得很晦涩难懂。



    书名:《More Effective C++》

    推荐理由:这本书算《Effective C++》的一个补充版本,在一些更加深入的细节部分给予的讨论,如果能够把《Effective C++》给看个明白,这本书其实也就没那么难了。不建议上手就开始读它,难度有些高。



    书名:《Java编程思想》

    推荐理由:如果懂C++了,学习Java真心是一件很容易的事情,因为它没有了C++中令人讨厌的指针,不用像C++一样需要自己做堆管理,多了接口、包这样非常适合设计的内容。甚至还有大量的类似Spring、Hibernate这样的开源框架。我们没有理由不喜欢Java编程,它让我们将更多的精力集中在编程,而不是语法的细节上。那这本书的好处就是,给我们详细讲述了Java的语法和基本原理。如果懂C++,这本书可以说就是一本工具书,如果不懂C++,那这本书也很适合作为一本教材。所以没理由不推荐。



    书名:《Effective Java》

    推荐理由:和推荐《Effective C++》的理由一样,Java虽然让我们少了很多对语法细节的关注,但是如何将Java的语言特性发挥出来却不是一件很容易的事情。这本书就在这些细节问题上给出了非常详细的讨论,如类与接口、泛型、注解、方法等很细的内容。



    书名:《STL 源码剖析》

    推荐理由:学习了C++,肯定觉得立面的STL很强大,但是肯定会有很多人说STL一定要根据具体情况而使用,而不能胡乱用,那心里一定忐忑如何才能将这些容器给用正确使用。做法很简单,只要知道它们底层的机制就可以了,所以这本书相当值得推荐,它告诉你为什么vector、list、map、heap、set、queue、dqueue、stack等等各种数据结构底层的实现,它还告诉你什么是迭代器,我们是如何使用模板这一高级特性的。这本书还为以后学习数据结构打下基础,而且学习Java的时候,Java的容器就很容易上手了。这本书难度有些高,最好多用STL解决几个问题后再读。如果对C++懂的比较多,读起来效果更佳。



    书名:《程序员的自我修养——链接、装载与库》

    推荐理由:讲解编译和链接过程的书非常的少,讲编译的书我只知道《编译原理》,讲链接的书我只知道《链接器源加载器》和这本了。这本书难度会比较大,最好懂的Linux内核中关于进程地址空间、页表与内存寻址、进程描述符和中断相关的知识。这样对这本书中一些知识点才比较好理解。另外,最好还需要懂的编译GCC工具链,这样才能对书上的内容进行验证。最后,最好还需要懂一些X86架构体系的知识,或者懂一些汇编,这样里面的一些内容才能看的明白。所以要看这本书,需要的前期准备其实是比较久的,但是如果看懂了这本书,以后再看C++、Java、Ruby这种语言,又完全是另外一番味道了,尤其在看Java虚拟机这样的书的时候,就非常容易理解那些书上说的是什么。如果说之前的几本书是外功的话,这本书就是一本内功书籍,以后很多外功都可以靠它来修炼。



    书名:《深入理解Java虚拟机》

    推荐理由:学了Java,如果还没有学Java虚拟机,那Java真心觉得白学了。弄明白了Java虚拟机的内容,那Java真心就没那么难了。这本书也有一些难度,如果看懂了《链接、装载与库》这本书,那这本书就没什么难度可言,如果没有看懂,那这本书看起来就相对吃力了,其实它里面讲的内容还是编译、链接、加载过程,只是它讲述的是Java是如何做到的,当然这本书还介绍了Java下的堆是如何进行管理的。标记-清理和引用计数是堆管理的两大机制,对以后的学习很有帮助。

     

    书名:《Unix环境高级编程》

    推荐理由:从顶层学习Linux系统绝佳的一本书,Linux系统非常经典的就是它定义了很少的一些经典的系统调用,这本书主要就是通过介绍这些系统调用,告诉我们一个Unix系统应该有什么样的特性,这本书不仅仅是可以当做一本工具书使用,更可以当做一本教科书使用,配合上《Linux系统管理手册》两本书一起看,收获很多。

    书名:《Unix网络编程卷1:套接字编程》《Unix网络编程卷2:进程间通信》

    推荐理由:我原来是学网络工程出生,本科学习的都是《TCP/IP协议族》《局域网与城域网》《接入网技术》《计算机通信网络》《交互网络》这些理论书籍,但是这些书学完以后总感觉自己光有理论知识,但是却没办法将其转换成实际的代码,而让我真正可以开始进行网络编程的入门书籍就是《Unix网络编程卷1》这本书,书中十分详细的介绍了各种套接字,如TCP、UDP、STCP的调用接口,还很详细的比较了各种实现方案:基于信号、阻塞、多路复用、基于线程池情况下如何进行网络编程,在理论的基础上更多了很多系统的知识,可以说是将理论与实际相结合。《Unix网络编程卷2》呢,它十分细致的整理了各种进程与线程间通信和同步的方式,如果希望自己有并发编程的基础,那这本书也可以说是入门的必选教程了。

     

     

    设计基础



    书名:《UML精粹 标准对象建模语言简明指南》

    推荐理由:这本书说起来很鸡肋,它仅仅告诉我们UML该怎么画,偏偏这本书又贵的要死(另外一本我觉得贵的要死,内容又没想象的好的书就是《编写可读代码的艺术》)。当时还是需要推荐这本书,学了那么多C++和Java,或多或少都听过对象建模,那必然需要翻看一些建模类的书籍,但是那些书籍都默认大家懂得UML,这样一来就出现一个落差——看不懂图。这本书的目的就是告诉我们,如何去看别人画的图,如何将代码与图对应起来。可以说它就是我们迈向系统架构的第一步基石(虽然它很鸡肋)。



    书名:《设计模式:可复用面向对象软件基础》

    推荐理由:学习面向对象编程中的基础,虽然这本书已经很久了,里面的模式已经被用烂了,但是我们还是需要学习它,学完它,我们就懂了什么是工厂,以后学习Spring这样的框架就很容易了;学完它,我们就懂了什么是代理,以后学习AOP就显得自然;学完它,我们就懂了什么是观察者,以后什么MVC架构都不会吃力;学完它。。。书中给出了23中设计模式,虽然并不是每种都一样的实用,但是它给了我们如何更加有效、合理的去利用对象、多态这样的特性,如何更好的去做一个内聚的、高可复用的、松耦合的架构的基础,记住:它给的仅仅是基础,真正难的还在后头。



    书名:《敏捷软件开发:原则、模式与实践》

    推荐理由:我才学完《设计模式》的时候,我觉得它很强大,就迫不及待的去应用它,结果在用的时候出现了各种各样的问题。我一直弄不明白如何将这些设计模式和UML结合起来,我不知道如何将设计模式融入到自己平时的代码中。看了这本书以后,我感觉我找到了一些答案,这本书的内容非常丰富。当然,它的要求我感觉也比较高,不懂的人觉得它从头到尾都在贴代码,但是其实不是这样,这本书中隐含着整个代码开发的过程。它告诉我们我们平时设计类的时候的原则有哪些、我们设计包的原则有哪些、我们应该抱着什么样的心态去编码、我们如何与他人合作编写代码、我们该什么时候开始利用设计模式等等。虽然好处非常多,但是我感觉没有切身体会过自己设计、编码、与人合作的痛苦,看这本书的共鸣肯定就会小很多,真的是痛越多,感触就越多。



    书名:《重构:改善既有代码的设计》

    推荐理由:最开始写代码的时候,我那个一个揪心呀,总觉得代码写起来是那么的困难。一会担心效率问题、一会担心命名问题、一会担心代码排版。。。代码删删改改、涂涂写写,老半天憋了十几行代码,结果用的时候还是要出问题。其实,这是一个方法的问题——写代码其实是有一定步骤的,我们需要做到的事情就是——一次只做好一件事情。写代码可以分成添加功能、重构、测试三个过程,看完这本书,我们就懂的了我们应该在重构过程考虑什么问题,这本书不仅仅可以作为一本工具书,也告诉了我们怎么样去编写代码。



    书名:《Junit实战》

    推荐理由:本来是应该推荐《软件测试》这本书,不过那本书我买了还没看,我学习如何利用测试驱动开发是从《JUnit实战》这本书开始的,所以测试相关的书也只能从这本书开始推荐了,感觉看这本书不是为了学习JUnit而看它,更多的是我们要弄明白为什么我们要测试,我们应该什么时候去测试,我们应该如何进行测试,我们应该测试什么,我们应该如何去保证我们的测试是完整的,我们如何在条件不完全的情况下构建测试。而不仅仅是学完以后,知道了一个JUnit怎么用。测试其实是一门非常难的事情,最少我看来它并不是想做就做好的,不是点击几下鼠标就叫做测试。我所知道的写代码就是:测试、重构、实现。每个环节都不是那么容易做到的。




    书名:《程序员修炼之道——从小工到专家》

    推荐理由:很有意思的一本书,讲述了我们平时应该以什么样的心态去面对代码,面对项目,面对团队合作,面对测试。。。这本书感觉没有什么门槛之说,但是更感觉它是写给参与过的项目开发的程序员看的,感觉越是资深的程序员,对这本书的认可度就越高。



    书名:《编程珠玑》

    推荐理由:也是相当有趣的一本书,不过它不是讲述如何去面对团队合作,更多的将尽力放在我们应该如何去面对我们的代码,但是它告诉我们面对代码的心态又和《重构》这种书介绍的不一样。重构更强调的是代码的命名、清晰与减少代码重复度等内容,而这本书更多的是告诉我们应该如何从算法、性能、复杂度等方面去重新考虑代码的编写。但是这本书还是相当值得读的,读了它以后,以后学习算法的时候的心态就会变得更加的坦然了。



    书名:《Linux/Unix设计思想》

    推荐理由:这本书也相当的有趣,没太多的难度,完全可以当做一本科普书来读,但是它讲述的思想死意义深远的。其实到最后,我感觉它的思想就是我们现在项目工程的思想,只是两者用在了两个不同的领域,给出了不同的指导,最后的纲领其实还是一样的。


    很可惜的是我没有做过太多的架构方面的知识,结果这一块内容的书一直都是看的迷迷糊糊,下面会依次介绍一些,我只知道他们是好书,但是没办法做太多介绍。


    书名:《大象:Think in UML》

    推荐理由:这本书个人是感觉写的非常好,它先介绍了UML的各个元素以及RUP的过程,最后再将这些内容整合起来,用一个具体的项目实例告诉我们如何利用UML和RUP进行架构设计。



    书名:《UML和模式应用》

    推荐理由:这本书也是好书,其实内容也和《Think in UML》有些像,不过这种书多看个两本,对UML的理解就更加深刻了。



    书名:《领域驱动设计:软件核心复杂性应对之道》

    推荐理由:这本书关注与领域模型的构建,但是感觉讲的好抽象,看不懂,但是可以肯定,它绝对是一本好书



    书名:《编写有效用例》

    推荐理由:这本书关注于用例模型的构建,但是没有机会接手项目的这个过程,所以看起来还是很抽象,但是我还是可以肯定它绝对是一本好书



    书名:《分析模式:可复用的对象模型》

    推荐理由:针对领域模型的分析过程,这本书也相当的抽象,里面的图都感觉非常难看懂,但是可以肯定它绝对是一本好书



    书名:《企业应用架构模式》

    推荐理由:这本书虽然对表示层、领域层和持久化中间层都做了介绍,不过感觉花费的精力更多的是如何对持久化中间层的设计,我所知道的就是,如果要深入学习Hibernate的机制,那这本书绝对可以提供非常好的指导作用,所以这本书也是一本好书。



    书名:《面向模式的软件架构卷1~5》

    推荐理由:能够出版到卷5的书相信不需要太多理由了,不过这几本书感觉难度还是有些大,反正我看的时候也是看的云里雾里的,没有太多的心得。



    Linux与操作系统

    接下来介绍一些系统原理方面的书:


    书名:《Linux内核设计与实现》

    推荐理由:学习Linux内核很好的一本入门书籍,Linux内核可以说相当的复杂,从任何方面入手都相当的有难度,有的人说先看0.11版的内核比较好。我不完全赞同,在不知道什么是中断、什么是进程、文件抽象、内存管理、内存寻址、文件系统、块I/O与页缓存、虚拟地址空间、模块。。。。等等概念前,看任何Linux内核的书都是很困难的。推荐这本书的理由比较简单,它在介绍内核,但是它又不介绍内核的具体源码;它告诉我们不同子系统下有些什么,但是又不介绍这些子系统的具体实现。所以我觉得它是一本非常好的入门书籍。看完这本书不敢说自己懂内核了,但是我们最少知道了内核有什么东西,后面会慢慢介绍一些讲的更加具体的书籍。



    书名:《Linux内核设计的艺术》

    推荐理由:相信如果只是看了《Linux内核设计与实现》,肯定会觉得内核东西太多,完全搞不明白为什么这些东西怎么组合在一起就可以工作了,那这时候最推荐的一本书就是《Linux内核设计的艺术》,虽然这本书只是讲0.11版的内核,但是它讲的方式很有意思,它是从Linux内核从上电的时候开始的整个系统初始化过程,我们将在书中看到内核启动过程中是如何从实模式转换到保护模式、内核级和用户级是如何调整的、中断向量表是如何重构的、系统内核是如何加载的、中断是如何执行的、内存是如何初始化的、页表是如何构建起来的、文件是如何访问的、进程间通信又是如何实现的。。。不要觉得这本书介绍的内核版本太低,其实现在的内核也是这样做的,只是系统更加复杂而已。还有一本和这本书类似的书叫做《独辟蹊径:从内核源码导入》,只是那本书我没有看过,但是也是一本好书。不过看这本书的时候需要一些铺垫,最少对内核中应该有哪些东西有个大致的概念,还需要对X86的架构有一些了解。



    书名:《Linux内核完全剖析——基于0.12内核》

    推荐理由:这本书我感觉后面2/3的内容可以不看,主要是前面一部分的内容最好看看,因为这部分恰好和《Linux内核设计的艺术》这本书相补充,看完那些内容以后再看《Linux内核设计的艺术》就变得相对容易一些了。




    书名:《深入Linux内核架构》

    推荐理由:它个头很大,当然块头大不能成为推荐它的理由,但这本绝对要比《深入理解Linux内核》这本书要好,《深入理解Linux内核》和《深入理解Linux网络技术内幕》这两本书完全是被国内的翻译者给毁掉的两本书,虽然这两本书都很好,但是翻译的作者太不给力了。这本书比《深入理解Linux内核》更好的一点就是它讲每个模块的内容都讲的比较详细(只是比较详细,因为在一些具体的模块部分可以找到更加详细的书)。但是就是这样都洋洋洒洒上千页。算是我的书柜中最厚的两本书之一了。可以把它当做《Linux内核设计与实现》这本书的增强版就可以了。这本书不推荐入门就看,否则会被他各种细节给绕晕掉的。



    书名:《深入理解Linux虚拟内存管理》

    推荐理由:这本书非常的奇葩,附录居然占据了将近2/3的内容,而且这本书也是被出版社毁掉的一本书,后面代码缩进全部没有了,看起来是蛋疼无比。但是我能找到的讲解Linux虚拟内存的书只有它,而且它讲的还是2.4的内核。但是不可否认这本书在虚拟内存部分做了很深入的解释,在没有出现更好的介绍Linux虚拟内存管理的书籍之前,我们只能看它了。善哉。。。



    书名:《深入理解Linux网络技术内幕》

    推荐理由:虽然这本书被翻译者给毁了,但是不可否认这本书讲的的确非常的好,它认真剖析了帧传输、桥接、ip、icmp、tcp、udp、邻居子系统、路由子系统等等网络协议栈中的具体实现问题,在介绍Linux网络协议栈上,是我看过的最好的一本书了。不过这本书的入门门槛也很高,首先需要对Linux内核有比较多的认识,包括虚拟文件系统、中断、设备驱动、内存管理等相关的知识,此外还需要懂的网络协议栈的知识,包括了TCP、UDP、IP、ICMP、ARP等协议的内容。所以看它需要的准备工作也非常的多。





    书名:《Linux内核源码剖析——TCP/IP实现》

    推荐理由:虽然《深入理解Linux网络技术内幕》这本书讲的很好,但是网络协议栈还是得真枪真刀的看看源码才懂的具体的机制,这本书的好处就是它很详细的介绍了网络协议栈中代码,并且还对《深入理解Linux网络技术内幕》很多没有提到的细节提供了补充。所以这本书完全可以和《深入理解Linux网络技术内幕》一起搭配着具体源码一起看,相信效果会非常的好。



    书名:《存储技术原理分析:基于Linux 2.6内核源码》

    推荐理由:这本书也是一本神书,因为它对内核存储部分的内容可以说做了相当详细的介绍,这在其它的一些书上绝无仅有的,从中你可以深入到虚拟文件系统、块I/O子系统、PCI子系统、SCSI子系统、Multi-Disk、Divice-Mapper模块的最深入部分去一探究竟。这是我最喜欢的几本书之一,虽然其中很大一部分内容我因为不感兴趣而没看,但是我感兴趣的那些内容就已经让我相当的满足了。当然这本书要求也很高,也是需要对内核中的设备驱动、文件系统、虚拟文件系统、内存管理等内容有比较多了解。其中还有一些因为我们都没见过那些设备,导致看不明白的内容。

     


    书名:《深入理解计算机系统》、《现代操作系统》

    推荐理由:这两本书都很喜欢,不过看的更多的还是后者,这种书怎么说呢,理论多于实际,但是我们可以利用实际来验证理论。这种书就在一个很高的角度告诉我们计算机系统(操作系统)为什么应该长这样,还可以有其他的实现方式么,为什么我们不采取其他的实现方式,我们现在使用的方式存在问题么等等问题。

    算法



    书名:《算法:C语言实现》

    推荐理由:虽然不玩ACM,但是感觉还是有必要学习一些算法,最少懂的一些基础是数据结构,算法类的书看的很少(因为太难了),最喜欢的还是这两本(作者说要写3本的,结果多少年了第三本还没出来)。不过最近有一点心得,看这本书最重要的就是理解它里面想要表达给自己的思想,而不是对着书抄一遍,然后运行,发现成功了,再把代码背住就算自己学会了。所以说会算法的人都是神呀,这东西完全就是只可意会不可言传。反正我就一个感觉,什么时候我们看算法能够得出“看山是山,看山不是山”的结论的时候,就算有些明白到底要学什么了。



    书名:《算法导论》

    推荐理由:这本书也是神书(和TAOCP那种超越神的书没法比了),我觉得每隔一段时间看它总有一种新的体悟,不过这本书也不是太好懂。个人的一些心得就是,先到网易公开课找到MIT算法导论的公开课(老师就是这本书的作者),看它一遍,另外,自己动手写代码,这里的写代码不是将书上的伪代码实现了就叫写了,而是去做一些算法的题目,比如《编程之美》上面的题,或者任何一些竞赛入门的题,再看看类似《背包九讲》《男人八题》《微软面试100题》这些的文章。我也说不清那种感觉,反正每隔一段时间,对这些东西就会有一种完全不同的体悟。可能算法的魅力就在于此吧。

     

    接下来的书都是没怎么看,或者看不懂的书了


    书名:《计算机程序设计的艺术》

    推荐理由:神书,不解释,看不懂

    书名:《信息检索导论》

    书名:《数据挖掘导论》

     

    书名:《模式分类》

     




    新入手的一些好书

    下面介绍的书籍都是刚刚入手的好书,虽然没有读过,

     

    书名:《领域特定语言》

    书名:《代码大全2》

    书名:《持续集成:软件质量改进和风险降低之道》

    书名:《离散数学及其应用》

    书名:《组合数学》

    书名:《具体数学》

    书名:《图论》

    书名:《事务处理》

    书名:《HTTP权威指南》

    书名:《Git权威指南》

    书名:《计算机程序的构造与解释》

    书名:《大数据挑战与NoSQL数据库技术》

    书名:《Java虚拟机并发编程》

    书名:《MySQL技术内幕:InnoDB存储引擎》

    书名:《软件调试》

    书名:《DEBUG HACKS》


    转载http://blog.csdn.net/minghe_uestc/article/details/9255621

    展开全文
  • 数据结构是计算机中的重中之重,而且数据结构一般和算法结合比较紧密,加上,数据结构和算法往往是算法面试中考察的最重要内容,因此,学好,并且练这些内容,就非常重要了。下面这份数据结构的内容,能让大家对...

    数据结构就是你的工具箱,这些工具箱帮你把同类的信息装到了一起,同时还提供给你操作这些信息的各种便捷方法。

    数据结构是计算机中的重中之重,而且数据结构一般和算法结合比较紧密,加上,数据结构和算法往往是算法面试中考察的最重要内容,因此,学好,并且练好这些内容,就非常重要了。

    下面这份数据结构的内容,能让大家对数据结构有个初步的了解,而且还有各个语言的配套课程,能让大家从理论到实践去真正掌握好这门计算机核心基础。

    数据结构其实内容也很多的,各种高级的数据结构也层出不穷。

    看书的话推荐大话数据结构:

    自学编程的小伙伴,入门语言推荐python,学有余力再学其他的就好。

    题主想学C++的话,那就看看这一门:

    尼克劳斯·维尔特,瑞士计算机科学家,在1976年写了一本名为《算法 + 数据结构 = 程序》的书。

    40多年转瞬即逝,但这个公式依然成立。这也是今天我们程序员面试的时候,需要展示自己对数据结构以及他们应用场景的掌握的原因。

    几乎所有的问题都需要面试者证明他们具有扎实的数据结构基本功。无论你是刚毕业也好(从大学还是编程培训营),还是有N多年的经验。

    有时候这些面试题则是专门提到某种数据结构。比如,题目描述是这样开头的“给定一颗二叉树。。。”。其他的时候则是那种隐式的,比如说,“我们找到每个作者相关的书籍数目”。

    学习数据结构是非常重要的,哪怕你只是想在当前的工作岗位上变得更赞一点。所以,就让我们从基础开始吧。

    啥是数据结构?

    简单来说,数据结构就是一种容器,按照某种既定的方式存储数据。这种“方式”能让一个数据结构在某些操作下很高效,相反,在另外的操作下就不太理想了。你的目标是为了理解这些数据结构,从而可以能从不同的数据结构中选择适合当前所面对的问题的那一种。

    为啥需要数据结构?

    因为数据结构是用来有规则地存储数据的,加上数据结构在计算机科学中神一般的存在,他们的价值就不言而喻了。

    不过你要解决的问题是啥,你反正都得需要数据结构,方式可能不同而已。无论是面对员工工资,还是股票价格,购物清单,还是简单的电话本,这样的场景。

    根据不同的应用场景,数据需要按照不同的方式存储。我们有好多可以将数据按照不同方式保存下来的数据结构。

    常用的数据结构

    我们先来列一下最最常用的八种数据结构,然后接下来我们会慢慢将他们讲明白。

    数组

    队列

    链表

    字母树(其实他们就是树而已,但还是值得单独拿出来讲的)

    哈希表

    数组

    数组是最简单也最常用的数据结构。其他的数据结构诸如栈和队列,都是从数组衍生出来的。

    下面是一个拥有四个元素的简单数组,包含了元素1,2,3,4. />

    每个元素都依附于一个正整数,称作索引,它就对应于数组中该元素所在的位置。大多数的编程语言中,数组的起始索引都为0 (0-based,译者注).

    数组一般有以下两种:

    一维数组(上图所示)

    多维数组(数组里面包含数组)

    数组的基本操作

    插入 — 在给定位置插入一个元素

    取值 — 返回给定位置的数值

    删除 — 在给定位置删除元素

    元素总数 — 数组包含元素的个数

    数组类常问问题

    数组中第二小的数

    数组中出现的第一个无重复的数

    合并两个已排序数组

    重新排放数组的正数和负数

    我们平时熟悉的软件操作中的撤销(回退)操作,基本会出现在所有应用中。你好奇过它是咋工作的吗?原理是这样的:你把之前的状态(有限的数量)都存到内存中,存的顺序是最新的操作存在最近一个。这个光靠数组是不能实现的。这是栈擅长的地方。

    现实中也有栈的例子。比如你把一大堆书垂直叠(一本压着另外一本)起来放。为了拿到他们里面靠中部位置的书,你得把上面的书都拿走才行。这就是著名的LIFO(后进先出)的工作原理。

    下图是一个包含有三个元素的栈,数值为1,2,3. 元素3在栈顶,它会被最先删除。 />

    栈的基本操作进栈 — 在栈顶插入元素

    出栈 — 把栈顶元素弹出(删除)

    判空 — 返回栈是否为空

    栈顶元素 — 只返回栈顶元素而不删除

    译者注:对于栈所有的操作,都只出现在栈顶这个地方

    栈常见的面试问题

    借助栈来计算后缀表达式的值

    将栈里的元素进行排序

    判断括号表达式是否合法

    队列

    和栈类似,队列是另外一种线性数据结构。这种数据结构将元素按照顺序的方式存储。和栈最本质的区别就是:和后进先出相反,队列实现了先进先出的特性(FIFO, First in First Out)。

    队列在生活中有非常贴切的例子:一堆人排在售票台前面。如果新来了一个人,这个人得排在队尾,而不是队伍前面。另一方面,排在第一的人则能第一个买到票,然后离开队伍。

    下面是一个包含了四个元素的队列(1, 2, 3, 4)。1站在队头,会被第一个删除。 />

    队列的常用操作进队 — 在队尾加入一个元素

    出队 — 从队头删除元素

    判空 — 判断队列是否为空

    队头元素 — 返回但不删除队头元素

    常见的队列题

    用队列实现栈

    将队列里面的前k个元素翻转

    借助队列来产生从1到n的二进制数

    链表

    链表是另外一种重要的线性数据结构。链表初看起来和数组很类似,但他们在内存分配,内部结构,以及像插入和删除这样的基本操作上,都是不一样的。

    链表就是一串 串起来 的节点,他们的每一个节点都包含了数据和指向下一个节点的信息。链表有头结点,指向链表中的第一个元素。

    链表结构经常用来实现文件系统,哈希表,以及邻接表。

    下图是一个链表的内部结构图示。 />

    我们常见的链表有以下两种:

    Singly Linked List (Unidirectional)

    Doubly Linked List (Bi-directional)

    单链表 (单一方向)

    双链表 (双向)

    链表基本操作:

    末端插入 — 在链表的末尾插入给定元素

    头部插入 — 在链表的头部插入给定元素

    删除 — 在链表中删除给定元素

    头部删除 — 删除头部第一个元素

    搜索 — 判断给定元素是否存在于链表中

    判空 — 判断链表是否为空

    常见的链表问题

    翻转链表

    检查链表中是否有环

    返回距离尾部距离为N的节点

    删除链表中的重复元素

    图包含一系列的节点,这些节点通过网络相互连接起来。这些节点也被称为Vertcies。对于每个对子(x, y),我们则称为边,表示节点x和节点y是相连的。边也可能包含权重或是花费信息,表明了从x到也所需要的消耗。 />

    图的类型:无向图

    有向图

    在计算机语言中,图通常用下面两种方法表示:邻接矩阵

    邻接表

    常用的图遍历算法:宽度优先搜索

    深度优先搜索

    常见的图问题

    实现宽搜和深搜

    判断一个图是不是一棵树

    数图中的边数

    找两个节点之间的最短路径

    树是非线性数据结构,它也是由节点和边组成的。因此树和图类似,但他们最大的不同是树上没有环存在。

    树被广泛应用在AI和其他复杂算法中,因为它能提供高效的存储,使得问题能得以解决。

    下面是一颗简单树,图中也包含了常见的树的术语。 />

    我们可以有以下的各种树的形状:N叉树

    平衡树

    二叉树

    二叉搜索树

    AVL树

    红黑树

    2-3树

    上面这些树中,以二叉树和二叉搜索树最为常用。

    常见的树的问题

    求二叉树的高度

    求二叉搜索树中的第k大的数值

    找离根节点距离为k的所有节点

    找给定节点的所有祖先节点

    字母树

    字母树,也叫做前缀树,是一种树形的数据结构,它是一种解决字符串相关的问题的高效数据结构。能快速查询回馈信息,经常用在字典中查询单词的场景下,它能为搜索引擎提供自动补全,甚至能帮到IP查询。

    下图演示了如何将三个单词(top, thus, their)插入到字母树中,并保存下来: />

    在字母树中,单词都是从下至下一个字母一个字母保存起来的。绿色的节点(p, s, r)表示的是该节点是一个单词的最后一个字母,p对应top,s对应thus,而r则对应于their。

    常见的字母树问题:

    数字母树中的单词总数

    打印字母树中所有的单词

    用字母树排序数组

    借助字母树来从字典中取单词

    建一个满足T9的字典(译者注:T9 stands forText on 9 keys)

    哈希表

    哈希是一个分辨不同的实体,从而将每个实体存储在某个预先计算好的索引上,这个预先算出来的值被称作“键”。因此,实体都是由键值对的形式存放的,把一大堆这样的东西称为字典。每个实体都能通过键来找到。基于哈希这种思想的数据结构有不少,但最常用的是哈希表。

    哈希表一般通过数组来实现。

    哈希表的效率取决于以下三个因数:哈希函数

    哈希表的容量

    冲突避免方式

    下面这图演示了我们是怎么从哈希值匹配到一个数组中的。该数组的索引是通过函数函数求出来的。

    常见问题:

    找数组中的对称对子

    追踪旅程的完整路径

    检查一个数组是否为另一数组的子集

    检查多个数组之间是不是没有共同元素

    上面就是八种你在算法面试之前必知必会的数据结构。

    具体的学习,可以参考原文作者开发educative上的数据结构课程:

    专门针对数据结构的课程则有:

    C++:Data Structures in C++: An Interview Refresher​www.educative.iov2-526e4f3131bc2c07ef66f107bde1dcef_180x120.jpg

    JavaScript:Data Structures in JavaScript: An Interview Refresher​www.educative.iov2-7882ac7b59c030aab10715cb354cecf6_180x120.jpg

    Java:Data Structures in Java: An Interview Refresher​www.educative.iov2-74830d6e678b72a69824f4c443622612_180x120.jpg

    Python:Data Structures in Python: An Interview Refresher​www.educative.iov2-0da5ec0c18b3b1345f008565dbd3d9a7_180x120.jpg

    我上过其中的Java版本,课程是把数据结构里面的基础数据结构都用java实现了一遍,对于用java的同学特别有帮助,java的基础在刷题的过程中,还是要必须掌握的。

    (如果你需要上面这些算法课程,那么你可以使用 awesome-developer 的折扣码获得网站所有课程的额外15%off!上面的折扣码针对单独购买所有课程有效。

    如果想买订阅(Subscriptions)的小伙伴,则可以用0820-ZH93025(必须一模一样输入)的coupon code来获取额外八折的优惠按年和按月均适用,折扣码十月四号过期,有需要的小伙伴抓紧)。

    过了十月四号就只能用 ZHIHUEDU-10的九折优惠了,大家有需要的抓紧,还有不到两周!

    其他的计算机课程,参考回答:一个不是很了解CS(计算机科学)的人,该从哪里开始自学CS?​www.zhihu.comzhihu-card-default.svg

    展开全文
  • Algorithms in Java算法书

    2018-09-05 19:20:20
    和它相比,清华的什么算法教材简直就是给原始人的。它有什么特点呢? 1、基础而全面:前两天看到Quora上的一个问题:你觉得最天才的算法有哪些...
  • 算法图解》应该是我今年读完的第49本书了。但是很惭愧,因为这只是我今年完的第一本技术类书籍。算法知识在国内互联网公司面试中应该算是比较重要了,特别是在一二线大厂...本人比较喜欢看书,最近的《算法图解》

    读《算法图解》有感

    《算法图解》应该是我今年读完的第49本书了。但是很惭愧,因为这只是我今年看完的第一本技术类书籍。算法知识在国内互联网公司面试中应该算是比较重要了,特别是在一二线大厂。而程序归根到底是数据结构+算法,算法的重要程度应该是不言而喻的。

    俗话说的好:只输出价值观,而不讲方法论都是在耍流氓。窃以为,学习算法,没有什么捷径可以走,无非是“时间少,看书;时间多,看视频;多敲多想”十四字方针而已。本人比较喜欢看书,最近看的《算法图解》恰巧觉得还真不错,特此来推荐一波。当然了,本人是以Java为主攻方向,而这本书的代码示例都是用python来实现的,就阅读体验上来说未免让人有些不快。为此,我特意将书中的python代码都一一翻译成了Java代码。翻译的博客链接放在了文末,感兴趣的朋友可以去看看哦!

    下面言归正传,我想分以下两点来给大家说说《算法图解》这本书:

    1. 这本书有什么亮眼之处
    2. 为什么要学习算法?我看完了《算法图解》这样一本算法书之后有什么感受。

    亮眼之处

    那么,这本《算法图解》有什么亮眼之处?其实书的封面已经告诉我们了:

    在这里插入图片描述
    首先,既然这本书叫《算法图解》,一定是有着大量图示的,所以讲解方面会更加的生动形象。我们都知道,人的左脑分管逻辑思维,右脑分管象形思维,而人对于图像的记忆理解能力是文字的数十倍甚至上百倍(在一本书里看到过,具体多少忘记了)。还记得,我第一次接触算法书还是大学时期学校发的教材《数据结构与算法》。我当时对于那本书真的是一言难尽:深奥晦涩的讲解,动则大段没有讲解的伪代码。感觉那本书不是为了让人更好的理解而写,而是为了“炫技”。当然,很有可能是我境界太低了吧。

    其次,在书的标题下面有着这样一排红字:像小说一样有趣的算法入门书。当然,它并没有挂羊头卖狗肉:借着算法的名义写小说。看完这本书,你对于算法将会有一个初步的了解(当然,这只是算法入门书,算法大牛想必就不需要了):你将明晰算法的基本概念,如何用大O表示法(时间复杂度)去衡量一个算法的性能(这本书没有怎么考虑空间复杂度)以及了解一些基本的数据结构,剩下的当然就是学会一些基本而又常见的算法。

    而这本书的有趣之处就在于两点:

    • 一是运用大量的类比,例如将计算机比作很多抽屉的集合体,散列表突然变成了一个杂货店的收银员…
    • 二则是在讲解的过程中具有很强的故事性,学习递归算法变成了一个在祖母家阁楼的神秘手提箱中寻宝的过程,而在动态规划算法的学习过程中你又将化身成为小偷,思考“偷东西”的最优策略…

    为什么要学习算法?

    下面再来回答一个问题,也是我问过自己的一个问题:为什么要学习算法?

    其实我身边有一部分朋友认为学习算法是没有太大必要的。作为一名后端开发,其实就像是公司的一颗螺丝钉,大多时候都是做的一些CRUD的工作,可能并没有涉及到太多甚至几乎不会涉及到算法知识的运用。就算要用到一些高深的算法,也是有专门的人员写好了,我们再来直接调用即可。

    当然,我之前也是这么认为的,我刚开始学习算法知识也仅仅是因为觉得蛮有趣而已。

    直到我在工作过程中遇到了一个需要在原有的基础之上排序再展示的需求。记得在排序之前,几乎是秒展示;但是在经过排序后,可能需要1-2秒的时间。虽然花的时间仍不多,但前后一对比,就能感觉到明显的停滞感。那么如何优化这个排序以便提升速率呢?若是不懂算法知识,只怕是书到用时方恨少咯。或者只能安慰自己说:反正功能已经完成了,问题不大。还记得,当时我通过调整排序算法为快速排序以及结合空间换取时间等策略成功将速率优化到几乎等同于没排序之前的速率时,那种满满的成就感。

    新的感受

    那么,学习算法之后你会有什么新的感受吗?你可能会发现这个世界多了一些新的东西,或者看这个世界的时候,似乎多了一个角度、多了一分透彻。当你上网查单词却输错单词时,看到下方提示的你可能想要输入的单词,你可能会会心一笑:动态规划算法。又或者,当你像我一样使用百度地图看到下方这样的路线指引时,不禁莞尔:这不就是最短路径算法多绕了个环,百度的程序员小哥哥还不快去改bug。
    在这里插入图片描述
    甚至当你玩游戏的时候,也会觉得和平时不一样。就像我平时比较喜欢玩王者荣耀,最近玩韩信比较多,就想买一个韩信街头霸王的皮肤。
    在这里插入图片描述
    但是在购买点券的过程中发现这样一个问题:
    在这里插入图片描述
    我竟然不能够随心所欲的购买点券数量,只能按照腾讯规定的数量购买点券。这应该是腾讯为了刺激用户消费所设置的规则。毕竟自己去凑点券数量也不太好计算,嫌麻烦的用户可能就会直接购买超量的点券。但是这个时候我突然就想挑战一波,于是阐述问题:

    如果我想买一个韩信街头霸王的皮肤,已知皮肤的价格为888点券,而我有50点券的优惠卷,余额为8点券,也就是说我需 要购买830点券。但是购买点券的数量又不能随心所欲,如上图所示。但是因为最小单位是1元,也就是10点券,所以我肯定可以凑的刚刚好。问:如何花最少的次数刚好买到830点券?

    然后运用简单易行的贪心算法,可编程求得:
    在这里插入图片描述

    具体求解代码求解过程,可查看博客:贪心算法求解:王者荣耀购买点券最优策略

    就像我很喜欢的辩手陈铭在奇葩说讲的那样:

    我们坐在同一个舞台上,我们真的看到的是一样的事情吗?我刚才所说的每一位因为背后的知识结构和知识背景不同,他看到的是一个又一个不同的而五彩斑斓的平行世界。而算法的世界如此奇妙,你们就不想进去看一看吗?美不美呢?

    在这里插入图片描述
    最后,贴出本人翻译的博客链接:

    肝了几万字,送给看了《算法图解》却是主攻Java的你和我(上篇)

    肝了几万字,送给看了《算法图解》却是主攻Java的你和我(下篇)

    本人才疏学浅,权当抛砖引玉,若有不足之处,还望各位雅正。

    若能顺手给个赞,更是不胜感激!

    展开全文
  • , 本书可作为计算机专业研究生入学考试复试上机、各类算法等级考试(如PAT、CSP等)的辅导,也可作为“数据结构”科目的考研教材及辅导内容的补充。本书还是学习C语言、数据结构与算法的入门辅导,非常适合零...
  • 因为那些比较简单就那样,实现起来也还可能语法错误比思维错误更多。最多因为时间关系遗忘了, 直到 我开始平衡二叉树的转啊转。。。。。这些就是说转,,,,也没有告诉你怎么转。。。。 Visualgo 【这个...
  • 学习 FPGA 书籍分享

    2016-04-12 14:03:26
    这个时候我主要的数据有这几本感觉比较好: ①、《Altera FPGA/CPLD 设计(基础篇)》:讲解一些基本的FPGA设计技术,以及QuartusII中各个工具的用法 (IP,RTL,SignalProbe,SignalTapII,Timing Closure Floor...
  • 坐标上升算法

    2019-07-27 16:36:37
    上介绍说应该用SMO算法,但因为我数学基础比较差,所以愣是没上讲的是什么意思,后来查了好多资料得知SMO算法脱胎于坐标上升算法。之后经过学习大概懂了这个算法的思路,接下来我写一下让数学基础不太的人...
  • 算法基础入门:90分钟搞定动态规划

    千人学习 2019-12-29 10:11:22
    什么人人都要学算法? 程序员对算法通常怀有复杂情感,算法很重要是共识,但是否每个程序员都必须学算法是主要的分歧点。很多人觉得像人工智能、数据搜索与挖掘这样高薪的工作才用得上算法,觉得...
  • 一般我们在训练数据的时候,用预测值和真实值之间的差距做比较,差距越小越,这就是策略; 算法:已经选出来的最优模型,里面的参数怎么算呢?这时候该算法上场了,“统计学习的算法成为求解最优化问题的算法”。...
  • ID3算法实现

    千次阅读 2019-03-03 19:36:25
    这个算法比较简单,不过我也是看着敲的,因为python还不够熟悉,所以一边点python的函数什么的。代码这边留个档,以后回头看看。 # -*- coding: utf-8 -*- """ Created on Sun Mar...
  • 然后我现在不知道该做一些什么比较好,我想过去做一些小游戏,但是C又做不了界面。然后对于一些让我学习比如组成原理等相当基础的书籍的建议,我有这个打算,但是又有一点有心无力,总觉得现在再学习理论知识对我的...
  • 另说贝叶斯算法

    2007-03-10 01:08:00
    对于贝叶斯算法看了好多中举的例子,比如抛100次硬币,石子以及太阳的出生落下,不过觉得这些例子都完全脱离于实际,是一种很完全的抽象,迫使学习的人想不出来那种场景也在那想,很是痛苦,为什么就不能用通俗的方法来...
  • 学习Java有一阵子了,现在还处于比较初级的水平,能够把...学习编程最好的方法就是练手了,现在还不知道有什么比较好的东西可以尝试,不过跑不出一般教程的排序算法还是可以尝试一下的。 1,冒泡排序算法 packagebub
  • 尽管如此,从目前已经完成的部分来,数据结构与算法在各领域 的知识体系中仍然占据着重要的位置。比如在 CE 分卷(草案)中, Programming Fundame ntals 共 39 个核心学时,其中 Algorithms and Problem Solving ...
  • 接触的框架啊,也是大同小意,什么SSH啊,struts spring mybatis啊,struts1 JDBC啊,现在在一些shell方面的,打算下一步去看看模式方面的,想系统的学习一下,但我感觉还是有点不够,今天突然想到,是否找一些...
  • 这本书偏理论,里面的很多算法使用什么语言都可以自己去实现一下,自己动手对于理解理论很有帮助,但是我的目的并不是把理论搞的很透彻,而是要实际使用,那些算法的实现很多在halcon中已经有定义的算子了;2. ...
  • 今天上最后一节史纲课,老师说不管什么学科,最重要的就是思想。...因为还没线性代数,所以以后了再。 二、递归复杂度的计算和估计。这部分起来有些复杂,好像需要比较高的数学水平,有...
  • 什么要叫插入排序呢,来下面这张图(就是《算法导论》上的原图),类似于摸牌并将其从大到小排列。每次摸到一张牌后,根据其点数插入到确切位置。这张图表示的是摸到草花7后进行插入的过程。忽略最右边的草花10,...
  • 现在干什么好

    2006-07-24 23:23:00
    几次下定决心要把算法的东西搞完,现在看来成了不可能完成的任务... 所以还得干点别的. 我借了4本假期:<c++ primer练习题>,<c++标准程序库>,<深入浅出MFC>还有本<数据结构与算法c++版>...
  • C语言学习路线

    2020-03-21 14:08:21
    想要学好C语言,首先要打...不管看什么书,先认真地看懂,不要贪速度,应该力求深入的理解。如果能够比较熟练的解决一本教材上的所有习题,那么就应该转入对算法的学习,尽管此时的C语言还称不上精通,有许多细节...
  • acm相关书籍

    2019-01-06 19:54:55
     首先,我觉得ACMer学算法不应停留在看看代码实现这个层面,在算法思想上要有清醒的认识,在正确性分析上要也应该要有较的逻辑。因为网上的代码的实现上的一些细枝末节很可能掩盖了算法本身有的简洁性、美感和...
  • 在S=“AAAAAA…AAB“(100个A)中查找T=”AAAAAAAAAB”, 简单匹配算法每次都是比较到T的结尾,发现字符不同,然后T的下标回溯到开始,S的下标也要回溯相同长度后增1,继续比较。如果使用KMP匹配算法,就不必回溯. 对于...

空空如也

空空如也

1 2 3 4 5 ... 9
收藏数 163
精华内容 65
关键字:

学算法看什么书比较好