非常少有入门程序编写的人想要以便程序编写而程序编写,这书自主创新地根据求出趣味的迷题来专家教授用户程序编写,为枯燥乏味的编程学习全过程引入了较强的挑战性,迷题是来源于真实的世界的运用,饶有趣味、便于叙述。 学编程是以解迷题刚开始的,在亲身经历两三次不成功的解迷试着后,用户会恍然大悟——将会是这种检索对策、1个数据结构或1个数学公式,迷题的优化算法就跃殊不知出了,剩余的事儿就是说用Python英语的语法和词义将优化算法“汉语翻译”成可保持的编码。 用户只需把握初中级的程序编写定义,就能够阅读文章这书。这书包括了21 个迷题,在其中许多迷题都众所周知并广为人知,如多王后、汉诺塔、在几秒内处理数独难题、六度隔开等。每一迷题后边都装有不一样难度系数的程序编写练习题,用户能够先自主进行编号,再对比这书得出的参考答案开展探寻和提高。
它是1本详细介绍根据处理繁杂迷题来学编程的书,书中的编码用Python語言撰写。与过去的程序编写书不一样,这书将对编码作用的了解与计算机语言英语的语法和词义的了解分离出来起来,从解每一迷题刚开始,先得出解迷题的优化算法,接着用Python英语的语法和词义保持相匹配的优化算法,并适度作出表述。这书包括了21个迷题,在其中许多迷题都广为人知,如多王后、汉诺塔、在几秒内处理数独难题、认证六度隔开猜测等,每一迷题后边都装有不一样难度系数的程序编写练习题,帮用户加重对有关优化算法的了解。 这书在优化算法迷题的挑战性和心理学知识的应用性中间构建了一幢公路桥梁,內容饶有趣味,叙述便于了解,合适已把握初中级程序编写定义并对优化算法很感兴趣的受教育者阅读文章和参照。
作者简介 斯里尼·德瓦达斯(Srini Devadas) 麻省理工大学(MIT)电子信息科学和人工智能技术试验室(CSAIL)电子工程和电子信息科学专家教授,自1988年起在麻省理工大学执教。他现阶段的科学研究兴趣爱好关键集中化在电子计算机系统架构、计算机安全和应用密码学行业。他以其科学研究贡献得到了2014年IEEE电子计算机学好技术性成就奖、2015年ACM/IEEE理查德·牛顿技术性知名度奖和2017年IEEE迈德思客·麦克道尔奖。他在MIT专家教授代码、算法导论和计算机算法与剖析等课程内容。 译员介绍 戴 旭 高級项目管理师,从业金融信息化和智慧政务工作中很多年,现为杭州市城市大脑研发部门组员,译有《Python迅速新手入门》《Android平板开发设计秘笈》《撰写性能的.NET编码》等。 李亚舟 现认职于知乎问答,承担数据库查询服务平台,关心储存、分布式系统、器皿等技术性,译有《Haskell趣学手册》。 许亚运会 曾认职于高德、饿了么外卖,有很多年it行业后端工程师工作经验,喜好Python,喜爱探寻新技术应用。
目录
- 谜题1 保持一致 1
- 1.1 寻找想法相同的连续人员 2
- 1.2 字符串、列表和元组 3
- 1.3 从算法到代码 4
- 1.4 代码优化 7
- 1.5 列表创建与修改 7
- 1.6 作用域 8
- 1.7 算法优化 9
- 1.8 单遍算法 9
- 1.9 应用 10
- 1.10 习题 11
- 谜题2 参加派对的最佳时间 13
- 2.1 反复检查时间 14
- 2.2 聪明地检查时间 16
- 2.3 有序的表示 20
- 2.4 习题 20
- 谜题3 拥有(需要一点校准的)读心术 22
- 3.1 编程完成助手的工作 24
- 3.2 编程完成魔术师的任务 28
- 3.3 独自掌握技巧 29
- 3.4 信息编码 31
- 3.5 4张牌的魔术戏法 31
- 3.6 习题 32
- 谜题4 让皇后保持分离 34
- 4.1 系统地搜索 36
- 4.2 用二维列表(数组)表示棋盘 38
- 4.3 用一维列表(数组)表示棋盘 41
- 4.4 迭代枚举 45
- 4.5 习题 46
- 谜题5 请打碎水晶 47
- 5.1 两颗球的高效搜索 48
- 5.2 d颗球的高效搜索 49
- 5.3 对两颗球减少抛球次数 53
- 5.4 习题 54
- 谜题6 寻找假币 55
- 6.1 分治 55
- 6.2 递归分治 57
- 6.3 三进制表示 60
- 6.4 称量谜题一个流行的变体 61
- 6.5 习题 61
- 谜题7 跳到平方根 62
- 7.1 迭代查找 62
- 7.2 折半查找 65
- 7.3 二分搜索 67
- 7.4 三分搜索 69
- 7.5 习题 69
- 谜题8 猜猜谁不来吃晚餐 71
- 8.1 第 一次尝试 72
- 8.2 始终寻找最大选择 73
- 8.3 生成所有组合 74
- 8.4 移除不友好的组合 76
- 8.5 选择最大组合 76
- 8.6 优化内存使用 77
- 8.7 应用 78
- 8.8 习题 79
- 谜题9 美国达人秀 81
- 9.1 每次生成并测试一个组合 83
- 9.2 确定缺少一门绝活的组合 84
- 9.3 应用 85
- 9.4 习题 86
- 谜题10 多皇后 88
- 10.1 递归求取最大公约数 88
- 10.2 递归获取斐波那契数列 89
- 10.3 递归求解N皇后问题 91
- 10.4 递归的应用 94
- 10.5 习题 96
- 谜题11 请满铺庭院 98
- 11.1 归并排序 99
- 11.2 归并排序的执行与分析 101
- 11.3 基线条件即2 × 2庭院 102
- 11.4 递归步骤 103
- 11.5 列表推导式的基础知识 107
- 11.6 美观打印 107
- 11.7 另一个满铺谜题 109
- 11.8 习题 109
- 谜题12 汉诺塔 111
- 12.1 汉诺塔的递归解决方案 112
- 12.2 相邻汉诺塔的递归解决方案 114
- 12.3 与格雷码的关系 117
- 12.4 习题 118
- 谜题13 没条理的工匠 121
- 13.1 分治时的围绕基准点分拣 122
- 13.2 与排序算法的关系 123
- 13.3 原地划分 126
- 13.4 排序也疯狂 129
- 13.5 习题 129
- 谜题14 再也不玩数独了 131
- 14.1 递归式数独求解 132
- 14.2 递归搜索过程中的推理 136
- 14.3 数独谜题的难度 140
- 14.4 习题 141
- 谜题15 统计零钱的组合方式 143
- 15.1 钞票的递归选取 143
- 15.2 消除重复 145
- 15.3 用最少的钞票支付 147
- 15.4 习题 148
- 谜题16 贪心是好事 150
- 16.1 贪心算法 151
- 16.2 最短历时规则 151
- 16.3 最早开始时间规则 151
- 16.4 最少冲突规则 152
- 16.5 最早结束时间规则 152
- 16.6 贪心算法何时有效 157
- 16.7 习题 158
- 谜题17 字母也疯狂 160
- 17.1 每次找到一组变位词 160
- 17.2 通过排序对变位词进行分组 162
- 17.3 通过散列操作对变位词进行分组 164
- 17.4 字典 165
- 17.5 用字典对变位词进行分组 167
- 17.6 散列表 169
- 17.7 习题 171
- 谜题18 充分利用记忆 173
- 18.1 递归解决方案 173
- 18.2 回溯硬币的选择过程 175
- 18.3 memoization技术 178
- 18.4 避免使用异常 179
- 18.5 动态规划 180
- 18.6 习题 180
- 谜题19 要记得周末 184
- 19.1 找到分区 185
- 19.2 二分图的判别 187
- 19.3 图的表示 189
- 19.4 图的着色 192
- 19.5 习题 193
- 谜题20 六度分隔 195
- 20.1 广度优先搜索 197
- 20.2 集合 198
- 20.3 在广度优先搜索中使用集合 199
- 20.4 历史 202
- 20.5 习题 203
- 谜题21 问题有价 205
- 21.1 用字典构造二叉查找树 207
- 21.2 字典形式下的二叉查找树操作 209
- 21.3 面向对象风格的二叉查找树 212
- 21.4 回到谜题:算法 216
- 21.5 解决谜题的代码 218
- 21.6 多种数据结构的对比 222
- 21.7 习题 222