新書推薦:
《
FANUC工业机器人装调与维修
》
售價:HK$
99.7
《
吕著中国通史
》
售價:HK$
62.7
《
爱琴海的光芒 : 千年古希腊文明
》
售價:HK$
199.4
《
不被他人左右:基于阿德勒心理学的无压力工作法
》
售價:HK$
66.1
《
SDGSAT-1卫星热红外影像图集
》
售價:HK$
445.8
《
股市趋势技术分析(原书第11版)
》
售價:HK$
221.8
《
汉匈战争全史
》
售價:HK$
99.7
《
恶的哲学研究(社会思想丛书)
》
售價:HK$
109.8
|
編輯推薦: |
小灰的算法故事给算法这颗炮弹包上了糖衣,让算法的威力潜藏于内,外表不再吓人,萌萌哒Q弹可爱。
从基本数据结构,到各类常用算法,再到面试算法,再到职场应用,书中的主角小灰和大黄带领大家逐个破解。
和一群快乐的小仓鼠共同领悟算法思想、理解算法对内存空间和性能的影响,并开动脑筋去寻求解决问题的高效方案。
|
內容簡介: |
本书通过虚拟的主人公小灰的心路历程,用漫画的形式讲述了算法和数据结构的基础知识、复杂多变的算法面试题目及算法的实际应用场景。
第1章 介绍了算法和数据结构的相关概念,告诉大家算法是什么,数据结构又是什么,它们有哪些用途,如何分析时间复杂度,如何分析空间复杂度。
第2章 介绍了*基本的数据结构,包括数组、链表、栈、队列、哈希表的概念和读写操作。
第3章 介绍了树和二叉树的概念、二叉树的各种遍历方式、二叉树的特殊形式二叉堆和优先队列的应用。
第4章 介绍了几种典型的排序算法,包括冒泡排序、快速排序、堆排序、计数排序、桶排序。
第5章 介绍了10余道职场上流行的算法面试题及详细的解题思路。例如怎样判断链表有环,怎样计算大整数相加等。
第6章 介绍了算法在职场上的一些应用,例如使用LRU算法来淘汰冷数据,使用Bitmap算法来统计用户特征等。
|
關於作者: |
魏梦舒(@程序员小灰):微信公众号程序员小灰的作者,多年的软件行业从业经验,先后在京东金融和摩拜科技从事研发工作,对算法有一定的兴趣和经验。
|
目錄:
|
第1章 算法概述 1
1.1 算法和数据结构 1
1.1.1 小灰和大黄 1
1.1.2 什么是算法 3
1.1.3 什么是数据结构 7
1.2 时间复杂度 8
1.2.1 算法的好与坏 8
1.2.2 基本操作执行次数 10
1.2.3 渐进时间复杂度 12
1.2.4 时间复杂度的巨大差异 15
1.3 空间复杂度 16
1.3.1 什么是空间复杂度 16
1.3.2 空间复杂度的计算 19
1.3.3 时间与空间的取舍 21
1.4 小结 22
第2章 数据结构基础 23
2.1 什么是数组 23
2.1.1 初识数组 23
2.1.2 数组的基本操作 26
2.1.3 数组的优势和劣势 32
2.2 什么是链表 33
2.2.1 正规军和地下党 33
2.2.2 链表的基本操作 35
2.3 栈和队列 42
2.3.1 物理结构和逻辑结构 42
2.3.2 什么是栈 43
2.3.3 栈的基本操作 44
2.3.4 什么是队列 45
2.3.5 队列的基本操作 46
2.3.6 栈和队列的应用 50
2.4 神奇的散列表 51
2.4.1 为什么需要散列表 51
2.4.2 哈希函数 54
2.4.3 散列表的读写操作 55
2.5 小结 59
第3章 树 61
3.1 树和二叉树 61
3.1.1 什么是树 61
3.1.2 什么是二叉树 64
3.1.3 二叉树的应用 67
3.2 二叉树的遍历 71
3.2.1 为什么要研究遍历 71
3.2.2 深度优先遍历 73
3.2.3 广度优先遍历 84
3.3 什么是二叉堆 88
3.3.1 初识二叉堆 88
3.3.2 二叉堆的自我调整 90
3.3.3 二叉堆的代码实现 95
3.4 什么是优先队列 98
3.4.1 优先队列的特点 98
3.4.2 优先队列的实现 99
3.5 小结 103
第4章 排序算法 105
4.1 引言 105
4.2 什么是冒泡排序 107
4.2.1 初识冒泡排序 107
4.2.2 冒泡排序的优化 110
4.2.3 鸡尾酒排序 114
4.3 什么是快速排序 118
4.3.1 初识快速排序 118
4.3.2 基准元素的选择 120
4.3.3 元素的交换 122
4.3.4 单边循环法 125
4.3.5 非递归实现 128
4.4 什么是堆排序 131
4.4.1 传说中的堆排序 131
4.4.2 堆排序的代码实现 134
4.5 计数排序和桶排序 137
4.5.1 线性时间的排序 137
4.5.2 初识计数排序 138
4.5.3 计数排序的优化 140
4.5.4 什么是桶排序 145
4.6 小结 149
第5章 面试中的算法 150
5.1 踌躇满志的小灰 150
5.2 如何判断链表有环 151
5.2.1 一场与链表相关的面试 151
5.2.2 解题思路 155
5.2.3 问题扩展 158
5.3 最小栈的实现 161
5.3.1 一场关于栈的面试 161
5.3.2 解题思路 163
5.4 如何求出最大公约数 166
5.4.1 一场求最大公约数的面试 166
5.4.2 解题思路 168
5.5 如何判断一个数是否为2的整数次幂 173
5.5.1 一场很2的面试 173
5.5.2 解题思路 175
5.6 无序数组排序后的最大相邻差 178
5.6.1 一道奇葩的面试题 178
5.6.2 解题思路 179
5.7 如何用栈实现队列 184
5.7.1 又是一道关于栈的面试题 184
5.7.2 解题思路 186
5.8 寻找全排列的下一个数 191
5.8.1 一道关于数字的题目 191
5.8.2 解题思路 193
5.9 删去k个数字后的最小值 196
5.9.1 又是一道关于数字的题目 196
5.9.2 解题思路 198
5.10 如何实现大整数相加 205
5.10.1 加法,你会不会 205
5.10.2 解题思路 206
5.11 如何求解金矿问题 211
5.11.1 一个关于财富自由的问题 211
5.11.2 解题思路 213
5.12 寻找缺失的整数 223
5.12.1 五行缺一个整数 223
5.12.2 问题扩展 225
第6章 算法的实际应用 230
6.1 小灰上班的第1天 230
6.2 Bitmap的巧用 232
6.2.1 一个关于用户标签的需求 232
6.2.2 用算法解决问题 234
6.3 LRU算法的应用 241
6.3.1 一个关于用户信息的需求 241
6.3.2 用算法解决问题 243
6.4 什么是A星寻路算法 249
6.4.1 一个关于迷宫寻路的需求 249
6.4.2 用算法解决问题 251
6.5 如何实现红包算法 262
6.5.1 一个关于钱的需求 262
6.5.2 用算法解决问题 264
6.6 算法之路无止境 268
|
內容試閱:
|
推荐序
初识小灰是因为在他的微信公众号看到一篇讲动态规划的文章,当时觉得挺意外,没想到还能有人用漫画来解释动态规划算法。
所谓算法,其实是个很宽泛的概念。有理解起来难度超大,烧脑到要爆炸的;也有简单直接,一目了然的;更多的却是,虽然看起来复杂,但只要方法得当,搞清原理,掌握起来还是很容易的那种算法。
可是很多人被算法二字狰狞的外表吓住了,久久不敢接触它。好不容易斗胆翻翻算法书,结果看到的不是大篇大篇的代码,就是乱七八糟的符号。这都是什么呀?!算了,看来是学不会算法了,放弃吧
但凡书籍文章,最难读的,肯定是公式符号;而最好读的,无外乎图像、对话等。本书作者以可爱的小灰和大黄两个漫画形象为主人公,把对算法的描述过程嵌入到它们的对话之中,并辅之以图形等直观方式来表达数据结构和操作步骤这种表达形式带着天然的亲和力,完全没有计算机背景的读者读来也不觉得生硬。
小灰所做的事情,就是给算法这颗炮弹包上了糖衣,让算法的威力潜藏于内,外表不再吓人,反而变得萌萌哒,Q弹可爱,清新怡人。
先干为敬,让我们一起吞了这颗包着炸药的糖丸吧!
李烨,微软高级软件工程师
许多程序员对算法望而生畏,认为算法是一门高深莫测的学问。
以前我曾经面试过一个求职者,起初考查他的技术功底和项目经验,他都回答得不错。接下来我对他说:OK,那我考查一下你的算法水平吧。
题目还没说出口,该求职者立马摆摆手说:不要不要,我算法不行的!
我还是有些不甘心,接着说道:我只考查最基础的,你说说冒泡排序的基本思路吧!
他仍旧说:我不知道,我算法一点都不会
算法真的那么难,真的那么无趣吗?
恰恰相反,算法是编程领域中最有意思的一块内容,也不像许多人想象的那样难以驾驭。
许多人把算法比作程序员的内功,但笔者觉得这个比喻并不是很恰当。内功实实在在,没有任何巧妙可言,而算法天马行空,千变万化,就像金庸笔下令狐冲的一套独孤九剑。
学习算法,我们不需要死记硬背那些冗长复杂的背景知识、底层原理、指令语法需要做的是领悟算法思想、理解算法对内存空间和性能的影响,以及开动脑筋去寻求解决问题的最佳方案。相比编程领域的其他技术,算法更纯粹,更接近数学,也更具有趣味性。
我一直希望写出一些东西,让更多的IT同行能够领略到算法的魅力,可是用什么方式来写呢?
2016年9月,一次突如其来的灵感让我创造了一个初出茅庐的菜鸟程序员形象,这个菜鸟程序员名叫小灰。
程序员小灰的故事活跃在同名的微信公众号上,该公众号用漫画的形式诉说着小灰一次又一次的面试经历,倔强的小灰屡战屡败,屡败屡战。小灰是我刚刚入行时的真实写照,相信许多程序员也能从中看到自己的影子。
终于,在朋友们的支持和鼓励下,程序员小灰的故事从微信公众号搬到了纸质图书上。能让更多同行看到小灰的故事,我感到十分欣慰。
本书特色
这本书通过漫画的形式,讲述了小灰学习算法和数据结构知识的心路历程。书中许多内容源于本人的微信公众号,但是比公众号上所展现的内容更加系统、全面,也更加严谨。
本书的前4章是对算法基础知识的讲解,没有算法和数据结构基础的读者可以从头开始进行系统学习。
前 言
对于有一定基础的读者,也可以选择从第5章面试题的讲解开始阅读,每一道面试题目都是相对独立的,并不需要严格地按顺序学习。同时,也推荐大家适当看看前面的内容,巩固一下自己的算法知识体系。
这不是一本编程入门书。在编程方面完全零基础的读者,建议至少先了解一门编程语言。
这也不是一本局限于某个编程语言的书,虽然书中的代码示例都是用Java来实现的,但算法思想是相通的。在实现代码时,书中尽可能规避了Java语言的特殊语法和工具类,相信熟悉其他语言的开发者也不难看懂。
勘误和支持
除书中所提供的代码示例以外,大家也可以关注微信公众号程序员小灰,在后台回复漫画算法,获得全书完整的、可运行的代码。为了保证代码的简洁,在部分代码实现中省略了烦琐的参数判空和验证逻辑。由于作者水平有限,书中难免会出现一些错误,恳请广大读者批评指正。
读者如果在阅读过程中产生疑问或发现Bug,欢迎随时到微信公众号的后台留言。
程序员小灰微信公众号二维码如下。
致谢
感谢微信公众号程序员小灰的读者。你们的鼓励和支持,给了我坚持创作的动力。感谢成都道然科技有限责任公司的姚新军老师。有了他的肯定、支持和指导意见,才有了这本书的正式出版。
感谢朴提、单耳和康慧三位插画师所画的精彩插画,是你们让小灰的形象更丰满、更可爱。感谢为本书审稿的杨道谈先生,感谢为本书写序的李烨老师,感谢在百忙之中阅读书稿并写书评的专家们,他们是刘欣、张洪亮、安晓辉、李艳鹏、翟永超等。
特别感谢我的父母,是他们把我带进了数学的大门。在我上小学的时候,是他们的坚持,才让我有机会学习奥数,参加数学竞赛,并对数学和逻辑产生了兴趣。在这本书的写作过程中,又是他们辛苦努力屏蔽生活琐事对我的干扰,让我能够全身心地投入到本书的写作当中。
谨以此书献给我的家人,我的读者,以及热爱编程的朋友们!
魏梦舒,微信公众号程序号小灰的作者
|
|