读《编程珠玑》 (二)
第三章 数据结构
程序的结构很大程度上取决于数据结构的表达,通过重新组织数据结构很多时候可以改变程度的大小和效率,增强程序的可维护性。
程序员在节省空间方面无计可施时,将自己从代码中解脱出来, 退回起点并集中心力研究数据,常常能有奇效。表示法是编程的精华。
下面是退回起点进行思考时的几条原则:
-
使用数组重新编写重复代码。冗长的相似代码常常可以使用最简单的数据结构—— 数组来更好地表述。
-
封装复杂结构。当需要非常复杂的数据结构时,使用抽象术语进行定义, 并将操作表示为类。
-
尽可能使用高级工具。超文本,名字-值对,电子表格,数据库, 编程语言等都是特定问题领域中的强大的工具。
-
从数据得出程序的结构。在动手编写代码之前,优秀的程序员会彻底理解输入, 输出和中间数据结构,并围绕这些结构创建程序。
编程有时候不能靠第一直觉来进行,可能需要更多的思考,对于各方面如数据结构,算法等的仔细定义。
第四章 编写正确的程序
前面三章中,讨论了问题的定义,算法设计和数据结构的选择,在完成这些工作后,需要编写正确的程序来达到我们的目的。
二分查找是一个非常普通的算法,然而正确的实现它并不如看上去那么简单。Knuth在书《Sorting and Searching》中就曾指出,尽管第一个二分查找程序于1946年就公布了,但第一个没有bug的二分查找程序在1962年才出现。其基本的伪代码如下:
l=0;u=n-1
loop {mustbe(l,u)} if l>u p=-1;break m=(l+u)/2 case x[m]<t: l=m+1
x[m]=t: p=m;break x[m]>t: u=m-1