算法导论1-4章

第一章  算法在计算机中的应用

第二章  算法入门

     插入排序

     算法设计(分治法,分治法分析)

第三章  函数增长(渐进记号,时间复杂度)

第四章  递归式

     代换法

     递归树方法

     主方法(主定理的证明)

第一章是个概要。

第二章以一个插入排序为例子,来介绍什么是算法,本书中讲解每个算法的结构,接着讲述了如何分析算法的性能,并介绍了分治算法及分析。

第三章数学知识

第四章介绍递归,及递归式的时间复杂度分析的3种方法。

-------------------------------------------------------------------------------------------------------------------------------------------------

第一章

Having a solid base of algorithmic knowledge and technique is one characteristic that separates the truly skilled programmers from the novices. With modern computing technology, you can accomplish some tasks without knowing much about algorithms, but with a good background in algorithms, you can do much, much more.


是否拥有扎实的算法知识和技术基础,是区分优秀程序员与新手的一项重要特征。利用当代的计算技术,无需很多算法方面的知识,也可以完成一些任务,但是有了良好的算法基础和背景,可以做的事就多得多,可以完成别人完成不了的任务。

-------------------------------------------------------------------------------------------------------------------------------------------------

第二章 


插入排序,前面写过,最简单的算法。

本书约定:伪代码形式,正确性证明(初始化,循环不变式的保持,终止

时间复杂度分析:最坏情况和平均情况分析,增长的数量级

分治法:归并排序,前面写过,再次贴出:

1)  递归的归并数组A从下标p到r的元素:

MERGE-SORT(A, p, r)
1 if p < r 2 then q (p + r)/2 3 MERGE-SORT(A, p, q) 4 MERGE-SORT(A, q + 1, r) 5 MERGE(A, p, q, r)

2)  关键代码:合并2个有序列

MERGE(A, p, q, r) 1 n

1

  q - p + 1
 2  n

2

  r - q
 3  create arrays L[1  n

1

 + 1] and R[1  n

2

 + 1]
 4  for i  1 to n

1

 5       do L[i]  A[p + i - 1]
 6  for j  1 to n

2

 7       do R[j]  A[q + j]
 8  L[n1 + 1]  
 9  R[n2 + 1]  
10  i  1
11  j  1
12  for k  p to r
13       do if L[i]  R[j]
14             then A[k]  L[i]
15                  i  i + 1
16             else A[k]  R[j]
17                  j  j + 1


为什么再次贴出,注意:

递归,分治;

哨兵元素的技巧:与之前没有用哨兵元素的比较,12到17行合并2个有序列显得简单许多。

用递归树来分析归并排序的时间复杂度:很重要,请看书上阅读时做的笔记。



习题:

2.3-2    如果不适用哨兵元素,改写合并2个有序列的过程

麻烦许多,参看之前写的合并排序

2.3-5  说明为什么二分查找的时间复杂度是log(n),,二分查找可以是迭代的也可以是递归的

二分查找,经典问题

2.3-6   折半插入排序:在插入排序时,用二分查找的方法插入,可以将时间复杂度提高到 nlog(n)

2.3-7  设计一个nlog(n)的算法,判断集合S中是否存在两个和等于某个数x的两个数

google的笔试题,前面讨论过,排序,变治转化。


思考题:

2-1 在合并排序中可以对小数组采用插入排序,时间复杂度的分析,见书

2-4 逆序对:一个重要的问题

对归并排序略作改进,进行计数,可以统计逆序对的个数



--------------------------------------------------------------------------------------------------------------------------------------------------

第三章  函数增长


------------------------------------------------------------------------------------------------------------------------------------------------

第四章  递归式


代换法:猜测解的形式+数学归纳法证明

递归树方法:重要!用递归树来看分治算法的时间复杂度尤其显而易见,注意怎么画,见书

主方法:前面在将分治算法时介绍过,记住公式

-------------------------------------------------------------------------------------------------------------------------------------------------

总结:
只能说是一个简介


posted @ 2011-08-10 19:50  jinmengzhe  阅读(932)  评论(0编辑  收藏  举报