新書推薦:
《
6S精益管理实战(精装版)
》
售價:HK$
103.3
《
异域回声——晚近海外汉学之文史互动研究
》
售價:HK$
112.7
《
世界文明中的作物迁徙:聚焦亚洲、中东和南美洲被忽视的本土农业文明
》
售價:HK$
102.4
《
无端欢喜
》
售價:HK$
78.2
《
股票大作手操盘术
》
售價:HK$
55.2
《
何以中国·何谓唐代:东欧亚帝国的兴亡与转型
》
售價:HK$
89.7
《
一间只属于自己的房间 女性主义先锋伍尔夫代表作 女性精神独立与经济独立的象征,做自己,比任何事都更重要
》
售價:HK$
45.8
《
泉舆日志 幻想世界宝石生物图鉴
》
售價:HK$
137.8
|
編輯推薦: |
★ 语言轻松易懂,不照本宣科
★ 不仅有原理,还有适用场景
★ 更有互联网应用案例与经验
★ 不论面试还是工作都能让你抓到重点
★ 适合不想钻研晦涩算法书籍的读者
★ 关注算法的具体实践应用
★ 理解和应用算法才是成功的关键
|
內容簡介: |
本书共分为12个章节,首先介绍了一些基础的数据结构,以及常用的排序算法和查找算法;其次介绍了两个稍微复杂一些的数据结构树和图,还介绍了每种数据结构和算法的适用场景,之后是一些在工作与面试中的实际应用,以字符串、数组、查找等为例介绍了一些常见的互联网面试题及分析思路,便于读者了解这些思路,顺利地通过互联网公司的面试;最后介绍了一些常见的算法思想,便于读者对今后遇到的算法问题更轻易地想出解决方案。本书的讲解轻松有趣,易于读者把烦琐、枯燥的算法学习变为有趣、愉快的学习,把被动学习变为主动学习。本书也介绍了一些会在工作面试中用到的算法。对于一些正在学习算法的人来说,本书绝对是可以帮你轻松掌握算法的辅助资料;对于已经了解算法的人来说,可以从本书中了解到这些算法是如何在实际工作中使用的。本书适合即将毕业的学生、初入职场的工程师及想补充基础算法知识的人学习,也适合作为一本互联网公司面试的参考书,更是一本不可多得的便于读者时常补习算法知识的收藏宝典。
|
關於作者: |
赵烨,Java高级研发工程师。现就职于优酷土豆的来疯直播团队。主要关注高并发、高可用、系统性能优化等内容。乐于学习、乐于分享。博客地址irfen.me。
|
目錄:
|
目录
第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 问题描述及
|
內容試閱:
|
前言
互联网越来越热门了,相信每个人都或多或少地在体验如今的互联网带给我们的各种便利。借助之前非常火热的电商,我们可以足不出户地购买衣服和日常用品;现在,就算是一个超级宅的人,也可以不出门便可完成订餐、在线交水电费、通过各种到家服务进行保洁和按摩、通过应用将在超市买的东西轻松配送到家,等等。在线办公在一些行业中也开始流行,视频会议更是可以轻松地实现异地交流。之前我们还需要见面签约,现在越来越多地在进行在线签约。
不得不感谢互联网带给我们的各种便利,但这背后是由很多产品、运营和技术人员的努力在支撑的。
我最初所在的公司属于传统行业,但也是一家服务与互联网公司。相信任何行业的技术员工都想进入互联网公司,这其中的好处有太多:技术的挑战、大用户量、大数据、高并发,这些都是我们所渴望的。
经常听到身边有很多人在抱怨算法不好学、学会了记不住、记住了不知道怎么用等,所以我决定写本书,结合自己的经验讲解一些算法的实际应用及适用场景,希望通过本书帮助更多的朋友进入互联网公司。
其实很多人怯场时无非担心的是自己的算法太差、技术太烂、别人会瞧不起,等等。本书可以帮助读者解决一些基础、常见的算法问题,当然,在技术上仍需自己努力,若再有一点运气,则一定可以找到理想的公司。不要害怕,很多时候就算没有面试成功,也应该总结一下,等过段时间后便能感悟到自己的成长。
算法有很多,而且不停地有新的算法出现。本书将介绍其中一些比较基础且常用的算法,当然,会先简单介绍几个基础的数据结构作为学习算法的铺垫;之后会介绍一些在工作中可能用到的算法;最后会介绍一些新兴的算法,以拓展读者的思路。
我会尽量以轻松、愉快的方式介绍每一个算法,由浅入深地介绍如何在工作中使这些算法变成我们的代码,让我们在开发应用时更高效。
|
|