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

    一隔不觉好几天过去了,有忙的时候、有懒得时候也有很多生活上的因素,总是有那么多不可控因素。

    有些算法我理解的也不是十分明确(虽然遇到书上读不明白的地方,也阅读了一些博客及解析,总结的时候尽量做到言简意赅吧),新知识还需反复研究学习才可啊;

    欢迎大家相互讨论学习、相得益彰。

    抛开杂念、坚定步伐、继续前进!

第五章 减治法

一个问题给定实例的解和同样问题较小实例的解之间的关系。其3种情况:
1.每次减去一个常量f(n)与f(n-1)的关系
2.每次减去一个常数因子(如:a的n次方为a的n/2次方的平方)
3.每次减去的规模是可变的(如最开始讨论的求最小公约数的那个算法,辗转相除,除数、被除数与余数之间的相互代换,不断缩小规模,但是缩小的规模每次都可能是不一样的)

实例应用:

1.减常量

直接插入排序、图的深度优先遍历DFS(访问当前节点未访问过的邻接点、做标记、邻接点替换当前节点逐步深入、回退、递归、栈;检查图的连通性和无环性、关节点)、图的广度优先遍历BFS(一次性依次访问当前节点未访问过的节点、做标记、入队列、同心圆一层层扩展、迭代;连通性、无环性、两点间最短路径)、拓扑排序(两种实现方式:DFS、减治(每次去一个没有入边的点及其所连接的所有边,源删除))、生成排列、背包问题

2.减常因子

折半查找、用平方求幂、假币问题(每次平分于天平两侧,按重量和偏向再次平分)、俄式乘法(n*m=(n/2)*2m,折半和加倍可以使用移位实现,速度更快)、约瑟夫环问题(n个编号,每次消去第二个元素,最后只留下一个;分n为奇偶两种情况,偶:每次规模减半,原编号为新编号的2倍减1:J(2k)=2J(k)-1; 奇:原编号为新编号2倍加1:J(2k+1)=2J(k)+1;对于这两个递推式的闭合式有两种方法:归纳法、向左循环移1位法(J(6)=J(110)—101=5;J(7)=J(111)—111=7),得出的5和7即为最后仅存的一个)

3.减可变规模

1)求第k个最小元素(用快排计算中值(位置s),与中值比较到左右两部分去找;在左为第k个,在右第k-s个;递归直到s=k)
这里写图片描述
这里写图片描述

2)插值查找:不同于折半查找总是把查找键值与给定数组的中间元素进行比较,插值查找为了找到用来和查找键进行比较的数组元素,考虑了查找键的值(取数组元素与查找键进行比较)
假设数组键值是按线性递增的,具有线性关系,根据数组两端的值定一条直线,取直线上点的值然后与查找键值比较,按比较结果大小取左右两端(同折半)继续按上线性关系取值比较(缩小可变规模);
(对于较小文件折半查找可能更好一些;对于大文件、访问成本大开销大的文件适合插入查找)
这里写图片描述

第六章 变治法

1)实例化简:变换为同样问题的一个更简单或者更方便的实例;
2)改变表现:变换为同样实例的不同表现;
3)问题化简:变换为另一个问题的实例,这种问题的算法是已知的;
这里写图片描述
6.1 预排序

例一:检查数组中元素的唯一性:若用蛮力法解决的话其时间复杂性是平方级别的;而选择一个好的排序方法使其排序时间复杂度为nlogn,在加上比较相邻元素是否相等n,其总体复杂度依然为nlogn;

例二:模式计算:求数字列表中出现频率最高的元素值;蛮力法:挨个比较并记录频率复杂度为平方;若先排序在比较相邻元素个数则其复杂度依然只取决于排序算法的复杂度;
这里写图片描述
6.2斯高消去法:求n个线性方程构成的n元联立方程组,并将其变换为一个等价方程组(系数矩阵化成为上三角形)

这里写图片描述

两个算法:

这里写图片描述
这里写图片描述
注意第二个算法的2个优化之处:1)部分选主元法:
这里写图片描述
2)最内层循环的优化:除法的值无需每次都需要计算一遍

其时间复杂度:
这里写图片描述

6.2.1 LU分解及其他应用

对于高斯消去法,每变换一次b,则必须每次从原矩阵开始、从头到尾再次变换求得b’,而对于LU分解求解x,不论b如何变幻,只需求得一次L、U,即可连续套用求得不同b的x;lu分解具体过程如下:
这里写图片描述
U为原矩阵A经行变换得到的上三角矩阵,L为A行变换过程组成的矩阵的逆;

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

6.3/4 AVL(包括旋转)、红黑树、B树、堆(概念、构造、排序)等等基本数据结构,就不逐一介绍了;

猜你喜欢

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