随机化算法

随机化算法允许在执行过程中随机地选择下一个计算步骤。在许多情况下,当算法在执行过程中面临一个选择时,随机化选择常比最优选择省事。因此随机化算法在很大程度上降低算法的复杂度。随机化算法的一个基本特征是对所求问题的同一实例用同一随机化算法求解两次可能得到完全不同的效果。不仅是结果,甚至是时间都有可能相差很大。一般情况下,将随机化算法大致分为四类:数值随机化算法、蒙特卡罗算法,拉斯维加斯算法、和舍伍德算法。


数值化随机算法常用于数值问题求解。这类算法得到的往往是近似解,且近似解的精度随着计算时间的增加而不断提高。在许多情况下,要计算出问题的精确解是不可能的或没有必要的,用数值化税基算法可得到相当满意的解。

数值类问题常用,多见于MATLAB , 各种积分微分,数学计算中。


蒙特卡罗算法用于求问题的准确解。对许多问题,近似解是毫无意义的。用蒙特卡罗算法能求得问题的一个解,但这个解未必是正确的。其求得正确解的概率依赖算法所用的时间。算法所用时间越多,得到正确解的概率就越高。蒙特卡罗算法的主要缺点也在于此。一般情况下,无法有效的判断所得到的解是否可定正确。(非一般情况是可以判定的!)

设p为实数,且1/2


拉斯维加斯算法不会得到不正确的解。一旦用拉斯维加斯算法找到一个解,这个解就一定是正确解。但有时用拉斯维加斯算法会找不到解。拉斯维加斯算法找到正确解的概率会随着它所用的计算时间的增加而提高。位于所求解问题的任一实例,用同一拉斯维加斯算法反复随该实例求解足够多次,可使解失效的概率任一小。

它可以显著地改进算法的有效性,甚至对某些迄今为止找不到有效算法的问题,也能得到满意的结果。n皇后问题利用此算法可以有效的解决,算法的思路是每次放置保证不跟已经放入的起冲突即可,直到无法放入或者皇后已经放完为止。



舍伍德算法总能求得问题的一个解,而且所得的解总是正确的。当一个确定性算法在最坏情况下的计算复杂性与其平均情况下的计算复杂性有较大差别时,可在这个确定性算法中引入随机性将它改造成一个舍伍德算法,消除或减少问题的好坏实例间的这种差别。舍伍德算法的精髓不是避免算法的最坏情形,而是设法消除这种最坏情形行为与特定实例之间的关联性。当出现这种情况时,在算法中增加随机性处理,只要随机性处理和当前确定性算法时间相比远低于它的时间复杂度数量级就可以。快速排序就是它的一个实例。舍伍德算法并不能改变算法的时间复杂度,但算法的时间复杂性相对均匀。

基于舍伍德算法的设计思想还可以设计高效的数据结构,跳跃表就是其中一例。具体跳跃表的实例可以从网上搜索。私下在阅读相关资料的时候,觉得跳跃表的实例应该可以在数据库的索引设计底层中出现,它是一种牺牲空间增加跳跃索引换取查询速度的,查询算法的效率可以参考快速排序,不过增加和删除的效率有点低。

Note:对有序的数据结构进行增加和删除的时候,效率低的查询速度会快一些,效率高的查询速度会慢一些。总之就是对同一个数据结构的增删效率和查询效率是呈现反比的,仅从我看到的算法来说。



你可能感兴趣的:(计算机算法与分析)