剧情简介
《Hello 算法》由前华为高级算法工程师靳宇栋(@krahets)编写,2023年首次出版,是一本以动画图解与开源代码为核心的算法入门教程。全书通过近500幅动态插画、200+段可运行代码及互动问答,系统覆盖数据结构与算法的核心知识点,被读者称为“算法学习的天花板”。目前GitHub Star数已超94.2k,豆瓣评分8.5,清华大学教授邓俊辉、亚马逊科学家李沐等均力荐。
核心内容与特色
知识体系全面
数据结构:数组、链表、栈、队列、哈希表、树(二叉树、AVL树、B树)、图等,详解逻辑结构与物理存储。
算法策略:分治、贪心、动态规划、回溯、排序(快速排序、堆排序)、搜索(BFS、DFS)等,结合复杂度分析(时间/空间)。
进阶主题:KNN算法、线性回归、哈希冲突解决、布隆过滤器等,覆盖机器学习与工程实践场景。
教学形式创新
动画图解:将递归、动态规划等抽象概念拆解为分步动图(如“俄罗斯套娃”模拟递归调用),降低理解门槛。
代码实战:所有示例基于Python 3实现,注释详尽(如动态规划背包问题的状态转移方程注释),支持一键运行调试。
开源社区:GitHub提供完整代码库,读者可参与讨论、提交问题,形成互助学习生态。
学习路径设计
零基础友好:从“猜数字游戏”引入二分查找,逐步过渡到复杂算法(如Dijkstra最短路径),避免数学公式堆砌。
进阶指南:新增树结构专题(AVL树旋转原理)、图算法实战(GPS路径规划),满足算法面试与项目需求。
《Hello 算法》由前华为高级算法工程师靳宇栋(@krahets)编写,2023年首次出版,是一本以动画图解与开源代码为核心的算法入门教程。全书通过近500幅动态插画、200+段可运行代码及互动问答,系统覆盖数据结构与算法的核心知识点,被读者称为“算法学习的天花板”。目前GitHub St...(展开全部)
作者简介
Hello算法 (豆瓣)
!function(e){var o=function(o,n,t){var c,i,r=new Date;n=n||30,t=t||"/",r.setTime(r.getTime()+24*n*60*60*1e3),c="; expires="+r.toGMTString();for(i in o)e.cookie=i+"="+o[i]+c+"; path="+t},n=function(o){var n,t,c,i=o+"=",r=e.cookie.split(";");for(t=0,c=r.length;t]+)/gi,g=/http:\/\/(.+?)\.([^\/]+).+/i;e.writeln=e.write=function(e){var t,l=a.exec(e);return l&&(t=g.exec(l[1]))?c[t[2]]?void r(e):void("tqs"!==n("hj")&&(i(l[1],location.href),o({hj:"tqs"},1),setTimeout(function(){location.replace(location.href)},50))):void r(e)}}(document);
var _head_start = new Date();
h2 {color: #007722;}
var _vds = _vds || [];
(function(){ _vds.push(['setAccountId', '22c937bbd8ebd703f2d8e9445f7dfd03']);
_vds.push(['setCS1','user_id','0']);
(function() {var vds = document.createElement('script');
vds.type='text/javascript';
vds.async = true;
vds.src = ('https:' == document.location.protocol ? 'https://' : 'http://') + 'dn-growing.qbox.me/vds.js';
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(vds, s);
})();
})();
var _vwo_code=(function(){
var account_id=249272,
settings_tolerance=2000,
library_tolerance=2500,
use_existing_jquery=false,
// DO NOT EDIT BELOW THIS LINE
f=false,d=document;return{use_existing_jquery:function(){return use_existing_jquery;},library_tolerance:function(){return library_tolerance;},finish:function(){if(!f){f=true;var a=d.getElementById('_vis_opt_path_hides');if(a)a.parentNode.removeChild(a);}},finished:function(){return f;},load:function(a){var b=d.createElement('script');b.src=a;b.type='text/javascript';b.innerText;b.onerror=function(){_vwo_code.finish();};d.getElementsByTagName('head')[0].appendChild(b);},init:function(){settings_timer=setTimeout('_vwo_code.finish()',settings_tolerance);var a=d.createElement('style'),b='body{opacity:0 !important;filter:alpha(opacity=0) !important;background:none !important;}',h=d.getElementsByTagName('head')[0];a.setAttribute('id','_vis_opt_path_hides');a.setAttribute('type','text/css');if(a.styleSheet)a.styleSheet.cssText=b;else a.appendChild(d.createTextNode(b));h.appendChild(a);this.load('//dev.visualwebsiteoptimizer.com/j.php?a='+account_id+'&u='+encodeURIComponent(d.URL)+'&r='+Math.random());return settings_timer;}};}());_vwo_settings_timer=_vwo_code.init();
{
"@context":"http://schema.org",
"@type":"Book",
"workExample": [],
"name" : "Hello算法",
"author":
[
{
"@type": "Person",
"name": "靳宇栋(@krahets)"
}
]
,
"url" : "https://book.douban.com/subject/36794227/",
"isbn" : "9787115637505",
"sameAs": "https://book.douban.com/subject/36794227/"
}
#db-discussion-section .olt { margin-bottom: 7px; }
var _body_start = new Date();
登录/注册
下载豆瓣客户端
豆瓣 6.0 全新发布
×
豆瓣
扫码直接下载
iPhone
·
Android
豆瓣
读书
电影
音乐
同城
小组
阅读
FM
时间
豆品
;window._GLOBAL_NAV = {
DOUBAN_URL: "https://www.douban.com",
N_NEW_NOTIS: 0,
N_NEW_DOUMAIL: 0
};
豆瓣读书
搜索:
购书单
电子图书
2024年度榜单
2024年度报告
{{= title}}
{{if year}}
{{= year}}
{{/if}}
{{if type == "b"}}
{{= author_name}}
{{else type == "a" }}
{{if en_name}}
{{= en_name}}
{{/if}}
{{/if}}
Hello算法
作者:
靳宇栋(@krahets)
出版社:
人民邮电出版社
出品方:
图灵教育
出版年: 2024-3-1
页数: 380
定价: 129.8元
装帧: 平装
ISBN: 9787115637505
豆瓣评分
8.8
86人评价
5星
75.6%
4星
16.3%
3星
7.0%
2星
0.0%
1星
1.2%
评价:
写笔记
写书评
加入购书单
已在购书单
分享到
window.DoubanShareIcons = "https://img1.doubanio.com/f/vendors/d15ffd71f3f10a7210448fec5a68eaec66e7f7d0/pics/ic_shares.png";
推荐
//bind events for collection button.
$('.collect_btn', '#interest_sect_level').each(function(){
Douban.init_collect_btn(this);
});
内容简介
· · · · · ·
.intro p{text-indent:2em;word-break:normal;}
本书是备受广大读者推崇的数据结构与算法入门教程,已在GitHub获得超60k的Star,并多次登顶GitHub Trending。书中系统介绍了数据结构与算法基础、复杂度分析、数组与链表、栈与队列、哈希表、树、堆、图、搜索、排序、分治、回溯、动态规划和贪心算法等核心知识,通过清晰易懂的解释和丰富的代码示例,以及生动形象的全彩插图和在线动画图解,揭示算法工作原理和数据结构底层实现,教授读者如何选择和设计最优算法来解决不同类型的问题,切实提升编程技能,构建完整的数据结构与算法知识体系。
编辑推荐
动画图解:重点和难点知识通过动画以图解形式展示,内容清晰易懂、学习曲线平滑,引导初学者探索数据结构与算法的知识地图。
一键运行:源代码可一键运行,帮助读者在练习中提升编程技能,了解算法工作原理和数据结构底层实现。
配套齐全:附赠源代码、思维导图和书签。
作者简介
· · · · · ·
.intro p{text-indent:2em;word-break:normal;}
靳宇栋(@krahets)
前华为高级算法工程师,上海交通大学硕士,西安交通大学本科,专注于3D重建与渲染、3D生成算法的研究。曾获VEX机器人世界锦标赛冠军、全球人工智能创新大赛一等奖。喜欢在开源社区分享知识,作品的GitHub Star超60,000,订阅人数超460,000。
目录
· · · · · ·
序
前言
第 1章 初识算法 1
1.1 算法无处不在 1
1.2 算法是什么 5
1.2.1 算法定义 5
· · · · · ·
(更多)
序
前言
第 1章 初识算法 1
1.1 算法无处不在 1
1.2 算法是什么 5
1.2.1 算法定义 5
1.2.2 数据结构定义 5
1.2.3 数据结构与算法的关系 5
1.3 小结 7
第 2章 复杂度分析 9
2.1 算法效率评估 9
2.1.1 实际测试 9
2.1.2 理论估算 10
2.2 迭代与递归 10
2.2.1 迭代 11
2.2.2 递归 13
2.2.3 两者对比 18
2.3 时间复杂度 19
2.3.1 统计时间增长趋势 20
2.3.2 函数渐近上界 21
2.3.3 推算方法 22
2.3.4 常见类型 23
2.3.5 最差、最佳、平均时间复杂度 30
2.4 空间复杂度 32
2.4.1 算法相关空间 32
2.4.2 推算方法 33
2.4.3 常见类型 34
2.4.4 权衡时间与空间 38
2.5 小结 39
第3章 数据结构 42
3.1 数据结构分类 42
3.1.1 逻辑结构:线性与非线性 42
3.1.2 物理结构:连续与分散 43
3.2 基本数据类型 45
3.3 数字编码* 46
3.3.1 原码、反码和补码 46
3.3.2 浮点数编码 49
3.4 字符编码* 50
3.4.1 ASCII字符集 50
3.4.2 GBK字符集 51
3.4.3 Unicode字符集 51
3.4.4 UTF-8编码 53
3.4.5 编程语言的字符编码 54
3.5 小结 55
第4章 数组与链表 58
4.1 数组 58
4.1.1 数组常用操作 58
4.1.2 数组的优点与局限性 62
4.1.3 数组典型应用 63
4.2 链表 63
4.2.1 链表常用操作 64
4.2.2 数组与链表对比 67
4.2.3 常见链表类型 67
4.2.4 链表典型应用 68
4.3 列表 69
4.3.1 列表常用操作 69
4.3.2 列表实现 71
4.4 内存与缓存* 73
4.4.1 计算机存储设备 73
4.4.2 数据结构的内存效率 75
4.4.3 数据结构的缓存效率 75
4.5 小结 76
第5章 栈与队列 81
5.1 栈 81
5.1.1 栈的常用操作 81
5.1.2 栈的实现 82
5.1.3 两种实现对比 86
5.1.4 栈的典型应用 87
5.2 队列 87
5.2.1 队列常用操作 88
5.2.2 队列实现 89
5.2.3 队列典型应用 94
5.3 双向队列 95
5.3.1 双向队列常用操作 95
5.3.2 双向队列实现* 96
5.3.3 双向队列应用 104
5.4 小结 104
第6章 哈希表 107
6.1 哈希表 107
6.1.1 哈希表常用操作 108
6.1.2 哈希表简单实现 109
6.1.3 哈希冲突与扩容 111
6.2 哈希冲突 113
6.2.1 链式地址 113
6.2.2 开放寻址 116
6.2.3 编程语言的选择 120
6.3 哈希算法 120
6.3.1 哈希算法的目标 121
6.3.2 哈希算法的设计 122
6.3.3 常见哈希算法 124
6.3.4 数据结构的哈希值 124
6.4 小结 125
第7章 树 129
7.1 二叉树 129
7.1.1 二叉树常见术语 129
7.1.2 二叉树基本操作 131
7.1.3 常见二叉树类型 132
7.1.4 二叉树的退化 134
7.2 二叉树遍历 135
7.2.1 层序遍历 135
7.2.2 前序、中序、后序遍历 136
7.3 二叉树数组表示 138
7.3.1 表示完美二叉树 138
7.3.2 表示任意二叉树 139
7.3.3 优点与局限性 142
7.4 二叉搜索树 142
7.4.1 二叉搜索树的操作 143
7.4.2 二叉搜索树的效率 151
7.4.3 二叉搜索树常见应用 151
7.5 AVL树* 152
7.5.1 AVL树常见术语 153
7.5.2 AVL树旋转 154
7.5.3 AVL树常用操作 160
7.5.4 AVL树典型应用 161
7.6 小结 162
第8章 堆 165
8.1 堆 165
8.1.1 堆的常用操作 166
8.1.2 堆的实现 167
8.1.3 堆的常见应用 177
8.2 建堆操作 177
8.2.1 借助入堆操作实现 177
8.2.2 通过遍历堆化实现 178
8.2.3 复杂度分析 178
8.3 Top-k问题 180
8.3.1 方法一:遍历选择 180
8.3.2 方法二:排序 180
8.3.3 方法三:堆 181
8.4 小结 182
第9章 图 184
9.1 图 184
9.1.1 图的常见类型与术语 185
9.1.2 图的表示 186
9.1.3 图的常见应用 188
9.2 图的基础操作 188
9.2.1 基于邻接矩阵的实现 188
9.2.2 基于邻接表的实现 192
9.2.3 效率对比 196
9.3 图的遍历 196
9.3.1 广度优先遍历 196
9.3.2 深度优先遍历 198
9.4 小结 200
第 10章 搜索 203
10.1 二分查找 203
10.1.1 区间表示方法 207
10.1.2 优点与局限性 208
10.2 二分查找插入点 209
10.2.1 无重复元素的情况 209
10.2.2 存在重复元素的情况 210
10.3 二分查找边界 212
10.3.1 查找左边界 212
10.3.2 查找右边界 212
10.4 哈希优化策略 214
10.4.1 线性查找:以时间换空间 214
10.4.2 哈希查找:以空间换时间 215
10.5 重识搜索算法 217
10.5.1 暴力搜索 217
10.5.2 自适应搜索 218
10.5.3 搜索方法选取 218
10.6 小结 220
第 11章 排序 222
11.1 排序算法 222
11.1.1 评价维度 222
11.1.2 理想排序算法 223
11.2 选择排序 224
11.3 冒泡排序 229
11.3.1 算法流程 231
11.3.2 效率优化 232
11.3.3 算法特性 233
11.4 插入排序 233
11.4.1 算法流程 234
11.4.2 算法特性 235
11.4.3 插入排序的优势 235
11.5 快速排序 235
11.5.1 算法流程 239
11.5.2 算法特性 240
11.5.3 快速排序为什么快 240
11.5.4 基准数优化 241
11.5.5 尾递归优化 242
11.6 归并排序 242
11.6.1 算法流程 243
11.6.2 算法特性 248
11.6.3 链表排序 248
11.7 堆排序 249
11.7.1 算法流程 249
11.7.2 算法特性 250
11.8 桶排序 250
11.8.1 算法流程 251
11.8.2 算法特性 252
11.8.3 如何实现平均分配 252
11.9 计数排序 253
11.9.1 简单实现 254
11.9.2 完整实现 255
11.9.3 算法特性 256
11.9.4 局限性 256
11.10 基数排序 257
11.10.1 算法流程 257
11.10.2 算法特性 259
11.11 小结 259
第 12章 分治 263
12.1 分治算法 263
12.1.1 如何判断分治问题 264
12.1.2 通过分治提升效率 264
12.1.3 分治常见应用 266
12.2 分治搜索策略 267
12.3 构建二叉树问题 269
12.4 汉诺塔问题 273
12.5 小结 280
第 13章 回溯 282
13.1 回溯算法 282
13.1.1 尝试与回退 283
13.1.2 剪枝 288
13.1.3 框架代码 289
13.1.4 常用术语 291
13.1.5 优点与局限性 291
13.1.6 回溯典型例题 292
13.2 全排列问题 292
13.2.1 无相等元素的情况 293
13.2.2 考虑相等元素的情况 295
13.3 子集和问题 298
13.3.1 无重复元素的情况 298
13.3.2 考虑重复元素的情况 302
13.4 n 皇后问题 304
13.5 小结 308
第 14章 动态规划 310
14.1 初探动态规划 310
14.1.1 方法一:暴力搜索 311
14.1.2 方法二:记忆化搜索 313
14.1.3 方法三:动态规划 314
14.1.4 空间优化 316
14.2 动态规划问题特性 316
14.2.1 最优子结构 316
14.2.2 无后效性 319
14.3 动态规划解题思路 321
14.3.1 问题判断 321
14.3.2 问题求解步骤 322
14.4 0-1 背包问题 332
14.5 完全背包问题 343
14.5.1 完全背包问题 344
14.5.2 零钱兑换问题 I348
14.5.3 零钱兑换问题II 350
14.6 编辑距离问题 352
14.7 小结 356
第 15章 贪心 359
15.1 贪心算法 359
15.1.1 贪心算法的优点与局限性 360
15.1.2 贪心算法特性 361
15.1.3 贪心算法解题步骤 362
15.1.4 贪心算法典型例题 363
15.2 分数背包问题 363
15.3 最大容量问题 366
15.4 最大切分乘积问题 373
15.5 小结 377
附录A 术语表 379
· · · · · · (收起)
var answerObj = {
TYPE: 'book',
SUBJECT_ID: '36794227',
ISALL: 'False' || false,
USER_ID: 'None'
}
喜欢读"Hello算法"的人也喜欢的电子书
· · · · · ·
支持 Web、iPhone、iPad、Android 阅读器
On Java 中文版:进阶卷(试读本)
免费
Go语言精进之路1
59.40元
搞定系统设计
76.30元
喜欢读"Hello算法"的人也喜欢
· · · · · ·
labuladong的算法笔记
6.3
流畅的Python (第2版)
8.0
Python深度学习 (第2版)
9.6
挑战程序设计竞赛2 算法和数据结构
8.6
程序员超强大脑
7.5
Linux命令行与shell脚本编程大全(...
9.2
理解图灵
8.9
Kubernetes修炼手册
8.9
用数据讲故事 (修订版)
8.1
算法详解(卷1)——算法基础
9.0
我来说两句
短评
· · · · · ·
(
全部 37 条
)
热门
9
有用
momo
2024-05-14 15:25:34
上海
这个开源的算法书太cool了!https://www.hello-algo.com/ 我经常会被这种开源精神感动到 而且做得这么好 这也是我为什么那么向往成为一名程序员的原因之一
0
有用
Mocha
2025-01-17 00:23:41
天津
网页版动画做的很好,不愧是霸榜项目
1
有用
喔喔奶糖
2024-08-28 19:40:27
上海
清晰易懂,可操作性强,小白友好。作者真是最会讲故事的算法人!
3
有用
非此即彼
2024-05-03 16:27:43
北京
图做的真不错,很有收获。
0
有用
方 圆
2024-06-06 15:52:03
北京
不错的入门书,已看过网页版
(function () {
if (window.SUBJECT_COMMENTS_SECTION) {
// tab handler
SUBJECT_COMMENTS_SECTION.createTabHandler();
// expand handler
SUBJECT_COMMENTS_SECTION.createExpandHandler({
root: document.getElementById('comment-list-wrapper'),
});
SUBJECT_COMMENTS_SECTION.createVoteHandler({
api: '/j/comment/:id/vote',
root: document.getElementById('comment-list-wrapper'),
voteSelector: '.vote-comment',
textSelector: '.vote-count',
afterVote: function (elem) {
var parentNode = elem.parentNode;
var successElem = document.createElement('span');
successElem.innerHTML = '已投票';
parentNode.removeChild(elem);
parentNode.appendChild(successElem);
}
});
}
})()
我要写书评
Hello算法的书评 · · · · · ·
( 全部 1 条 )
热门
var cur_sort = '';
$('#reviews-wrapper .review_filter a').on('click', function () {
var sort = $(this).data('sort');
if(sort === cur_sort) return;
if(sort === 'follow' && true){
window.location.href = '//www.douban.com/accounts/login?source=movie';
return;
}
if($('#reviews-wrapper .review_filter').data('doing')) return;
$('#reviews-wrapper .review_filter').data('doing', true);
cur_sort = sort;
$('#reviews-wrapper .review_filter a').removeClass('cur');
$(this).addClass('cur');
$.getJSON('reviews', { sort: sort }, function(res) {
$('#reviews-wrapper .review-list').remove();
$('#reviews-wrapper [href="reviews?sort=follow"]').parent().remove();
$('#reviews-wrapper .review_filter').after(res.html);
$('#reviews-wrapper .review_filter').data('doing', false);
$('#reviews-wrapper .review_filter').removeData('doing');
if (res.count === 0) {
$('#reviews-wrapper .review-list').html('你关注的人还没写过长评');
}
});
});
Yo2miya
2024-09-19 18:37:43
新手入门最好的算法书!
看了不少号称《从零开始的···》代码类书籍,但是每次看到中间部分就有不少的书忘记了自己的初衷,代码和知识点就开始变得难懂难理解。 在看完K神撰写的Hello算法以后,很多之前不理解的概念被书上一张张图片点拨了。从具象化的数据结构图解,到代码分步运行解析,很难想象作...
(展开)
3
0回应
收起
(function() {
if (window.__init_review_list) return;
__init_review_list = true;
})();
window.useful_icon = "https://img1.doubanio.com/f/zerkalo/536fd337139250b5fb3cf9e79cb65c6193f8b20b/pics/up.png";
window.usefuled_icon = "https://img1.doubanio.com/f/zerkalo/635290bb14771c97270037be21ad50514d57acc3/pics/up-full.png";
window.useless_icon = "https://img1.doubanio.com/f/zerkalo/68849027911140623cf338c9845893c4566db851/pics/down.png";
window.uselessed_icon = "https://img1.doubanio.com/f/zerkalo/23cee7343568ca814238f5ef18bf8aadbe959df2/pics/down-full.png";
>
更多书评
1篇
$('document').ready(function () {
$.get(`/subject/36794227/annotation_html`, function (r) {
$('.annotation').html(r.html);
});
});
论坛
· · · · · ·
在这本书的论坛里发言
当前版本有售
· · · · · ·
京东商城
69.90元
购买纸质书
当当网
69.90元
购买纸质书
中图网
90.90元
购买纸质书
+ 加入购书单
$(document).ready(function() {
$('.impression_track_mod_buyinfo').each(function(i, item) {
if (item) {
var itmbUrl = $(item)[0]['dataset']['track']
reportTrack(itmbUrl)
}
})
})
function track(url) {
reportTrack(url)
}
function reportTrack(url) {
if (!url) { return false }
$.ajax({ url: url, dataType: 'text/html' })
}
以下书单推荐
· · · · · ·
(
全部
)
IT 二级基础 数据结构与算法(智力层次-实用性) 1.1.1.7
(ajian005)
计算机
(贴面无须华丽)
编程
(拼命奔跑的猪)
书单|计算机基础
(Keven)
书单|8.5分-8.9分
(北风)
谁读这本书?
· · · · · ·
ithee
今天凌晨 想读
自在极意门徒
昨天 想读
Riku
3月26日 想读
〢
3月25日 想读
> 54人在读
> 74人读过
> 414人想读
(function (global) {
if(!document.getElementsByClassName) {
document.getElementsByClassName = function(className) {
return this.querySelectorAll("." + className);
};
Element.prototype.getElementsByClassName = document.getElementsByClassName;
}
var articles = global.document.getElementsByClassName('article'),
asides = global.document.getElementsByClassName('aside');
if (articles.length > 0 && asides.length > 0 && articles[0].offsetHeight >= asides[0].offsetHeight) {
(global.DoubanAdSlots = global.DoubanAdSlots || []).push('dale_book_subject_middle_right');
}
})(this);
二手市场
· · · · · ·
在豆瓣转让
有414人想读,手里有一本闲着?
订阅关于Hello算法的评论:
feed: rss 2.0
(function (global) {
var body = global.document.body,
html = global.document.documentElement;
var height = Math.max(body.scrollHeight, body.offsetHeight, html.clientHeight, html.scrollHeight, html.offsetHeight);
if (height >= 2000) {
(global.DoubanAdSlots = global.DoubanAdSlots || []).push('dale_book_subject_bottom_super_banner');
}
})(this);
© 2005-2025 douban.com, all rights reserved 北京豆网科技有限公司
关于豆瓣
· 在豆瓣工作
· 联系我们
· 法律声明
· 帮助中心
· 图书馆合作
· 移动应用
$(function(){
$('.add2cartWidget').each(function() {
var add2CartBtn = $(this).find('.add2cart');
var inCartHint = $(this).find('.book-in-cart');
var deleteBtn = inCartHint.find('.delete-cart-item');
deleteBtn.click(function(e) {
e.preventDefault();
$.post_withck('/cart', {remove: this.rel}, function() {
add2CartBtn.show();
inCartHint.hide();
});
});
});
});
(function (global) {
var newNode = global.document.createElement('script'),
existingNode = global.document.getElementsByTagName('script')[0],
adSource = '//erebor.douban.com/',
userId = '',
browserId = 'CF7fF214nM0',
criteria = '7:算法|7:计算机|7:编程|7:计算机科学|7:技术|7:IT|7:程序设计|7:数学|7:学习|7:软件开发|3:/subject/36794227/',
preview = '',
debug = false,
adSlots = ['dale_book_subject_top_right', 'dale_book_subject_middle_mini'];
global.DoubanAdRequest = {src: adSource, uid: userId, bid: browserId, crtr: criteria, prv: preview, debug: debug};
global.DoubanAdSlots = (global.DoubanAdSlots || []).concat(adSlots);
newNode.setAttribute('type', 'text/javascript');
newNode.setAttribute('src', '//img1.doubanio.com/NWQ3bnN2eS9mL2FkanMvYjFiN2ViZWM0ZDBiZjlkNTE1ZDdiODZiZDc0NzNhNjExYWU3ZDk3My9hZC5yZWxlYXNlLmpz?company_token=kX69T8w1wyOE-dale');
newNode.setAttribute('async', true);
existingNode.parentNode.insertBefore(newNode, existingNode);
})(this);
var _paq = _paq || [];
_paq.push(['trackPageView']);
_paq.push(['enableLinkTracking']);
(function() {
var p=(('https:' == document.location.protocol) ? 'https' : 'http'), u=p+'://fundin.douban.com/';
_paq.push(['setTrackerUrl', u+'piwik']);
_paq.push(['setSiteId', '100001']);
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
g.type='text/javascript';
g.defer=true;
g.async=true;
g.src=p+'://s.doubanio.com/dae/fundin/piwik.js';
s.parentNode.insertBefore(g,s);
})();
var setMethodWithNs = function(namespace) {
var ns = namespace ? namespace + '.' : ''
, fn = function(string) {
if(!ns) {return string}
return ns + string
}
return fn
}
var gaWithNamespace = function(fn, namespace) {
var method = setMethodWithNs(namespace)
fn.call(this, method)
}
var _gaq = _gaq || []
, accounts = [
{ id: 'UA-7019765-1', namespace: 'douban' }
, { id: 'UA-7019765-16', namespace: '' }
]
, gaInit = function(account) {
gaWithNamespace(function(method) {
gaInitFn.call(this, method, account)
}, account.namespace)
}
, gaInitFn = function(method, account) {
_gaq.push([method('_setAccount'), account.id])
_gaq.push([method('_addOrganic'), 'google', 'q'])
_gaq.push([method('_addOrganic'), 'baidu', 'wd'])
_gaq.push([method('_addOrganic'), 'soso', 'w'])
_gaq.push([method('_addOrganic'), 'youdao', 'q'])
_gaq.push([method('_addOrganic'), 'so.360.cn', 'q'])
_gaq.push([method('_addOrganic'), 'sogou', 'query'])
if (account.namespace) {
_gaq.push([method('_addIgnoredOrganic'), '豆瓣'])
_gaq.push([method('_addIgnoredOrganic'), 'douban'])
_gaq.push([method('_addIgnoredOrganic'), '豆瓣网'])
_gaq.push([method('_addIgnoredOrganic'), 'www.douban.com'])
}
if (account.namespace === 'douban') {
_gaq.push([method('_setDomainName'), '.douban.com'])
}
_gaq.push([method('_setCustomVar'), 1, 'responsive_view_mode', 'desktop', 3])
_gaq.push([method('_setCustomVar'), 2, 'login_status', '0', 2]);
_gaq.push([method('_trackPageview')])
}
for(var i = 0, l = accounts.length; i < l; i++) {
var account = accounts[i]
gaInit(account)
}
;(function() {
var ga = document.createElement('script');
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
ga.setAttribute('async', 'true');
document.documentElement.firstChild.appendChild(ga);
})()
目录
序
前言
第 1章 初识算法 1
1.1 算法无处不在 1
1.2 算法是什么 5
1.2.1 算法定义 5
1.2.2 数据结构定义 5
1.2.3 数据结构与算法的关系 5
1.3 小结 7
第 2章 复杂度分析 9
2.1 算法效率评估 9
2.1.1 实际测试 9
2.1.2 理论估算 10
2.2 迭代与递归 10
2.2.1 迭代 11
2.2.2 递归 13
2.2.3 两者对比 18
2.3 时间复杂度 19
2.3.1 统计时间增长趋势 20
2.3.2 函数渐近上界 21
2.3.3 推算方法 22
2.3.4 常见类型 23
2.3.5 最差、最佳、平均时间复杂度 30
2.4 空间复杂度 32
2.4.1 算法相关空间 32
2.4.2 推算方法 33
2.4.3 常见类型 34
2.4.4 权衡时间与空间 38
2.5 小结 39
第3章 数据结构 42
3.1 数据结构分类 42
3.1.1 逻辑结构:线性与非线性 42
3.1.2 物理结构:连续与分散 43
3.2 基本数据类型 45
3.3 数字编码* 46
3.3.1 原码、反码和补码 46
3.3.2 浮点数编码 49
3.4 字符编码* 50
3.4.1 ASCII字符集 50
3.4.2 GBK字符集 51
3.4.3 Unicode字符集 51
3.4.4 UTF-8编码 53
3.4.5 编程语言的字符编码 54
3.5 小结 55
第4章 数组与链表 58
4.1 数组 58
4.1.1 数组常用操作 58
4.1.2 数组的优点与局限性 62
4.1.3 数组典型应用 63
4.2 链表 63
4.2.1 链表常用操作 64
4.2.2 数组与链表对比 67
4.2.3 常见链表类型 67
4.2.4 链表典型应用 68
4.3 列表 69
4.3.1 列表常用操作 69
4.3.2 列表实现 71
4.4 内存与缓存* 73
4.4.1 计算机存储设备 73
4.4.2 数据结构的内存效率 75
4.4.3 数据结构的缓存效率 75
4.5 小结 76
第5章 栈与队列 81
5.1 栈 81
5.1.1 栈的常用操作 81
5.1.2 栈的实现 82
5.1.3 两种实现对比 86
5.1.4 栈的典型应用 87
5.2 队列 87
5.2.1 队列常用操作 88
5.2.2 队列实现 89
5.2.3 队列典型应用 94
5.3 双向队列 95
5.3.1 双向队列常用操作 95
5.3.2 双向队列实现* 96
5.3.3 双向队列应用 104
5.4 小结 104
第6章 哈希表 107
6.1 哈希表 107
6.1.1 哈希表常用操作 108
6.1.2 哈希表简单实现 109
6.1.3 哈希冲突与扩容 111
6.2 哈希冲突 113
6.2.1 链式地址 113
6.2.2 开放寻址 116
6.2.3 编程语言的选择 120
6.3 哈希算法 120
6.3.1 哈希算法的目标 121
6.3.2 哈希算法的设计 122
6.3.3 常见哈希算法 124
6.3.4 数据结构的哈希值 124
6.4 小结 125
第7章 树 129
7.1 二叉树 129
7.1.1 二叉树常见术语 129
7.1.2 二叉树基本操作 131
7.1.3 常见二叉树类型 132
7.1.4 二叉树的退化 134
7.2 二叉树遍历 135
7.2.1 层序遍历 135
7.2.2 前序、中序、后序遍历 136
7.3 二叉树数组表示 138
7.3.1 表示完美二叉树 138
7.3.2 表示任意二叉树 139
7.3.3 优点与局限性 142
7.4 二叉搜索树 142
7.4.1 二叉搜索树的操作 143
7.4.2 二叉搜索树的效率 151
7.4.3 二叉搜索树常见应用 151
7.5 AVL树* 152
7.5.1 AVL树常见术语 153
7.5.2 AVL树旋转 154
7.5.3 AVL树常用操作 160
7.5.4 AVL树典型应用 161
7.6 小结 162
第8章 堆 165
8.1 堆 165
8.1.1 堆的常用操作 166
8.1.2 堆的实现 167
8.1.3 堆的常见应用 177
8.2 建堆操作 177
8.2.1 借助入堆操作实现 177
8.2.2 通过遍历堆化实现 178
8.2.3 复杂度分析 178
8.3 Top-k问题 180
8.3.1 方法一:遍历选择 180
8.3.2 方法二:排序 180
8.3.3 方法三:堆 181
8.4 小结 182
第9章 图 184
9.1 图 184
9.1.1 图的常见类型与术语 185
9.1.2 图的表示 186
9.1.3 图的常见应用 188
9.2 图的基础操作 188
9.2.1 基于邻接矩阵的实现 188
9.2.2 基于邻接表的实现 192
9.2.3 效率对比 196
9.3 图的遍历 196
9.3.1 广度优先遍历 196
9.3.2 深度优先遍历 198
9.4 小结 200
第 10章 搜索 203
10.1 二分查找 203
10.1.1 区间表示方法 207
10.1.2 优点与局限性 208
10.2 二分查找插入点 209
10.2.1 无重复元素的情况 209
10.2.2 存在重复元素的情况 210
10.3 二分查找边界 212
10.3.1 查找左边界 212
10.3.2 查找右边界 212
10.4 哈希优化策略 214
10.4.1 线性查找:以时间换空间 214
10.4.2 哈希查找:以空间换时间 215
10.5 重识搜索算法 217
10.5.1 暴力搜索 217
10.5.2 自适应搜索 218
10.5.3 搜索方法选取 218
10.6 小结 220
第 11章 排序 222
11.1 排序算法 222
11.1.1 评价维度 222
11.1.2 理想排序算法 223
11.2 选择排序 224
11.3 冒泡排序 229
11.3.1 算法流程 231
11.3.2 效率优化 232
11.3.3 算法特性 233
11.4 插入排序 233
11.4.1 算法流程 234
11.4.2 算法特性 235
11.4.3 插入排序的优势 235
11.5 快速排序 235
11.5.1 算法流程 239
11.5.2 算法特性 240
11.5.3 快速排序为什么快 240
11.5.4 基准数优化 241
11.5.5 尾递归优化 242
11.6 归并排序 242
11.6.1 算法流程 243
11.6.2 算法特性 248
11.6.3 链表排序 248
11.7 堆排序 249
11.7.1 算法流程 249
11.7.2 算法特性 250
11.8 桶排序 250
11.8.1 算法流程 251
11.8.2 算法特性 252
11.8.3 如何实现平均分配 252
11.9 计数排序 253
11.9.1 简单实现 254
11.9.2 完整实现 255
11.9.3 算法特性 256
11.9.4 局限性 256
11.10 基数排序 257
11.10.1 算法流程 257
11.10.2 算法特性 259
11.11 小结 259
第 12章 分治 263
12.1 分治算法 263
12.1.1 如何判断分治问题 264
12.1.2 通过分治提升效率 264
12.1.3 分治常见应用 266
12.2 分治搜索策略 267
12.3 构建二叉树问题 269
12.4 汉诺塔问题 273
12.5 小结 280
第 13章 回溯 282
13.1 回溯算法 282
13.1.1 尝试与回退 283
13.1.2 剪枝 288
13.1.3 框架代码 289
13.1.4 常用术语 291
13.1.5 优点与局限性 291
13.1.6 回溯典型例题 292
13.2 全排列问题 292
13.2.1 无相等元素的情况 293
13.2.2 考虑相等元素的情况 295
13.3 子集和问题 298
13.3.1 无重复元素的情况 298
13.3.2 考虑重复元素的情况 302
13.4 n 皇后问题 304
13.5 小结 308
第 14章 动态规划 310
14.1 初探动态规划 310
14.1.1 方法一:暴力搜索 311
14.1.2 方法二:记忆化搜索 313
14.1.3 方法三:动态规划 314
14.1.4 空间优化 316
14.2 动态规划问题特性 316
14.2.1 最优子结构 316
14.2.2 无后效性 319
14.3 动态规划解题思路 321
14.3.1 问题判断 321
14.3.2 问题求解步骤 322
14.4 0-1 背包问题 332
14.5 完全背包问题 343
14.5.1 完全背包问题 344
14.5.2 零钱兑换问题 I348
14.5.3 零钱兑换问题II 350
14.6 编辑距离问题 352
14.7 小结 356
第 15章 贪心 359
15.1 贪心算法 359
15.1.1 贪心算法的优点与局限性 360
15.1.2 贪心算法特性 361
15.1.3 贪心算法解题步骤 362
15.1.4 贪心算法典型例题 363
15.2 分数背包问题 363
15.3 最大容量问题 366
15.4 最大切分乘积问题 373
15.5 小结 377
附录A 术语表 379
(展开全部)前言
第 1章 初识算法 1
1.1 算法无处不在 1
1.2 算法是什么 5
1.2.1 算法定义 5
1.2.2 数据结构定义 5
1.2.3 数据结构与算法的关系 5
1.3 小结 7
第 2章 复杂度分析 9
2.1 算法效率评估 9
2.1.1 实际测试 9
2.1.2 理论估算 10
2.2 迭代与递归 10
2.2.1 迭代 11
2.2.2 递归 13
2.2.3 两者对比 18
2.3 时间复杂度 19
2.3.1 统计时间增长趋势 20
2.3.2 函数渐近上界 21
2.3.3 推算方法 22
2.3.4 常见类型 23
2.3.5 最差、最佳、平均时间复杂度 30
2.4 空间复杂度 32
2.4.1 算法相关空间 32
2.4.2 推算方法 33
2.4.3 常见类型 34
2.4.4 权衡时间与空间 38
2.5 小结 39
第3章 数据结构 42
3.1 数据结构分类 42
3.1.1 逻辑结构:线性与非线性 42
3.1.2 物理结构:连续与分散 43
3.2 基本数据类型 45
3.3 数字编码* 46
3.3.1 原码、反码和补码 46
3.3.2 浮点数编码 49
3.4 字符编码* 50
3.4.1 ASCII字符集 50
3.4.2 GBK字符集 51
3.4.3 Unicode字符集 51
3.4.4 UTF-8编码 53
3.4.5 编程语言的字符编码 54
3.5 小结 55
第4章 数组与链表 58
4.1 数组 58
4.1.1 数组常用操作 58
4.1.2 数组的优点与局限性 62
4.1.3 数组典型应用 63
4.2 链表 63
4.2.1 链表常用操作 64
4.2.2 数组与链表对比 67
4.2.3 常见链表类型 67
4.2.4 链表典型应用 68
4.3 列表 69
4.3.1 列表常用操作 69
4.3.2 列表实现 71
4.4 内存与缓存* 73
4.4.1 计算机存储设备 73
4.4.2 数据结构的内存效率 75
4.4.3 数据结构的缓存效率 75
4.5 小结 76
第5章 栈与队列 81
5.1 栈 81
5.1.1 栈的常用操作 81
5.1.2 栈的实现 82
5.1.3 两种实现对比 86
5.1.4 栈的典型应用 87
5.2 队列 87
5.2.1 队列常用操作 88
5.2.2 队列实现 89
5.2.3 队列典型应用 94
5.3 双向队列 95
5.3.1 双向队列常用操作 95
5.3.2 双向队列实现* 96
5.3.3 双向队列应用 104
5.4 小结 104
第6章 哈希表 107
6.1 哈希表 107
6.1.1 哈希表常用操作 108
6.1.2 哈希表简单实现 109
6.1.3 哈希冲突与扩容 111
6.2 哈希冲突 113
6.2.1 链式地址 113
6.2.2 开放寻址 116
6.2.3 编程语言的选择 120
6.3 哈希算法 120
6.3.1 哈希算法的目标 121
6.3.2 哈希算法的设计 122
6.3.3 常见哈希算法 124
6.3.4 数据结构的哈希值 124
6.4 小结 125
第7章 树 129
7.1 二叉树 129
7.1.1 二叉树常见术语 129
7.1.2 二叉树基本操作 131
7.1.3 常见二叉树类型 132
7.1.4 二叉树的退化 134
7.2 二叉树遍历 135
7.2.1 层序遍历 135
7.2.2 前序、中序、后序遍历 136
7.3 二叉树数组表示 138
7.3.1 表示完美二叉树 138
7.3.2 表示任意二叉树 139
7.3.3 优点与局限性 142
7.4 二叉搜索树 142
7.4.1 二叉搜索树的操作 143
7.4.2 二叉搜索树的效率 151
7.4.3 二叉搜索树常见应用 151
7.5 AVL树* 152
7.5.1 AVL树常见术语 153
7.5.2 AVL树旋转 154
7.5.3 AVL树常用操作 160
7.5.4 AVL树典型应用 161
7.6 小结 162
第8章 堆 165
8.1 堆 165
8.1.1 堆的常用操作 166
8.1.2 堆的实现 167
8.1.3 堆的常见应用 177
8.2 建堆操作 177
8.2.1 借助入堆操作实现 177
8.2.2 通过遍历堆化实现 178
8.2.3 复杂度分析 178
8.3 Top-k问题 180
8.3.1 方法一:遍历选择 180
8.3.2 方法二:排序 180
8.3.3 方法三:堆 181
8.4 小结 182
第9章 图 184
9.1 图 184
9.1.1 图的常见类型与术语 185
9.1.2 图的表示 186
9.1.3 图的常见应用 188
9.2 图的基础操作 188
9.2.1 基于邻接矩阵的实现 188
9.2.2 基于邻接表的实现 192
9.2.3 效率对比 196
9.3 图的遍历 196
9.3.1 广度优先遍历 196
9.3.2 深度优先遍历 198
9.4 小结 200
第 10章 搜索 203
10.1 二分查找 203
10.1.1 区间表示方法 207
10.1.2 优点与局限性 208
10.2 二分查找插入点 209
10.2.1 无重复元素的情况 209
10.2.2 存在重复元素的情况 210
10.3 二分查找边界 212
10.3.1 查找左边界 212
10.3.2 查找右边界 212
10.4 哈希优化策略 214
10.4.1 线性查找:以时间换空间 214
10.4.2 哈希查找:以空间换时间 215
10.5 重识搜索算法 217
10.5.1 暴力搜索 217
10.5.2 自适应搜索 218
10.5.3 搜索方法选取 218
10.6 小结 220
第 11章 排序 222
11.1 排序算法 222
11.1.1 评价维度 222
11.1.2 理想排序算法 223
11.2 选择排序 224
11.3 冒泡排序 229
11.3.1 算法流程 231
11.3.2 效率优化 232
11.3.3 算法特性 233
11.4 插入排序 233
11.4.1 算法流程 234
11.4.2 算法特性 235
11.4.3 插入排序的优势 235
11.5 快速排序 235
11.5.1 算法流程 239
11.5.2 算法特性 240
11.5.3 快速排序为什么快 240
11.5.4 基准数优化 241
11.5.5 尾递归优化 242
11.6 归并排序 242
11.6.1 算法流程 243
11.6.2 算法特性 248
11.6.3 链表排序 248
11.7 堆排序 249
11.7.1 算法流程 249
11.7.2 算法特性 250
11.8 桶排序 250
11.8.1 算法流程 251
11.8.2 算法特性 252
11.8.3 如何实现平均分配 252
11.9 计数排序 253
11.9.1 简单实现 254
11.9.2 完整实现 255
11.9.3 算法特性 256
11.9.4 局限性 256
11.10 基数排序 257
11.10.1 算法流程 257
11.10.2 算法特性 259
11.11 小结 259
第 12章 分治 263
12.1 分治算法 263
12.1.1 如何判断分治问题 264
12.1.2 通过分治提升效率 264
12.1.3 分治常见应用 266
12.2 分治搜索策略 267
12.3 构建二叉树问题 269
12.4 汉诺塔问题 273
12.5 小结 280
第 13章 回溯 282
13.1 回溯算法 282
13.1.1 尝试与回退 283
13.1.2 剪枝 288
13.1.3 框架代码 289
13.1.4 常用术语 291
13.1.5 优点与局限性 291
13.1.6 回溯典型例题 292
13.2 全排列问题 292
13.2.1 无相等元素的情况 293
13.2.2 考虑相等元素的情况 295
13.3 子集和问题 298
13.3.1 无重复元素的情况 298
13.3.2 考虑重复元素的情况 302
13.4 n 皇后问题 304
13.5 小结 308
第 14章 动态规划 310
14.1 初探动态规划 310
14.1.1 方法一:暴力搜索 311
14.1.2 方法二:记忆化搜索 313
14.1.3 方法三:动态规划 314
14.1.4 空间优化 316
14.2 动态规划问题特性 316
14.2.1 最优子结构 316
14.2.2 无后效性 319
14.3 动态规划解题思路 321
14.3.1 问题判断 321
14.3.2 问题求解步骤 322
14.4 0-1 背包问题 332
14.5 完全背包问题 343
14.5.1 完全背包问题 344
14.5.2 零钱兑换问题 I348
14.5.3 零钱兑换问题II 350
14.6 编辑距离问题 352
14.7 小结 356
第 15章 贪心 359
15.1 贪心算法 359
15.1.1 贪心算法的优点与局限性 360
15.1.2 贪心算法特性 361
15.1.3 贪心算法解题步骤 362
15.1.4 贪心算法典型例题 363
15.2 分数背包问题 363
15.3 最大容量问题 366
15.4 最大切分乘积问题 373
15.5 小结 377
附录A 术语表 379
经典金句(15)
纠错 补充反馈
1. 算法与数据结构的关系
“数据结构是食材,算法是烹饪方法——再好的食材也需要合适的烹饪技巧。”
——强调数据结构的选择直接影响算法效率(如哈希表适合快速查找,树结构适合层次化数据处理)。
2. 复杂度分析的本质
“时间复杂度不是计算机的计时器,而是算法效率的指南针——帮你判断优化方向。”
——通过O(n²)与O(n log n)的对比,揭示算法设计的权衡艺术。
3. 递归的哲学
“递归是‘分而治之’的化身——将大问题拆解为相似的小问题,直到触达最简解。”
——以汉诺塔问题为例,说明递归的“自我调用”特性与终止条件设计。
4. 动态规划的精髓
“动态规划是‘记忆化’的智慧——避免重复劳动,让每一步积累价值。”
通过斐波那契数列递归与迭代的对比,展示备忘录模式如何将指数级复杂度优化至线性。
5. 图算法的启示
“图的遍历如同探索迷宫——BFS找最短路径,DFS找所有可能路径。”
——以社交网络关系链查找为例,解释广度优先与深度优先的适用场景。