算法第一章 1.1 基础编程模型--模块化及重定向管道

网上特别多的人都推荐这本塞奇威克的算法书,认为它比高德纳TAOCP好得多(清晰易懂,适合初学者)。
不过书中的代码是java,一度曾让我犹豫,毕竟从来没有学过。
倒不是厌学,而是自己的c语言还没有学会,再学新语言,不成了猴子掰玉米嘛。
后来转念一想,学算法主要是学思想,用什么语言实现并无多大关系,正好用c语言自己去实现,还能锻炼编程能力。
所幸拿到书后,看见第一章一小节,发现java的语法和c竟然非常相似,有main()、return,int、double、char。
循环也是for、while,判断也是if else,完全能够看懂。


在本书中,我们的观点是数据结构是算法的副产品或是结果。
简单的算法也会产生复杂的数据结构,复杂的算法也许只需要简单的数据结构。
当用计算机解决一个问题时,一般都存在多种不同的方法。对于小型问题,只要管用,方法的不同并没有什么区别。
但是对于大型问题,我们就需要设计能够有效利用时间和空间的方法了。
学习算法的主要原因在于它能节约非常多的资源,甚至能够让我们完成一些本不可能完成的任务。
无论在任何应用领域,精心设计的算法都是解决大型问题最有效的方法。
为一项任务选择最合适的算法是困难的,这可能会需要复杂的数学分析,计算机科学中研究这种问题的分支叫做“算法分析”。


书中建议:“你应该将自己编写的每一个程序都当作一个日后可以重用的库”。
Ⅰ. 编写用例,在实现中将计算过程分解为可控的部分。
Ⅱ.  明确静态方法库和与之对应的API
Ⅲ . 实现API和一个能够对应方法进行独立测试的main()函数。
第一条就是分而治之的思想,至于用面向过程,还是面向对象,那是另一回事。
第二条就是将调用和实现分离,做好文本文档及头文件。
第三条就是单元测试。
满足以上开发方式的做法就是"模块化编程",它能带来很多好处:
① 程序整体的代码量很大时,每次处理的模块大小仍然适中;(复杂的细节代码被API取代)
② 可以共享和重用代码而无需重新实现;(函数被创造出来的目的)
③ 很容易用改进的新实现替换老的实现;(调用和实现分离)
④ 为解决编程问题建立合适的抽象模型;(隐藏细节,专注高层)
⑤ 缩小调试范围;(单元测试)

再次讨论重定向与管道的概念

重定向输出

 

重定向输入

 

管道

 

一个程序只是可用往往是不够的。当数据量比较小的时候,检查数组中的每个元素,并进行判断对比,这样的暴力查找也可以解决该问题,而且简单易懂。

那么为什么还需要研究新算法呢?如果没有归并排序和二分查找这样的算法,解决大规模的数据量就会非常消耗资源。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在有关算法的书中,有一些叙述非常严谨,但不够全面;另一些涉及了大量的题材,但又缺乏严谨性。《算法导论(原书第3版)/计算机科学丛书》将严谨性和全面性融为一体,深入讨论各类算法,并着力使这些算法的设计和分析能为各个层次的读者接受。全书各章自成体系,可以作为独立的学习单元;算法以英语和伪代码的形式描述,具备初步程序设计经验的人就能看懂;说明和解释力求浅显易懂,不失深度和数学严谨性。   《算法导论(原书第3版)/计算机科学丛书》全书选材经典、内容丰富、结构合理、逻辑清晰,对本科生的数据结构课程和研究生的算法课程都是非常实用的教材,在IT专业人员的职业生涯中,《算法导论(原书第3版)/计算机科学丛书》也是一本案头必备的参考书或工程实践手册。   第3版的主要变化:   ·新增了van Emde Boas树和多线程算法,并且将矩阵基础移至附录。   ·修订了递归式(现在称为“分治策略”)那一章的内容,更广泛地覆盖分治法。   ·移除两章很少讲授的内容:二项堆和排序网络。   ·修订了动态规划和贪心算法相关内容。   ·流网络相关材料现在基于边上的全部流。   ·由于关于矩阵基础和Strassen算法的材料移到了其他章,矩阵运算这一章的内容所占篇幅更小。   ·修改了对Knuth-Morris-Pratt字符串匹配算法的讨论。   ·新增100道练习和28道思考题,还更新并补充了参考文献。
编辑推荐  Sedgewick之巨著,与高德纳TAOCP一脉相承  几十年多次修订,经久不衰的畅销书  涵盖所有程序员必须掌握的50种算法 内容简介    《算法(第4版)》全面讲述算法数据结构的必备知识,具有以下几大特色。    1、 算法领域的经典参考书:Sedgewick畅销著作的*版,反映了经过几十年演化而成的算法核心知识体系    2、内容全面:全面论述排序、搜索、图处理和字符串处理的算法数据结构,涵盖每位程序员应知应会的50种算法    3、全新修订的代码:全新的Java实现代码,采用模块化编程风格,所有代码均可供读者使用    4、与实际应用相结合:在重要的科学、工程和商业应用环境下探讨算法,给出了算法的实际代码,而非同类著作常用的伪代码   5、富于智力趣味性:简明扼要的内容,用丰富的视觉元素展示的示例,精心设计的代码,详尽的历史和科学背景知识,各种难度的练习,这一切都将使读者手不释卷    6、科学的方法:用合适的数学模型精确地讨论算法性能,这些模型是在真实环境中得到验证的   7、与网络相结合:配套网站algs4.cs.princeton.edu提供了本书内容的摘要及相关的代码、测试数据、编程练习、教学课件等资源 作者简介    Robert Sedgewick,斯坦福大学博士,导师为Donald E.Knuth,从1985年开始一直担任普林斯顿大学计算机科学系教授,曾任该系主任,也是AdobeSystems公司董事会成员,曾在Xerox PARC、国防分析研究所(Institute for DefenseAnalyses)和法国国家信息与自动化研究所(INRIA)从事研究工作。他的研究方向包括解析组合学、数据结构算法的分析与设计、程序可视化等。    KevinWayne,康奈尔大学博士,普林斯顿大学计算机科学系高级讲师,研究方向包括算法的设计、分析和实现,特别是图和离散优化。 目  录 第1章  基础 1.1 基础编程模型 1.1.1 Java程序的基本结构 1.1.2 原始数据类型与表达式 1.1.3  语句 1.1.4  简便记法 1.1.5  数组 1.1.6  静态方法 1.1.7  API 1.1.8  字符串 1.1.9  输入输出 1.1.10  二分查找 1.1.11  展望 1.2  数据抽象 1.2.1  使用抽象数据类型 1.2.2  抽象数据类型举例 1.2.3  抽象数据类型的实现 1.2.4  更多抽象数据类型的实现 1.2.5  数据类型的设计 1.3  背包、队列和栈 1.3.1  API 1.3.2  集合类数据类型的实现 1.3.3  链表 1.3.4  综述 1.4  算法分析 1.4.1  科学方法 1.4.2  观察 1.4.3  数学模型 1.4.4  增长数量级的分类 1.4.5  设计更快的算法 1.4.6  倍率实验 1.4.7  注意事项 1.4.8  处理对于输入的依赖 1.4.9  内存 1.4.10  展望 1.5  案例研究:union-find算法 1.5.1  动态连通性 1.5.2  实现 1.5.3  展望 第2章  排序 2.1  初级排序算法 2.1.1  游戏规则 2.1.2  选择排序 2.1.3  插入排序 2.1.4  排序算法的可视化 2.1.5  比较两种排序算法 2.1.6  希尔排序 2.2  归并排序 2.2.1  原地归并的抽象方法 2.2.2  自顶向下的归并排序 2.2.3  自底向上的归并排序 2.2.4  排序算法的复杂度 2.3  快速排序 2.3.1  基本算法 2.3.2  性能特点 2.3.3  算法改进 2.4  优先队列 2.4.1  API 2.4.2  初级实现 2.4.3  堆的定义 2.4.4  堆的算法 2.4.5  堆排序 2.5  应用 2.5.1  将各种数据排序 2.5.2  我应该使用哪种排序算法 2.5.3  问题的归约 2.5.4  排序应用一览 第3章 查找 3.1 符号表 3.1.1 API 3.1.2 有序符号表 3.1.3 用例举例 3.1.4 无序链表中的顺序查找 3.1.5 有序数组中的二分查找 3.1.6 对二分查找的分析 3.1.7 预览 3.2 二叉查找树 3.2.1 基本实现 3.2.2 分析 3.2.3 有序性相关的方法与删除操作 3.3 平衡查找树 3.3.1 2-3查找树 3.3.2 红黑二叉查找树 3.3.3 实现 3.3.4 删除操作 3.3.5 红黑树的性质 3.4 散列表 3.4.1 散列函数 3.4.2 基于拉链法的散列表 3.4.3 基于线性探测法的散列表 3.4.4 调整数组大小 3.4.5 内存使用 3.5 应用 3.5.1 我应该使用符号表的哪种实现 3.5.2 集合的API 3.5.3 字典类用例 3.5.4 索引类用例 3.5.5 稀疏向量 第4章  图 4.1  无向图 4.1.1  术语表 4.1.2  表示无向图的数据类型 4.1.3  深度优先搜索 4.1.4  寻找路径 4.1.5  广度优先搜索 4.1.6  连通分量 4.1.7  符号图 4.1.8  总结 4.2  有向图 4.2.1  术语 4.2.2  有向图的数据类型 4.2.3  有向图中的可达性 4.2.4  环和有向无环图 4.2.5  有向图中的强连通性 4.2.6  总结 4.3  最小生成树 4.3.1  原理 4.3.2  加权无向图的数据类型 4.3.3  最小生成树的API和测试用例 4.3.4  Prim算法 4.3.5  Prim算法的即时实现 4.3.6  Kruskal算法 4.3.7  展望 4.4  最短路径 4.4.1  最短路径的性质 4.4.2  加权有向图的数据结构 4.4.3  最短路径算法的理论基础 4.4.4  Dijkstra算法 4.4.5  无环加权有向图中的最短路径算法 4.4.6  一般加权有向图中的最短路径问题 4.4.7  展望 第5章  字符串 5.1  字符串排序 5.1.1  键索引计数法 5.1.2  低位优先的字符串排序 5.1.3  高位优先的字符串排序 5.1.4  三向字符串快速排序 5.1.5  字符串排序算法的选择 5.2  单词查找树 5.2.1  单词查找树 5.2.2  单词查找树的性质 5.2.3  三向单词查找树 5.2.4  三向单词查找树的性质 5.2.5  应该使用字符串符号表的哪种实现 5.3  子字符串查找 5.3.1  历史简介 5.3.2  暴力子字符串查找算法 5.3.3  Knuth-Morris-Pratt子字符串查找算法 5.3.4  Boyer-Moore字符串查找算法 5.3.5  Rabin-Karp指纹字符串查找算法 5.3.6  总结 5.4  正则表达式 5.4.1  使用正则表达式描述模式 5.4.2  缩略写法 5.4.3  正则表达式的实际应用 5.4.4  非确定有限状态自动机 5.4.5  模拟NFA的运行 5.4.6  构造与正则表达式对应的 5.5  数据压缩 5.5.1  游戏规则 5.5.2  读写二进制数据 5.5.3  局限 5.5.4  热身运动:基因组 5.5.5  游程编码 5.5.6  霍夫曼压缩 第6章  背景 索引
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值