痛定思痛,开启算法之路(三)

    之前学的各种具体算法实现感觉实际没有太多的用到,或者说有了实际的问题而却联系不到自己当初学习过的解法,
    实际操作的少是很大一方面,在原有知识熟练学习、操作的基础之上,思路、思维得扩展是必可少的;
    这不仅仅是见多识广,更在于自己的思考及融汇(还是那句话:慢下来、静下来)

第四章 分治法

1.归并排序:利用递归,两两归并,逐步扩大合并,最后合为一个:
这里写图片描述
及快排、折半查找、二叉排序树,这些原理算法学习过程中接触较多,不再具体分析;

这里主要学习一下两个不同寻常的算法:大整数乘法和Strassen矩阵乘法:

1.大整数乘法:

两个大整数相乘,对每个大整数分治,分为前后两部分,拆开组合再合并,对于系数之间有其规律性;
这里写图片描述
这里写图片描述

2.Strassen矩阵乘法

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

此算法具体执行起来,也是非常的繁琐和复杂,其可行性其实并没有那么高,但是作为一种改进求精的方向和探索,还是非常值得学习扩展的;在这浮躁的世界,追求进步、锲而不舍、摸索前进的态度、精神和行动正是世人所缺乏的。

每人、每天推动世界进步一点点,最后汇集的变化将是革命性的,然而又有多少人会为了这一点点而默默无闻、锲而不舍的摸索前进!

之前用了蛮力法涉及到了两个问题:最近对问题和凸包问题,现在来学习一种更加复杂、渐进效率也更好的算法,其同样也是基于分治的思想:

1.最近对问题:

将n个点的集合,用一条垂线分为左右均等的两部分各含n/2个点,对于这两部分,分别求其各自集合的最近的两个点的距离d1,d2;取d=min(d1,d2),然后再根据这个距离d在垂线两侧附近比较是否两个集合之间的点有距离更小的两个点;
这里写图片描述

如图,垂线x=c分集合为左右两部分,左最小为d1,右最小为d2,取垂线两侧d距离;此处为什说对于p点,其对侧最多含有不超过6个点:因为d=min(d1,d2),所以d范围之内不可能再有多余的第三个点;

这里写图片描述

2.凸包问题(说实话,很经典!)

假设集合点按照x轴的升序排列,则连接x轴向最远的两个点为一条直线,分集合点与上下两部分(类似于快排的递归过程,每次分元素于左右大小两部分);(以上部分为例)找上部分距离此直线最远的点,连接此三个点构成三角形,基于三角形的边以新的线向其外侧扩散连接形成最后的凸包。
这里写图片描述
这里写图片描述

解决问题的思路、思想很重要,最后的数学解法同样不可或缺啊哈哈!

猜你喜欢

转载自blog.csdn.net/enjoy_endless/article/details/78964801
今日推荐