数据结构介绍(二)

一、基本理论

1.数据与信息

数据是信息的载体,有序的数据组织就形成了信息。信息是人类可以直接利用或感知的意识形式。而数据则是用来被计算机识别、存储和处理的,它是计算机利用或感知的基本单位。

 

2.数据类型

数据类型就是定义在一个值的集合和定义在这个值集合上的一组操作的总称。

 

3.抽象数据类型

抽象数据类型定义了一个数据的逻辑结构,以及在此结构上的一组算法。抽象数据类型描述程序处理的实体时,强调的是其本质特征、其所完成的功能,以及它和外部用户之间交互的接口,也就是ADT的数据抽象特性。

 

二、算法的设计

1.贪婪算法

贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,但对范围相当广泛的许多问题他能产生整体最优解或者是整体最优解的近似解。

用贪婪法设计算法的特点是一步一步地进行,常以当前情况为基础根据某个优化测度作最优选择,而不考虑各种可能的整体情况,它省去了为找最优解要穷尽所有可能而必须耗费的大量时间,它采用自顶向下,以迭代的方法做出相继的贪心选择,每做一次贪心选择就将所求问题简化为一个规模更小的子问题,通过每一步贪心选择,可得到问题的一个最优解,虽然每一步上都要保证能获得局部最优解,但由此产生的全局解有时不一定是最优的,所以贪婪法不要回溯。

例子:找钱

可以解决的经典问题有如下几种:

1)图的最小生成树问题;

2)图的最短路径问题;

3)最小化任务执行的平均时间问题;

4)背包问题;

 

2.分治算法

是一种技巧性很高,不易理解的算法。

可以使用分治法解决的问题有如下特征:

1)整个问题可以分解为两个或者多个较小的子问题;

2)对每个子问题的求解类似于对整个问题的求解;

3)如果子问题的规模仍然相当大而不可以对子问题方便的求解,那么可以对子问题再次应用分治法

可以解决的经典问题有如下几种:

1)传染病问题;

2)二分搜索以及快速搜索;

3)矩阵乘法;

4)汉诺塔问题;

 

3.动态规划

分治法是自上而下的,它把问题分解成一个个子问题,通过对子问题的求解而实现对原问题的求解,动态规划的思想与之相反,它是自底向上设计的,其思想方法是:避免对同样的问题进行两次求解。(重复计算正是递归算法的硬伤~):计算二项式系数的一个方法是可以使用牛顿-莱布尼茨公式,会要求计算C(m,n),根据公式C(m,n) = C(m-1, n)+C(m-1, n-1),可以采用分治法计算。另一种方法则是利用杨辉三角形,只需要根据已经存在的数值就可以构造出新的二项式系数,这就是动态规划的思想。动态规划法可以提高程序的运行的效率,但是它是以牺牲算法的复杂性为代价的,降低了算法的可读性。

利用动态规划思想解决的问题有如下特征:

1)算法要解决大量的重复性工作,计算大量的重复值;

2)至少有一些新的数值可以通过已经计算出的数值组合出来;

3)问题要有一定的规模,这样才可以显示出动态规划的优点;

4)使用分治法划分子问题的时候,子问题之间的关系界限不清,相互交叉,一个子问题的求解与多个已经解决的子问题有关。

可以解决的经典问题如下:

1)快速傅里叶算法;

2)多边形的最优分割;

3)找零钱问题;

4)最短路径问题;

5)背包问题;

6)链式矩阵惩乘法;

 

4.回溯法

回溯法是一种优化的穷举法。穷举法就是穷举问题的所有可能性直到发现问题的最优解,是一种高能耗的解法,需要大量的资源。回溯法可以有效降低穷举法的高能耗。其缺点就是效率低。

回溯法可以解决的问题有如下基本特征:

1)问题可以划分为几个不相关的子问题;

2)几个问题有着类似的求解方法;

3)如果子问题还可以划分,便继续对子问题进行划分。

由以上特点可以看出,回溯法可以解决的问题和分治法有相似之处,但两者并不相同。回溯法本质是深度优先搜索,需要栈保存路径,循环至问题得到解决或者栈空。

可以解决的经典问题:

1)迷宫问题;

2)四色问题;

3)骑士周游问题;

4)图的深度优先遍历

 

5.概率算法

与确定性算法相比,概率算法得到的结果是不精确的。但是这并不意味着概率算法就得不到正确的结果,有时候往往效率更高。

其实质是:算法对于同样的输入产生不同的结果,如果这个结果经检验是正确的,那么算法结束,否则算法放弃这个结果,重新计算一次。对于精确算法来说,输入正确的参数一定得到正确的结果,而对于概率算法来说,就可能得到错误的结果。

它还有一个有点:以此可以得到多个正确答案,而精确算法只能得到一个最优解。

经典的概率算法有如下两种:

1)Monte Carlo算法;

2)Las Vegas算法

可以解决的经典问题有如下集中:

1)Buffon的针;

2)验证矩阵算法;

3)素数性测试;

4)大整数分解因式;

posted @ 2012-08-07 15:07  大脚印  阅读(304)  评论(0编辑  收藏  举报