搜索
高级检索
高级搜索
书       名 :
著       者 :
出  版  社 :
I  S  B  N:
文献来源:
出版时间 :
轻松学算法:互联网算法面试宝典
0.00    
图书来源: 浙江图书馆(由图书馆配书)
  • 配送范围:
    全国(除港澳台地区)
  • ISBN:
    9787121291944
  • 作      者:
    赵烨编著
  • 出 版 社 :
    电子工业出版社
  • 出版日期:
    2016
收藏
编辑推荐

★ 语言轻松易懂,不照本宣科

★ 不仅有原理,还有适用场景

★ 更有互联网应用案例与经验

★ 不论面试还是工作都能让你抓到重点

★ 适合不想钻研晦涩算法书籍的读者

★ 关注算法的具体实践应用

★ 理解和应用算法才是成功的关键

展开
作者简介

赵烨,Java高级研发工程师。现就职于优酷土豆的来疯直播团队。主要关注高并发、高可用、系统性能优化等内容。乐于学习、乐于分享。博客地址irfen.me。

展开
内容介绍

《轻松学算法——互联网算法面试宝典》共分为12 个章节,首先介绍了一些基础的数据结构,以及常用的排序算法和查找算法;其次介绍了两个稍微复杂一些的数据结构——树和图,还介绍了每种数据结构和算法的适用场景,之后是一些在工作与面试中的实际应用,以字符串、数组、查找等为例介绍了一些常见的互联网面试题及分析思路,便于读者了解这些思路,顺利地通过互联网公司的面试;最后介绍了一些常见的算法思想,便于读者对今后遇到的算法问题更轻易地想出解决方案。

《轻松学算法——互联网算法面试宝典》的讲解轻松有趣,易于读者把烦琐、枯燥的算法学习变为有趣、愉快的学习,把被动学习变为主动学习。《轻松学算法——互联网算法面试宝典》也介绍了一些会在工作面试中用到的算法。对于一些正在学习算法的人来说,《轻松学算法——互联网算法面试宝典》绝对是可以帮你轻松掌握算法的辅助资料;对于已经了解算法的人来说,可以从《轻松学算法——互联网算法面试宝典》中了解到这些算法是如何在实际工作中使用的。

《轻松学算法——互联网算法面试宝典》适合即将毕业的学生、初入职场的工程师及想补充基础算法知识的人学习,也适合作为一本互联网公司面试的参考书,更是一本不可多得的便于读者时常补习算法知识的收藏宝典。

展开
精彩书评

本书主要介绍了一些数据结构的基础知识及面试中的常见问题,在看到本书前,我一直感觉大学的数据结构教材比较枯燥,本书将排序、查找、图论、树等重新进行了阐述,不再照本宣科。书中结合作者的工作经验对大量的案例进行了分析,并对算法进行了剖析,具有良好的学习性。在本书中,作者将基础知识融会贯通到工作项目中,对于初学者及应聘者都有很好的指导意义。

——优酷直播互动高级技术总监   白云龙

数据结构、算法是软件开发的基础,在大数据时代的海量数据、高并发、高吞吐的需求场景下显得尤为重要。本书会结合日常工作中的应用场景来介绍各种基础数据结构和算法,帮助读者更好地理解其中的精髓。例如,结合Java集合框架来介绍线性数据结构、集合、散列表,结合MySQL索引来介绍B+树等。深入理解数据结构与算法,对日常的软件开发工作有深刻的意义。

——优酷高级技术经理   戴洵

数据结构与算法是每个编程人员都需要掌握的基础知识。如果你是一名计算机专业的学生,那么数据结构与算法是你必学、必考的内容;如果你是一名程序员,则不论是面试还是工作,你都会遇到与数据结构、算法相关的问题。而学习过数据结构与算法的人,可能会觉得其中的内容太多、范围太广,在实际应用(包括考试与面试)中又难以抓住重点。

本书向你介绍了常用的数据结构与算法,结合在工作与面试中常遇到的题目,既有理论基础,又不脱离应用,本书还为有兴趣学习更高级的算法的读者提供了指引。如果你对数据结构与算法感兴趣,而又担心其内容深奥、不易理解,则不如先看看本书。

——步步高教育电子高级系统架构师   彭伟

算法是程序的灵魂,数据结构是算法的核心。作者灵巧生动地诉说了算法的原理及所涉及的数据结构的精髓。从目前主流技术的发展来看,算法对处于各个阶段的程序员来说十分重要。移动互联网时代已到达顶点,内容变成了当前的主流趋势。对于优质的内容,传统的人工运营方式已经不能满足人们的需求,机器学习、数据挖掘会成为内容运营的中坚力量。在数据挖掘和机器学习的过程中,理解和运用基础算法是取得成功的关键。本书很适合对算法感兴趣但又不想钻研晦涩算法书籍的朋友阅读。

——猎豹移动数据分析师   刘德顺


展开
精彩书摘

12.2  新兴算法

12.2.1  加密算法

加密算法其实不算是新兴算法,却是最近人们一直在讨论的内容。在MD5加密被碰撞破解之后,人们开始考虑各种各样的加密实现了。

这里给大家介绍几种常用的加密算法。

从理论上说,摘要算法也属于加密算法,MD5、SHA系列的算法都是摘要算法,是不可逆的,也就是无法解密的。

而RSA、3DES之类的可逆算法,是可以解密的。

加密算法又分为对称加密算法和非对称加密算法。对称加密算法使用同一密钥进行加解密;而非对称加密算法使用不同的密钥进行加解密。

当然,除了我们应该熟知的这些常用的加密算法,还有很多很少见的算法,比如椭圆曲线算法等。

12.2.2  商业算法

其实,近年来有很多新兴算法,因为人们在不断地探索更好的东西,去改变或者适应更好的业务。

很多算法是为了具体的产品而设计出来的。

比如图像识别算法,为了保证互联网用户上传的内容是健康的,我们需要一定的算法去识别图片中有没有不好的内容,比如用户在新浪微博、微信朋友圈上传的图片等,这靠人工审核是完全不可能做到的。

又比如推荐算法,若在淘宝上买东西,就总能看到向我们推荐的相关商品,这是如何推荐和排序的?这就是算法的作用。淘宝的商品那么多,如何能够达到秒级推荐?当然,没有一个良好的算法设计是不可能做到的。

12.3  其他算法

12.3.1  基数估计算法

给定一个数据集,求解数据集的基数(Cardinality,也译作“势”,表示一个数据集中不同数据项的数量)是非常普遍的需求。许多业务需求最终可以归结为基数求解,例如网站访问分析中的UV(访客数,指在一段时间内访问网站的不同用户的数量)。由于数据集基数是不可聚集指标(两个数据集的总基数无法通过各自的基数进行简单计算),因此如果要得到N个数据集任意组合的基数,则需要2N次数据集的重计算,这是一个复杂度非常高的计算过程。当数据量较小时,可以采取bitmap“按位或”方法获得较高的计算速度;而当数据量很大时,一般会采取概率算法对基数进行估计。

假如我们有一个巨大的含有重复数据项的数据集,无法将其全部放到内存中进行处理,若想知道其中有多少不同的元素,由于数据集没有排好序,则对如此大的一个数据集进行排序和计数几乎是不可行的,这时该怎么办呢?

这就是一个典型的应用了,当然,这一切没有那么简单。

我们发现,在很多商业应用中,在某些情况下是允许我们对大量数据集的计算结果有偏差或者错误的,但错误的范围是多少,性能好多少,是验证这个算法好坏的标准。

12.3.2  蚁群算法

每个蚂蚁会在没有事先告诉它们食物在什么地方的前提下开始寻找食物。当一只蚂蚁找到食物后,它会向环境释放一种挥发性分泌物pheromone(叫作信息素,该物质随着时间的推移会逐渐挥发、消失,信息素浓度的大小表征路径的远近),吸引其他蚂蚁过来,这样越来越多的蚂蚁会找到食物。有些蚂蚁并没有像其他蚂蚁一样总重复同样的路,它们会另辟蹊径,如果另开辟的道路比原来的道路更短,那么渐渐地,更多的蚂蚁会被吸引到这条较短的路上来。最后,经过一段时间的运行,可能会出现一条最短的路径被大多数蚂蚁使用。

这就是蚁群算法(Ant Colony Optimization,ACO),又称蚂蚁算法,是一种用来在图中寻找优化路径的几率型算法。

淘宝也有一个类似的算法,它将人们进行了兴趣分类,认为某类人有着相同的兴趣,把各类有相同兴趣的人喜欢的东西集合(这个分类一定是非常细致的),这样就可以方便地为人们推荐更好的商品了。


展开
目录

第1章  数组、集合和散列表 1
1.1  要用就要提前想好的数据结构―数组 2
1.1.1  什么是数组 2
1.1.2  数组的存储结构 3
1.1.3  数组的特点 6
1.1.4  数组的适用场景 7
1.2  升级版数组―集合 8
1.2.1  什么是集合 8
1.2.2  集合的实现 8
1.2.3  集合的特点 13
1.2.4  集合的适用场景 13
1.2.5  数组与变长数组的性能 14
1.3  数组的其他应用―散列表 14
1.3.1  什么是散列表 15
1.3.2  对散列表函数产生冲突的解决办法 16
1.3.3  散列表的存储结构 17
1.3.4  散列表的特点 18
1.3.5  散列表的适用场景 20
1.3.6  散列表的性能分析 21
1.4  小结 28
第2章  栈、队列、链表 29
2.1  汉诺塔游戏―栈 30
2.1.1  什么是汉诺塔 30
2.1.2  什么是栈 31
2.1.3  栈的存储结构 31
2.1.4  栈的特点 36
2.1.5  栈的适用场景 36
2.2  火爆的奶茶店―队列 37
2.2.1  什么是队列 37
2.2.2  队列的存储结构 38
2.2.3  队列的特点 43
2.2.4  队列的适用场景 44
2.3  用栈实现队列 45
2.3.1  用两个栈实现队列 46
2.3.2  两个队列实现栈 50
2.4  链表 53
2.4.1  什么是链表 54
2.4.2  链表的存储结构 54
2.4.3  链表的操作 55
2.4.4  链表的特点 66
2.4.5  链表的适用场景 66
2.4.6  链表的性能分析 67
2.4.7  面试举例:如何反转链表 68
2.5  链表其实也可以用数组模拟 69
2.5.1  静态链表 70
2.5.2  静态链表的实现 70
2.5.3  静态链表的特点 80
2.6  再谈汉诺塔 81
2.6.1  汉诺塔的移动原理 81
2.6.2  汉诺塔的递归实现 82
第3章  排序算法 84
3.1  算法基础 85
3.1.1  时间复杂度 85
3.1.2  空间复杂度 88
3.1.3  稳定性 88
3.2  快而简单的排序―桶排序 89
3.2.1  举个例子 89
3.2.2  什么是桶排序 90
3.2.3  桶排序的实现 90
3.2.4  桶排序的性能及特点 92
3.2.5  桶排序的适用场景 93
3.3  咕嘟咕嘟的冒泡排序 94
3.3.1  什么是冒泡排序 94
3.3.2  冒泡排序的原理 94
3.3.3  冒泡排序的实现 96
3.3.4  冒泡排序的特点及性能 99
3.3.5  冒泡排序的适用场景 99
3.3.6  冒泡排序的改进方案 100
3.4  最常用的快速排序 100
3.4.1  什么是快速排序 101
3.4.2  快速排序的原理 101
3.4.3  快速排序的实现 105
3.4.4  快速排序的特点及性能 107
3.4.5  快速排序的适用场景 108
3.4.6  快速排序的优化 108
3.5  简单的插入排序 109
3.5.1  什么是插入排序 110
3.5.2  插入排序的原理 110
3.5.3  插入排序的实现 112
3.5.4  插入排序的特点及性能 114
3.5.5  插入排序的适用场景 115
3.6  直接插入的改进―希尔排序 115
3.6.1  什么是希尔排序 116
3.6.2  希尔排序的原理 116
3.6.3  希尔排序的实现 118
3.6.4  希尔排序的特点及性能 120
3.6.5  希尔排序的适用场景 121
3.7  简单选择排序 121
3.7.1  什么是选择排序 122
3.7.2  简单选择排序的原理 122
3.7.3  简单选择排序的实现 123
3.7.4  选择排序的特点及性能 125
3.7.5  简单选择排序的优化 125
3.7.6  选择排序的适用场景 126
3.8  小结 126
第4章  搜索,没那么难 128
4.1  最先想到的―顺序查找 129
4.1.1  最先想到的 129
4.1.2  顺序查找的原理与实现 129
4.1.3  顺序查找的特点及性能分析 131
4.1.4  顺序查找的适用场景 132
4.2  能不能少查点―二分查找 133
4.2.1  某些特殊情况的查找需求 133
4.2.2 二分查找的原理及实现 133
4.2.3 二分查找的优化 137
4.2.4 二分查找的特点及性能分析 138
4.2.5 二分查找的适用场景 139
4.2.6 我是来还债的―之前欠的二分插入排序 139
4.3 行列递增的矩阵查找―二分查找思维拓展 141
4.3.1 一道题 142
4.3.2 几个解法 142
4.3.3  其他拓展 153
4.4 分块查找 154
4.4.1 每次插入元素都要有序吗 154
4.4.2 什么是分块查找 155
4.4.3 分块查找的原理及实现 155
4.4.4 分块查找的特点与性能分析 159
4.4.5 分块查找的适用场景 160
4.5 查找算法小结 161
4.6 搜索引擎与倒排索引 162
4.6.1 什么是搜索引擎 162
4.6.2 倒排索引 162
4.6.3 索引实例 163
4.6.4 倒排索引的关键字提取 164
4.6.5 商业索引的其他拓展 164
第5章  树 166
5.1  树的定义及存储结构 167
5.1.1  什么是树 167
5.1.2  其他相关术语 168
5.1.3  都有哪些树 170
5.1.4  树的存储结构及实现 170
5.2  二叉树 173
5.2.1  什么是二叉树 173
5.2.2  还有两种特殊的二叉树 173
5.2.3  二叉树的实现 175
5.2.4  二叉树的遍历 185
5.2.5  完全二叉树 187
5.3  二叉树的查找算法 188
5.3.1  二叉查找树 188
5.3.2  平衡二叉树 198
5.4  B-树、B+树 202
5.4.1  什么是B-树 203
5.4.2  什么是B+树 204
5.4.3  B-树、B+树的特点及性能分析 205
5.5  在MySQL数据库中是如何应用B+树的 206
5.6  哈夫曼树 209
5.6.1  几个术语 209
5.6.2  什么是哈夫曼树 209
5.6.3  哈夫曼树的构造 211
5.6.4  哈夫曼编码及解码 213
5.7  堆 215
5.7.1  什么是堆 215
5.7.2  堆的基本操作 216
5.7.3  堆的性能分析 221
5.7.4  堆排序 222
5.8  红黑树 224
5.8.1  什么是红黑树 224
5.8.2  红黑树的特点与优势 224
第6章  图 226
6.1  图的定义及相关术语 227
6.1.1  什么是图 227
6.1.2  图的分类 227
6.1.3  图的相关术语 228
6.2  图的表示与存储方式 229
6.2.1  邻接矩阵 229
6.2.2  邻接表 234
6.3  更多的图 237
6.3.1  连通图 238
6.3.2  强连通图 238
6.4  深度优先遍历与广度优先遍历 238
6.4.1  深度优先遍历 239
6.4.2  广度优先遍历 248
6.4.3  两种遍历方法的对比 253

6.5  最短路径 254
6.5.1  带权图 254
6.5.2  Dijkstra算法 255
6.5.3  Floyd算法 269
第7章  字符串 272
7.1  字符及字符串简介 273
7.1.1  什么是字符 273
7.1.2  什么是字符串 273
7.2  字符的全排列 275
7.2.1  问题描述及分析 275
7.2.2  最先想到的 275
7.2.3  利用字典序排列 278
7.3  反转字符串 283
7.3.1  问题描述及分析 283
7.3.2  最先想到的 283
7.3.3  对换反转法 285
7.3.4  拓展―旋转字符串 287
7.4  判断回文 288
7.4.1  问题描述及分析 288
7.4.2  对半判断 289
7.5  寻找最大的回文子串 290
7.5.1  问题描述及分析 290
7.5.2  遍历实现 291
7.6  将字符串转换为数字 293
7.6.1  问题描述及分析 293
7.6.2  解决 293
7.7  判断字符串包含的问题 297
7.7.1  问题描述及分析 297
7.7.2  非常简单的解决思路 297
7.7.3  利用排序进行优化 299
7.7.4  投机取巧的素数方案 302
7.7.5  用散列表进行实现 304
7.7.6  用位运算进行实现 305
第8章  数组还有好多玩法 308
8.1  从数组中找出其和为指定值的两个数 309
8.1.1  问题描述及分析 309
8.1.2  最简单的办法 309
8.1.3  一切为了速度 310
8.1.4  排序总是好的选择 311
8.1.5  还能更好 313
8.2  找出连加值最大的子数组 315
8.2.1  问题描述及分析 315
8.2.2  暴力穷举法 316
8.2.3  动态规划法 319
8.2.4  问题拓展 321
8.3  数组正负值排序 323
8.3.1  问题描述及分析 323
8.3.2  最直观的解法 324
8.3.3  借鉴简单插入排序 325
8.3.4  借鉴快速排序 327
8.3.5  拓展 329
8.4  将数组随机打乱顺序 329
8.4.1  问题描述及分析 329
8.4.2  随便糊弄一下 330
8.4.3  插入排序的思想又来了 331
8.5  数组赋值 333
8.5.1  问题描述及分析 333
8.5.2  分解计算 333
8.6  寻找旋转数组的拐点 335
8.6.1  问题描述及分析 335
8.6.2  最简单的方法 336
8.6.3  利用“有序” 337
8.7  荷兰国旗问题 339
8.7.1  问题描述及分析 339
8.7.2  排序法 340
8.7.3  快速排序带给人的灵感 340
第9章  查找又来了 344
9.1  出现次数超过一半的数字 345
9.1.1  问题描述及分析 345
9.1.2  排序法 345
9.1.3  散列表 347
9.1.4  删除法 349
9.1.5  更优的解法 349
9.2  寻找缺少的数字 352
9.2.1  问题描述及分析 352
9.2.2  借助快速排序 352
9.2.3  借助散列表实现 354
9.2.4  投机取巧法 355
9.2.5  思路拓展 357
9.3  在10亿个数中找出最大的1万个数 357
9.3.1  问题描述及分析 357
9.3.2  拍脑袋想问题 358
9.3.3  借助快速排序 358
9.3.4  不想都放入内存 358
9.3.5  传说中的大顶堆 359
9.3.6  拓展―找出数组中第k大的数 359
第10章  更多 363
10.1  不使用额外的空间交换两个数 364
10.1.1  问题描述 364
10.1.2  分析问题 364
10.1.3  解决问题 364
10.2  拿乒乓球的问题 365
10.2.1  问题描述 365
10.2.2  分析问题 365
10.2.3  解决问题 365
第11章  实现一些集合类 367
11.1  栈(Stack)的实现 368
11.1.1  实现前的思考 368
11.1.2  实现栈 368
11.1.3  参考JDK的实现 372
11.2  变长数组(ArrayList)的实现 372
11.2.1  实现前的思考 372
11.2.2  实现变长数组 373
11.2.3  参考JDK的实现 380
11.3  散列表(HashMap)的实现 381
11.3.1  实现前的思考 381
11.3.2  实现散列表 381
11.3.3  参考JDK的实现 389
第12章  方向 390
12.1  算法的一些常用思想 391
12.1.1  分治法 391
12.1.2  动态规划 391
12.1.3  贪心算法 391
12.1.4  回溯法 392
12.1.5  分支限界法 392
12.2  新兴算法 392
12.2.1  加密算法 392
12.2.2  商业算法 393
12.3  其他算法 393
12.3.1  基数估计算法 393
12.3.2  蚁群算法 394

展开
加入书架成功!
收藏图书成功!
我知道了(3)
发表书评
读者登录

请选择您读者所在的图书馆

选择图书馆
浙江图书馆
点击获取验证码
登录
没有读者证?在线办证