The practice of programming


Chapter 2 Algorithms and Data Structures

  • Searching
  1. sequential search (linear search):

    easy but the amount of work is directly proportional to the amount of data to be searched

  2. binary search:
    The number of steps is logn, so it's more efficient for a lager array

  • Sorting

  • Libraries

  1. 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);
  2. 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);
    }
  3. 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.

  1. 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){
    }
  2. 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.

  3. // 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.

  4. 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” (Ⅱ)的更多相关文章

  1. Book Review of “The practice of programming” (Ⅳ)

    The practice of programming Chapter 4 Interfaces A good programmer should always be good at designin ...

  2. Book Review of “The practice of programming” (Ⅲ)

    The practice of programming Chapter 3 Design and Implementation In this section, we focus on one kin ...

  3. Book Review of "The Practice of Programming" (Ⅰ)

    The Practice of Programming In the preface, the author illustrates four basic principles of programm ...

  4. 2015年第2本(英文第1本):《The Practice of Programming》

    2015年计划透析10本英文原著,最开始选定的第一本英文书是<Who Moved my Cheese>,可是这本书实在是太短.太简单了,总体的意思就是要顺应变化,要跳出自己的舒适区,全文不 ...

  5. net programming guid

    Beej's Guide to Network Programming Using Internet Sockets Brian "Beej Jorgensen" Hallbeej ...

  6. FRP represents an intersection of two programming paradigms.

    FRP represents an intersection of two programming paradigms. Functional programming Functional progr ...

  7. [转]9个offer,12家公司,35场面试,从微软到谷歌,应届计算机毕业生的2012求职之路

    1,简介 毕业答辩搞定,总算可以闲一段时间,把这段求职经历写出来,也作为之前三个半月的求职的回顾. 首先说说我拿到的offer情况: 微软,3面->终面,搞定 百度,3面->终面,口头of ...

  8. 9个offer,12家公司,35场面试,从微软到谷歌,应届计算机毕业生的2012求职之路

    1,简介 毕业答辩搞定,总算可以闲一段时间,把这段求职经历写出来,也作为之前三个半月的求职的回顾. 首先说说我拿到的offer情况: 微软,3面->终面,搞定 百度,3面->终面,口头of ...

  9. (转)9个offer,12家公司,35场面试,从微软到谷歌,应届计算机毕业生的2012求职之路

    原文:http://www.cnblogs.com/figure9/archive/2013/01/09/2853649.html 1,简介 毕业答辩搞定,总算可以闲一段时间,把这段求职经历写出来,也 ...

随机推荐

  1. python入门(五):面向对象

    面向对象术语 类(Class): 用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.对象是类的实例. 类变量:类变量在整个实例化的对象中是公用的.类变量定义在类中且 ...

  2. python 之 多进程

    阅读目录 1. Process 2. Lock 3. Semaphore 4. Event 5. Queue 6. Pipe 7. Pool 序. multiprocessingpython中的多线程 ...

  3. iOS UITextView 输入内容实时更新cell的高度

    iOS UITextView 输入内容实时更新cell的高度 2014-12-26 11:37 编辑: suiling 分类:iOS开发 来源:Vito Zhang'blog  11 4741 UIT ...

  4. 爬虫入门【11】Pyspider框架入门—使用HTML和CSS选择器下载小说

    开始之前 首先我们要安装好pyspider,可以参考上一篇文章. 从一个web页面抓取信息的过程包括: 1.找到页面上包含的URL信息,这个url包含我们想要的信息 2.通过HTTP来获取页面内容 3 ...

  5. OracleUNDO

    UNDO作用 数据的回滚 一致性读 表的闪回(事务,查询的闪回....) 失败会话的恢复 数据的回滚 SQL> rollback; 回滚的过程就是从回滚段里拿到刚刚执行的这条语句产生的回滚,然后 ...

  6. eclipse/IDEA使用maven

    下载,解压(无须安装),配置环境变量,命令行下mvn -v测试.https://www.cnblogs.com/luotaoyeah/p/3764533.html eclipse使用maven 为ec ...

  7. delphi 模拟POST提交数据

    unit GetHttpInfo; interface uses Classes, WinINet, Sysutils, windows, IDURI, IdSSLOpenSSL , IdBaseCo ...

  8. 003-mysql查询表的数据大小

    在需要备份数据库里面的数据时,我们需要知道数据库占用了多少磁盘大小,可以通过一些sql语句查询到整个数据库的容量,也可以单独查看表所占容量. 1.查看数据库表结构大小,要查询表所占的容量,就是把表的数 ...

  9. Maven学习笔记—私服(包含maven的setting.xml配置)

    为什么要用远程仓库(私服) 如果没有私服,我们所需的所有构件都需要通过maven的中央仓库和第三方的maven仓库下载到本地,而一个团队中的所有人都重复的从maven仓库下载构件,这样就加大了中央仓库 ...

  10. 用仿ActionScript的语法来编写html5——第六篇,TextField与输入框

    一,对比1,html5中首先看看在html5的canvas中的文字显示 var canvas = document.getElementById("myCanvas"); var ...