主要取材自两本书:
计算机算法C++语言描述 第2版 Ellis Horowitz et al著
数据结构基础C语言版第2版 Ellis Horowitz et al著
这个作者的写书风格很符合我这个非科班计算机从业者的胃口。数据结构基础前8章我去年仔细动手做过一遍,因此这次整理的是9~12章的高级内容。
传统算法书只对很少的几个问题给出最优算法,但对设计过程着墨较少。作者认为算法书应该以设计为主分析为辅。
算法取自一个写数学课本的波斯作家。算法指一个有限代码行,如果按其执行,可完成某一个特定任务。
有3中方法来分析平摊代价:1.聚集法;2.算账法;3.势能法。算账法最常用,另两种不好计算。
随机算法是指使用了随机发生器的算法。它分为拉斯维加斯算法和蒙特卡罗算法。前者可以重复,后者则不可重复。
任意支持查找最大最小值,插入以及删除最小值(或最大值)的数据结构类型称为优先级队列。
分治策略将输入分为k个子问题。将子问题的解拼凑成原问题的解。
分治策略例子:
从n个元素找最大最小值(I.Pohl)
快速排序(C.A.R.Hoare)
已知n个元素,想确定其中第k小的元素
int Partition(int *a,int m,int p)
{
int v=a[m];
int i=m;
int j=p;
do
{
do i++;
while(a[i]<v);
do j--;
while(a[j]>v);
if(i>j) myswap(a,i,j);
}while(i<j);
a[m] = a[j];
a[j] = v;
return j;
}
void select1(int *a, int n, int k)
{
int low=1, up=n+