Book Review of “The practice of programming” (Ⅱ)
The practice of programming
Chapter 2 Algorithms and Data Structures
- Searching
- sequential search (linear search):
easy but the amount of work is directly proportional to the amount of data to be searched
binary search:
The number of steps is logn, so it's more efficient for a lager array
- Sorting 
- Libraries 
- qsort: for example, sort an array of strings:/* scmp: string compare of *pl and *p2 */
int scmp(const void *p1, const void *p2)
{
char *v1, *v2;
v1 = *(char **) p1;
v2 = *(char **) p2;
return strcmp(v1, v2) ;
}char astr[N] ; qsort(str, N, sizeof(str[O]) , scmp);
ANSIC also defines a binary search routine, bsearch.
/* lookup: use bsearch t o f i n d name i n tab, return index */
int lookup(char *name, Nameval tab[], i n t ntab)
{
Nameval key, anp;
key.name = name;
key-value = ; /* unused; anything will do */
np = (Nameval *) bsearch(&key, tab, ntab, sizeof (tablo]), nvcmp);
if (np == NULL)
return -;
else
return np-tab;
}As with qsort, the comparison routine receives the address of the items to be compared, so the key must have that type; in this example, we need to construct a fake Nameval entry that is passed to the comparison routine. The comparison routine itself is a function nvcmp that compares two Nameval items by calling strcmp on their string components, ignoring their values:
/* nvcmp: compare two Nameval names */
int nvcmp(const void *va, const void *vb){
const Nameval *a, *b;
a = (Nameval *) va;
b = (Nameval *) vb:
return strcmp(a->name, b->name);
}
The standard C++ library has a generic algorithm called sort that guarantees O(n1ogn) behavior.
int arr[N];
sort(arr, arr + N);
- A Java Quicksort
One big difference from C or Cuis that in Java it is not possible to pass a comparison function to another function; there are no function pointers. Instead we create an interjGace whose sole content is a function that compares two Objects. For each data type to be sorted, we then create a class with a member function that implements the interface for that data type. We pass an instance of that class to the sort function, which in turn uses the comparison function within the class to compare elements.
defining an interface named Cmp that declares a single member, a comparison function cmp that compares two Objects:
interface Cmp {
int cmp(0bject x, Object y){
}
write comparison functions that implement this interface; for example,
this class defines a function that compares Integers:
// Icmp : Integer comparison
class Icmp implements Cmp {
public int cmp(Object o1, Object o2)
{
int i1 = ((Integer) o1).intValue() ;
int i2 = ((Integer) o2).intValue() ;
if ( i1 < i2)
return -1;
else if (i1 == i2)
return 0;
else
return 1;
}
}
// Scmp: String comparison
class Scmp implements Cmp {
public int cmp(Object o1. Object o2)
{
String s1 = (String) o1;
String s2 = (String) o2;
return s1.compareTo(s2) ;
}
}We can sort only types that are derived from Object with this mechanism; it cannot
be applied to the basic types like i n t or double. This is why we sort Integers rather
than int.
The most significant change is the use of indices left and right, since Java does not
have pointers into arrays.
// Quicksort. sort: quicksort v[left] . .v[right]
static void sort(Object[] v, intleft , intright, Cmp cmp)
{
int i, last;
if ( left >= right) // nothing t o do
return;
swap(v, left , rand(1eft. right)) ; // move pivot elem
last = left ; // tov[left]
for (i = left+l; i <= right; i++) // p a r t i t i o n
i f (cmp.cmp(v[i], left]) < 0)
swap(v, ++last, i);
swap(v, left , last); // restore pivot elem
sort(v, left , last-1, cmp); // recursively sort
sort(v, last+l, right, cmp) ; // each part
} // Quicksort.swap: swap v[i] and v[j]
static void swap(Object[] v, int i, int j) {
Object temp;
temp = v[i];
v[i] = v[j];
v[j] = temp;
}The functions sort, swap, and rand, and the generator object rgen are the rnembers of a class Quicksort.
call Quicksort . sort to sort a String array
String[] sarr = new String[n];
// fill n elements of sarr...
Quicksort.sort(sarr, 0, sarr.length-1, new Scmp());
- O-Notation
Purpose: to compare running times and space requirements of algorithms independently of programming language
- Growing Arrays 
typedef struct Nameval Nameval ;
struct Nameval {
char *name;
int value ;
};
struct NVtab {
int nval ; /* current number of values */
int max ; /* allocated number of values */
Nameval tnameval ; /* array of name-value pairs */
} nvtab;
enum { NVINIT = , NVGROW = };
/* addname: add new name and value to nvtab */
int addname (Nameval newname) {
Nameval tnvp ;
if (nvtab.nameva1 == NULL) /* f i r s t time */
nvtab. nameval =
(Nameval *) malloc(NVINIT t sizeof (Nameval )) ;
if (nvtab.nameval == NULL)
return -;
nvtab.max = NVINIT;
nvtab.nval = ;
} else if (nvtab-nval >= nvtab.max) { /* grow */
nvp = (Nameval *) realloc(nvtab.nameval,
(NVGROW*nvtab.max) * sizeof(Nameval));
if (nvp == NULL)
return -;
nvtab.max *= NVGROW;
nvtab.nameval = nvp;
}
nvtab.nameval[nvtab.nval] = newname;
return nvtab.nval++;
}The call to realloc grows the array to the new size, preserving the existing elements, and returns a pointer to it or NULL if there isn't enough memory.
We can't add elements directly. If the reallocation were to fail, the original array would be lost.
- Lists
/* newitem: create new item from name and value */
Nameval tnewi tem(char tname, int value){
Nameval *newp;
newp = (Nameval *) emalloc (sizeof (Nameval )) ;
newp->name = name;
newp->value = value ;
newp->next = NULL;
return newp;
}The simplest and fastest way to assemble a list is to add each new element to the front.
We can make "apply" more flexible by providing it with an argument to be passed each time it calls the function. So apply has three arguments: the list, a function to be applied to each element of the list, and an argument for that function:
/* apply: execute fn for each element of listp */
void apply (Nameval *listp, void (*fn) (Nameval* , void*) , void *arg)
{
for ( ; listp != NULL; listp = listp->next)
(*fn)(listp, arg); /* call the function */
}For instance, to destroy a list we must use more care:
for ( ; listp != NULL; l i s t p = next) {
next = listp->next;
/* assumes name is freed elsewhere */
free (listp) ;
}
- Trees
- Hash Tables 
The idea is to pass the key through a hash function to generate a hash value that will be evenly distributed through a modest-sized integer range.
Book Review of “The practice of programming” (Ⅱ)的更多相关文章
- Book Review of “The practice of programming” (Ⅳ)
		The practice of programming Chapter 4 Interfaces A good programmer should always be good at designin ... 
- Book Review of “The practice of programming” (Ⅲ)
		The practice of programming Chapter 3 Design and Implementation In this section, we focus on one kin ... 
- Book Review of "The Practice of Programming" (Ⅰ)
		The Practice of Programming In the preface, the author illustrates four basic principles of programm ... 
- 2015年第2本(英文第1本):《The Practice of Programming》
		2015年计划透析10本英文原著,最开始选定的第一本英文书是<Who Moved my Cheese>,可是这本书实在是太短.太简单了,总体的意思就是要顺应变化,要跳出自己的舒适区,全文不 ... 
- net programming guid
		Beej's Guide to Network Programming Using Internet Sockets Brian "Beej Jorgensen" Hallbeej ... 
- FRP represents an intersection of two programming paradigms.
		FRP represents an intersection of two programming paradigms. Functional programming Functional progr ... 
- [转]9个offer,12家公司,35场面试,从微软到谷歌,应届计算机毕业生的2012求职之路
		1,简介 毕业答辩搞定,总算可以闲一段时间,把这段求职经历写出来,也作为之前三个半月的求职的回顾. 首先说说我拿到的offer情况: 微软,3面->终面,搞定 百度,3面->终面,口头of ... 
- 9个offer,12家公司,35场面试,从微软到谷歌,应届计算机毕业生的2012求职之路
		1,简介 毕业答辩搞定,总算可以闲一段时间,把这段求职经历写出来,也作为之前三个半月的求职的回顾. 首先说说我拿到的offer情况: 微软,3面->终面,搞定 百度,3面->终面,口头of ... 
- (转)9个offer,12家公司,35场面试,从微软到谷歌,应届计算机毕业生的2012求职之路
		原文:http://www.cnblogs.com/figure9/archive/2013/01/09/2853649.html 1,简介 毕业答辩搞定,总算可以闲一段时间,把这段求职经历写出来,也 ... 
随机推荐
- nginx搭建文件服务器
			在部署了各种应用后,产生的日志文件,需要在线下载查看,不用每次登陆服务器去拿: 这里,因为服务器部署了很多的应用程序,可以建一个主目录mylog,在主目录里用软连接将需要的各个日志文件夹都建好连接 l ... 
- 第十三篇:multimap容器和multiset容器中的find操作
			前言 multimap容器是map容器的“ 增强版 ”,它允许一个键对应多个值.对于map容器来说,find函数将会返回第一个键值匹配元素所在处的迭代器.那么对于multimap容器来说,find函数 ... 
- 再论IBatisNet + Castle进行项目的开发
			随着项目的进展,Castle和IBatisNet给我的惊喜更多.Com+很重,不需要分布式的中小项目慎用,NHibernate虽好,NHibernate的2005-9-20发布了最新版本1.0-rc1 ... 
- 《ASP.NET 1200例》ref关键字与out关键字
			REF关键字 ref 关键字会导致通过引用传递的参数,而不是值. 通过引用传递的效果是在方法中对参数的任何改变都会反映在调用方的基础参数中. 引用参数的值与基础参数变量的值始终是一样的. 不要将“通过 ... 
- SQL Server 2008 R2 开启远程连接
			因为sql server 2008默认是不允许远程连接的,sa帐户也是默认禁用的,如果想要在本地用SSMS(SQL Server Management Studio Express) 连接远程服务器上 ... 
- c#的小技巧
			很多.net的使用小技巧,总是要自己记下来的,给自己. 一:时间格式话中H和h的区别 DateTime.ToString("yyyy-MM-dd HH:mm:ss");//转化成2 ... 
- The Thinking of AutomaticTest(有关自动化测试的思考)
			考虑因素: 容易维护 简洁易懂 代码重用性好 系统的稳定性强 UI自动化: 数据的获取:装载的数据文件类型.数据的形式.数据的解析方法定义. 1.利用Junit单元测试组织用例,明确输入数据.预期 ... 
- myslq中插入时间当前时间
			create table classic_movie_info( id ) primary key auto_increment not null, movie_name varchar(), mov ... 
- JAVA 遍历文件夹下的所有文件(递归调用)
			package file; import java.io.File; public class Test1 { public static void main(String[] args) { Str ... 
- python内存泄露查找
			1 前言: 1.1 像Java程序一样,虽然Python本身也有垃圾回收的功能,但是同样也会产生内存泄漏的问题 1.2 在Python程序里,内存泄漏是由于一个长期持有的对象不断的往一个dict或者l ... 
