《算法导论》读书笔记 第一章(一)

来源:互联网 发布:ug编程多久可以学会 编辑:程序博客网 时间:2024/05/11 01:04

《算法导论》读书笔记——第一章(一)

写读书笔记是为了督促自己完成任务,一步一步实现自己的目标,拒绝堕落,拒绝浪费时间,坚持努力,不让自己失望。

这两天我读了导论的前两章和附录里的图论基础知识,前两章讲了什么是算法,以插入排序和合并排序讲了算法复杂度的分析方法和分治算法的基本思想。图论附录讲了图的基本知识概念,树的基本知识,这些都是深入学习图论很重要的基础。

算法是什么?

An algorithm is any well-defined computational procedure that takes some value or set of values,as input ans produces some value or set of values,as output.

里面有几个重点词汇

“well-defined”——规格良好的,也就是说算法要处理的问题必须是能够规格化处理的问题。比如,排序算法,要处理的问题是一个数列,一种可以规格化为数组,各个元素具有各自的位置,可以进行各种处理,所以可以在上面运行排序算法。

“computational procedure”计算过程,计算包括算术运算、逻辑运算包括数据存储的话还有赋值运算等,例如基于比较的排序算法,进行的运算包括比较、赋值(交换)等运算,这是算法内部的事情,从外边看来,算法就是一个procedure,一些操作,或说一些步骤。

然后就是“input”和“output”,这是算法的输入和输出,即要处理的问题包含的规格良好的输入,输出则是按照问题的要求算法执行完得到的结果,规模,格式等都有可能有限制。

算法的几个特点或属性:

1.效率:不同的算法效率可能会相差很大:如插入排序和归并排序,随着输入规模的加大,归并排序的效率优势愈加明显。

2.实现复杂度:不同的算法实现的复杂度不一样,有的很容易实现,有的却很复杂,如红黑树、平衡树还有一些图论算法等。

3.与数据结构的结合:程序 = 算法 + 数据结构。很多算法的实现要借助好的数据结构,还是上面的规格化良好的问题,这就产生基于图的算法,基于树的算法等,很多时候数据结构是为方便算法的实现,或提高算法的效率,这样数据结构本身就包含了算法在内了。

算法的时间复杂度分析。我现在可以分析的貌似只有那些带for循环的,简单递归的(如暴搜,回溯等),二分的(经典的logn)。其实导论上讲了分析的方法,鉴于ACM中用到的没那么复杂我就暂时跳过了那一部分主定理证明等。

InsertSort(插入排序)

 

#include <iostream>using namespace std;void InsertSort(int a[],int n){int i,j;int key;for(j=2 ; j<=n ; j++){key = a[j];i = j-1;while(i>0 && a[i]>key){a[i+1] = a[i];i--;}a[i+1] = key;}}int main(){int a[99];for(int i=1 ; i<99 ; i++){a[i] = rand();}InsertSort(a,99);for(int i=1 ; i<99 ; i++){cout << a[i] << ' ';}return 0;} 


MergeSort(归并排序)

#include <iostream>#include <time.h>#define N 100using namespace std;void Merge(int array[],int begin,int mid,int end){int length1 = mid-begin+1,length2 = end-mid;int *tmpArray1 = new int[length1+1];int *tmpArray2 = new int[length2+1];int i,j;for(i=0 ; i<length1 ; i++){tmpArray1[i] = array[begin+i];}for(j=0 ; j<length2 ; j++){tmpArray2[j] = array[mid+1+j];//ÕâÀïÒª¡°+1¡±}tmpArray1[i] = tmpArray2[j] = 99999;i = 0;j = 0;for(int k=begin ; k<=end ; k++){if(tmpArray1[i] < tmpArray2[j]){array[k] = tmpArray1[i];i++;}else{array[k] = tmpArray2[j];j++;}}}void MergeSort(int array[],int begin,int end){int mid;if(begin < end){mid = (begin+end)/2;MergeSort(array,begin,mid);MergeSort(array,mid+1,end);Merge(array,begin,mid,end);}}int main(){int a[N];srand( time(0) );for(int i=0 ; i<N ; i++){a[i] = rand();}MergeSort(a,0,N);for(int i=0 ; i<N ; i++){cout << a[i] << ' ';}return 0;}


原创粉丝点击