商品参数
| 程序语言的奥妙:算法解读 |
| | 曾用价 | 45.00 |
| 出版社 | 科学出版社 |
| 版次 | 1 |
| 出版时间 | 2012年07月 |
| 开本 | 32 |
| 作者 | (日)杉浦贤 |
| 装帧 | 平装 |
| 页数 | 162 |
| 字数 | 175000 |
| ISBN编码 | 9787030346377 |
目录
目录
第1章 什么是算法?
001 烹饪用的食谱就是算法 002
002 算法是古老的智慧 004
003 懂得了算法游戏水平会更高 006
004 算法必须满足“有效性”和“终止性” 008
005 算法有很多种类 010
COLUMN 算法的基础—结构化程序设计的思想 012
第2章 变量和数组
006 数据是各种各样的信息 014
007 所有的数据都有类型 016
008 值是数值、文字等的具体表现 018
009 变量是放入值的箱子 020
010 变量通过“变量名”区别 022
011 赋值语句有给变量赋值的能力 024
012 变量到变量的代入,是一个变量中的值被存储在另一个变量中 026
013 变量也有数据类型 028
014 连续排列的相同数据类型的元素集合称为数组 030
015 数组用“数组名”区分 032
016 数组的各元素用元素编号辨别 034
017 数组是有效存储相关联数据的储物柜 036
018 二维数组类似宾馆的房间 038
019 数组的各元素通过两个下标标识 040
020 字符串是字符数据的数组 042
021 字符串的字符长度由字符长度变量或“哨兵”管理 044
COLUMN 常用的变量名 046
第3章 数据结构
022 实现对大量数据进行高效管理—数据构造 048
023 数据结构有很多种 050
024 如同向上堆书一样的数据结构是栈 052
025 在收银台排队一样的数据结构是等待队列 054
026 用绳子把数据连起来的数据管理方式—链表 056
027 单向链表:从一端开始可以遍历所有数据 058
028 双向链表:从双向开始都可以遍历所有数据 060
029 查找第N 个元素时数组比较快,链表比较慢 062
030 插入和删除数据时链表比较快,数组比较慢 064
031 环形缓冲:一旦到达末尾即返回到开头 066
032 二叉树:一个父结点两个子结点组成的结构 068
033 堆:父结点的值不得比子结点的值大的二叉树 070
034 哈希表:数组和链表组合的一种数据结构 072
035 图:结点和边连接的形式 074
COLUMN 从0开始还是从1开始? 076
第4章 基本的算法 077
036 执行循环操作求1~N的和 078
037 使用数组保存数列的值 080
038 用变量求数组元素值的和 082
039 用计数器求数组的有效元素数 084
040 根据数组的各元素和以及元素个数求数组的平均值 086
041 求数组元素的*大值要使用保存*大值的变量 088
042 使用变量保存*小值求数组的*小值 090
043 使用其他的数组存放数组元素的顺序 092
044 以秒为单位的时间大小的比较 094
045 求时间差时,将差再表示成时间形式 096
046 利用临时变量交换两个变量的值 098
047 用欧几里得相除法求2个数的*大公约数 100
COLUMN 代码和数据存在哪里? 102
第5章 排序和搜索 103
048 排序是指按照一定规则对元素对象进行排列摆放 104
049 多种多样的排序算法 106
050 把数据放于其他数组(桶)来进行排序的“桶排序” 108
051 从数值的低位开始依次重复桶排序的“基数排序” 110
052 选择*小值(*大值)与排好序的末位交换的“简单选择法” 112
053 相邻数据交换的“简单交换法”(冒泡排序) 114
054 在已排序数据的正确位置插入数据的“简单插入法” 116
055 把数据列按照一定间隔分组而进行排序的“希尔排序” 118
056 把多个排序结果的数列合在一起的“合并”(归并) 120
057 利用归并的算法进行排序的归并排序 122
058 通过与基准数据比较大小并把数列进行二分的“快速排序” 124
059 利用堆的构造进行排序的“堆排序” 126
060 搜索是从多个数据中找出目标数据 128
061 从首位元素开始逐个进行比较处理的“线性查找” 130
062 能够从排好序的数列中快速找出数据的“二分查找” 132
063 在给定字符串中查找指定字符串位置的“字符串查找” 134
064 从不一致字符的位置和局部字符串的结构提高查找效率的KMP法 136
065 从局部字符串的末尾到开头比较字符的BM法 138
COLUMN 利用关系数据库进行排序和查找 140
第6章 其他算法 141
066 通过活用微分来求高次方程式解的牛顿法 142
067 联合方程组的求解方法是高斯消元法 144
068 根据梯形面积的计算求定积分值的梯形法 146
069 用于求*短时间、*短距离之类的*优路径的方法:基于图的迪杰斯特拉法 148
070 判断自然数n是否是素数的“埃拉托色尼筛法” 150
071 利用递归调用求n的阶乘 152
COLUMN 算法和流程图 154
第7章 算法的复杂度 155
072 算法的复杂度中有时间复杂度和空间复杂度 156
073 时间复杂度通过“运算”、“条件比较”、“代入处理”等操作次数来测量 158
074 算法的复杂度用“O记法”来表示 160
COLUMN 提高编程能力的方法 162
参考文献 163
在线试读
第1章 什么是算法?
在编写计算机程序时,知道各种各样的算法有助于我们写出一个更“优雅”的程序。为了创造高效率、正确解决问题的程序,让我们开始学习吧。
001 烹饪用的食谱就是算法
算法(Algorithm)是利用计算机解决问题的处理步骤。这里的问题有
1 求*大公约数
2 重新排列信息的顺序
3 查找所需信息
等不同的类型。在现代社会,这样的信息处理是通过计算机进行的,这种处理过程中的处理步骤称为算法。
如上所述,算法就是解决问题的步骤。仔细观察,我们可以注意到算法不仅仅用于计算机的数据处理,现实世界中的各种问题也需要结合算法的概念来解决,其中具有代表性的就是烹饪中用到的食谱。
食谱是各种美味料理的制作方法,需要用一定的步骤表示出来。例如,要做
咖喱鸡肉
猪肉炖土豆
等菜品,食谱中记录着每道菜所需材料的种类和数量,并按步骤准确地描述了制作过程。按照这个步骤,谁都能够做出标准的咖喱鸡肉,并且,根据咖喱鸡肉的制作程序,任何人完成的一定是咖喱鸡肉,而不会成为盖浇饭或其他料理。这种“解决问题的处理步骤”(如咖喱鸡肉的烹饪食谱)称为算法。
要点
算法是“解决问题的处理步骤”
烹饪用的食谱也是算法
图1 什么是算法
图2 烹饪用的食谱
002 算法是古老的智慧
烹饪用的食谱虽然也可以说是算法,但是即使按照食谱上的步骤做出来的料理也不一定是可口的。虽然与食谱上的步骤一致,但做出来的菜大家也许认为并不好吃。如果这样,这个食谱将被当做“坏食谱”,使用的人也会渐渐变少,自然就会被淘汰。
另一方面,能做出每个人都认为可口的食物的食谱,会被多个人反复利用,这样的食谱就会被认为“好食谱”。“好食谱”通过人们的努力,将进一步成为美味料理的食谱。因此,烹饪用的食谱是为了创造美味料理而日积月累下来的“古老的智慧”。
计算机的算法与其相似。自计算机问世以来,人们已研究出无数可以用计算机解决的处理问题的方法。在这种情况下,许多研究人员仍在改进算法,并研究有没有更普遍的处理方法,有没有更高效的处理方法,有没有数据量更少的处理方法。这样细化出来的好算法,已经在很多计算机程序中被使用了。所以,算法也是为创造更“优雅”的程序而积累的“古老的智慧”。
好的算法本身会成为程序设计的范本。学习算法也在编写一个良好程序的过程中起到指导作用。
要点
算法是古老智慧的结晶,是程序的范本
学习算法才能编写出高质量的程序
图1 食谱的改进
图2 算法的改进
003 懂得了算法游戏水平会更高
学习算法的同时能提高自己的编程能力。一个好的算法是编写程序的模型,因为它能创造计算机程序,其中还包含了程序的精髓。这与游戏中的“棋谱”是一样的道理,游戏中掌握好策略的一方往往能获胜。
例如,“从画面上方开始追击敌方人物,并用移动炮台攻击敌人”等早期在电视游戏中经常看到的“××式”或“××击”的战斗攻略,如果按照这样的方法操作,不需要花费很长时间,每次都能轻松击败敌人,这就是游戏攻略中的“棋谱”。
“棋谱”是围棋术语,指“某种棋局下,*好的下棋步骤”,在日本象棋或国际象棋中称为“棋式”,英文为theory。下围棋时,如果懂得棋谱,就不需要每次考虑“寻找*好的一步棋”,按照棋谱就可以走出*好的几步棋。棋谱是先人们智慧的结果,因此掌握多种棋谱的人
更容易在对弈中获得胜利。熟练掌握棋谱的人与不懂棋谱的人对弈谁会获胜,显而易见。
计算机算法有同样的道理。学过算法的人写出的程序和没学过算法的人写出的程序有明显的差距。要写出既能正确执行又能提高效率的好程序,算法的学习是不可或缺的。
要点
算法的学习类似学习游戏攻略
算法是编写好程序的“棋谱”
内容介绍
在我们生活的世界中,各种各样形形色色的事物和现象,其中都必定包含着科学的成分。在这些成分中,有些是你所熟知的,有些是你未知的,有些是你还一知半解的。面对未知的世界,好奇的你是不是有很多疑惑、不解和期待呢?!“形形色色的科学”趣味科普丛书,把我们身边方方面面的科学知识活灵活现、生动有趣地展示给你,让你在畅快阅读中收获这些鲜活的科学知识!
21世纪,飞速发展的计算机技术深入到手机、电视、相机、游戏机等的生活产品中。计算机都是依靠程序来运行的。为了编写出能够在计算机上运行良好的程序就必须学习计算机算法的知识。本书用流程图、程序语言等日常生活中经常出现的事物为工具,以图解的形式讲解了算法的相关知识,即使是不具备计算机知识的初学者,也能够轻松理解。
源代码的深层律动:精妙算法的结构解析与实践指南 ——深入理解计算思维的基石,驾驭复杂系统的核心逻辑 本书并非一本探讨特定编程语言语法细节的参考手册,它更像是一份邀请函,邀请有志于提升自身计算素养的读者,一同进入算法设计的殿堂,领略数据结构与逻辑推理如何共同构建起现代软件系统的骨架。我们聚焦的不是“如何用C++或Python实现”,而是“为什么这个特定的逻辑结构能够在效率上超越其他所有方案”。 第一部分:计算的本质与思维的重塑 1. 问题的分解与抽象的艺术:从现实到模型的跨越 在正式进入算法细节之前,我们需要建立一套稳健的思维框架。本书首先探讨了如何识别一个现实世界的问题(例如物流路径规划、资源调度或信息检索),并将其成功地转化为一个可被计算解决的数学模型。这部分内容细致入微地剖析了抽象层次的重要性——过高的抽象可能丢失关键细节,而过低的抽象则会阻碍通用性的实现。我们将通过一系列经典的“建模失败案例”来反向学习如何构建一个既精确又鲁棒的模型。 2. 时间与空间的权衡:效率的度量标准 理解算法的关键在于理解其“代价”。我们不会止步于简单的“快”或“慢”的描述,而是深入讲解大O符号($O$ 记号)背后的数学原理和实际意义。书中详尽地阐述了如何分析算法的最坏情况、最好情况和平均情况复杂度,并辅以大量图例,展示不同阶数复杂度(如 $O(log n)$, $O(nsqrt{n})$, $O(2^n)$)在数据集规模扩大时性能的指数级差异。重点在于培养读者一种“嗅觉”——在设计方案之初,就能预判其性能瓶颈所在。 3. 递归的哲学:自我引用的力量 递归,作为一种强大的数学归纳工具,在算法设计中占据核心地位。本章不仅演示了如何将一个复杂问题分解为规模更小的同类子问题,更着重探讨了尾递归优化、深度限制搜索以及在没有明确栈结构的限制下,如何通过数学归纳法来证明递归算法的正确性与终止性。我们将分析斐波那契数列、汉诺塔问题以及树的遍历,揭示递归调用栈背后的内存管理和控制流机制。 第二部分:核心数据结构与逻辑构建 4. 线性结构的精妙延伸:栈、队列与链表的高级应用 线性结构看似基础,实则蕴含了解决复杂调度和顺序问题的关键。本章超越了基础的“后进先出/先进先出”定义。我们深入研究了双端队列(Deque)在滑动窗口最大值问题中的应用,探讨了循环链表在缓冲区管理中的优势,以及如何利用栈结构来有效处理表达式的解析(如逆波兰表示法)和代码块的嵌套结构。 5. 树的结构:组织信息与加速检索 树形结构是处理层次关系和优化查找效率的利器。我们将细致剖析二叉搜索树(BST)的增删查改操作,并重点分析平衡树(如 AVL 树和红黑树)的旋转与再平衡机制——理解这些操作如何保证了 $O(log n)$ 的查找性能。此外,对于B树和B+树,我们将探讨它们在磁盘I/O效率优化中的独特地位,这是理解数据库索引工作原理的必经之路。 6. 图论基础:连接与路径的迷宫 图是表示相互关联实体的最通用模型。本部分详尽覆盖了图的表示方法(邻接矩阵与邻接表),并系统地介绍了深度优先搜索(DFS)和广度优先搜索(BFS)的应用场景,例如拓扑排序和连通分量的识别。随后,我们转向优化问题,深入解析了Dijkstra算法(单源最短路径)和Floyd-Warshall算法(所有点对最短路径),并强调了它们在处理负权边时的局限性及Bellman-Ford算法的应对策略。 第三部分:高效算法的实现范式 7. 排序的演化史:从朴素到极致 排序算法是算法设计领域最具代表性的研究对象。本书以比较排序为核心,系统对比了归并排序(基于分治策略的稳定性保证)、快速排序(内省的枢轴选择策略)和堆排序(利用堆结构实现高效选择)的内在机制。我们还将探讨非比较排序,如基数排序和计数排序,分析它们在特定数据分布下的性能优势。 8. 贪心策略:局部最优的全局诱惑 贪心算法以其简洁性和高效性著称,但并非所有问题都适用。本章通过最小生成树(Prim和Kruskal算法)和霍夫曼编码等经典案例,阐释了贪心选择性质和最优子结构如何协同作用。关键在于学习识别并构建“切入点”,即哪些局部决策能够保证不会破坏最终解的全局最优性。 9. 动态规划:记忆化的力量与最优子结构的重构 动态规划(DP)被誉为解决重叠子问题和最优子结构问题的利器。本书通过最长公共子序列、背包问题(0/1背包与完全背包)以及矩阵链乘法等经典案例,详细拆解了“状态定义”、“状态转移方程”和“自底向上/自顶向下(带备忘录)”的实现路径。重点在于如何将一个看似指数级的递归问题,通过状态的记录与重用,转化为多项式时间问题。 10. 复杂性理论的边界:不可解的领域 最后,本书将视野拓展到计算的边界。我们探讨了P类问题、NP类问题以及NP完全问题的概念。通过对旅行商问题(TSP)和可满足性问题(SAT)的介绍,读者将理解为什么有些问题即便运用了最高效的算法设计技巧,其求解时间仍然会随输入规模呈指数增长。这部分旨在培养一种审慎的工程态度:何时应放弃精确解,转而寻求近似算法或启发式方法。 结语:算法是思考的逻辑工具 本书旨在提供一套完整的算法思维工具箱,帮助读者超越代码的表面语法,直达计算逻辑的核心。掌握这些结构与方法,将使您在面对任何复杂的工程挑战时,都能以一种结构化、高效且可被验证的方式进行思考和设计。