您的位置:首页 > 编程语言

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

2016-09-02 12:43 531 查看
网上特别多的人都推荐这本塞奇威克的算法书,认为它比高德纳TAOCP好得多(清晰易懂,适合初学者)。

不过书中的代码是java,一度曾让我犹豫,毕竟从来没有学过。

倒不是厌学,而是自己的c语言还没有学会,再学新语言,不成了猴子掰玉米嘛。

后来转念一想,学算法主要是学思想,用什么语言实现并无多大关系,正好用c语言自己去实现,还能锻炼编程能力。

所幸拿到书后,看见第一章一小节,发现java的语法和c竟然非常相似,有main()、return,int、double、char。

循环也是for、while,判断也是if else,完全能够看懂。

在本书中,我们的观点是数据结构是算法的副产品或是结果。

简单的算法也会产生复杂的数据结构,复杂的算法也许只需要简单的数据结构。

当用计算机解决一个问题时,一般都存在多种不同的方法。对于小型问题,只要管用,方法的不同并没有什么区别。

但是对于大型问题,我们就需要设计能够有效利用时间和空间的方法了。

学习算法的主要原因在于它能节约非常多的资源,甚至能够让我们完成一些本不可能完成的任务。

无论在任何应用领域,精心设计的算法都是解决大型问题最有效的方法。

为一项任务选择最合适的算法是困难的,这可能会需要复杂的数学分析,计算机科学中研究这种问题的分支叫做“算法分析”。

书中建议:“你应该将自己编写的每一个程序都当作一个日后可以重用的库”。

Ⅰ. 编写用例,在实现中将计算过程分解为可控的部分。

Ⅱ.  明确静态方法库和与之对应的API

Ⅲ . 实现API和一个能够对应方法进行独立测试的main()函数。

第一条就是分而治之的思想,至于用面向过程,还是面向对象,那是另一回事。

第二条就是将调用和实现分离,做好文本文档及头文件。

第三条就是单元测试。

满足以上开发方式的做法就是"模块化编程",它能带来很多好处:

① 程序整体的代码量很大时,每次处理的模块大小仍然适中;(复杂的细节代码被API取代)

② 可以共享和重用代码而无需重新实现;(函数被创造出来的目的)

③ 很容易用改进的新实现替换老的实现;(调用和实现分离)

④ 为解决编程问题建立合适的抽象模型;(隐藏细节,专注高层)

⑤ 缩小调试范围;(单元测试)

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





 





 





 

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

那么为什么还需要研究新算法呢?如果没有归并排序和二分查找这样的算法,解决大规模的数据量就会非常消耗资源。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息