【算法】Notes for Chapter 4

  • 减治法Decrease-and-Conquer的三种主要变化形式:①减去一个常量;②减去一个常量因子;③减去的规模是可变的。
  • 减常量Decrease-by-a-Constant变化形式中,算法的每次迭代总是从实例中减去一个相同的常量,一般来说该常量是1.
    在这里插入图片描述
  • 减常因子Decrease-by-a-Constant-Factor变化形式意味着在每一次的算法迭代中,总是从实例的规模中,减去一个常数倍的部分,在大多数应用中,该常数是 1 / 2 1/2 1/2,例如二分查找法。
    在这里插入图片描述
  • 减可变规模Variable-Size-Decrease变化形式中,算法每次迭代时实例规模减小的模式都是不同的,计算最大公约数时的欧几里得算法就是一个很好的例子, g c d ( m , n ) = g c d ( n , gcd(m,n)=gcd(n, gcd(m,n)=gcd(n,m m o d mod mod n ) n) n),虽然等号右边的参数总是会小于左边的参数,但规模减小的方式是可变的。
  • 插入排序在这里插入图片描述
  • 插入排序对于基本有序的数组有非常优异的性能,D.L.Shell在此基础上扩展出了希尔排序ShellSort
  • 拓扑排序应用的图必须是一个有向无环图(Directed Acyclic Graph),简称为DAG图,主要使用的算法有两种,都是构造性的算法,它们既可以验证给定的图G是否为一个DAG图,又可以在答案肯定时输出一个拓扑排序的序列(暗示拓扑排序不唯一)。
  • 拓扑排序算法一】对给定的图G执行一次DFS遍历,记录下顶点变为"死点",也就是其所有的邻接顶点都被访问过时的序列 L L L,将 L L L逆序输出,即为一个拓扑排序的解。
    在这里插入图片描述
  • 拓扑排序算法二】基于减一治技术,在图G(以及后续更新过的图G)中求出源Source。源的定义是入度为0的顶点,也就是没有边终止于它,然后将源和所有从源起始的边全部删除,重复该步骤(多个源可以任意选择)直至图中没有源。如果图G中无顶点剩余,那么顶点的删除次序就是拓扑排序的一个解;否则说明图G不是一个DAG图,当中存在环。
    在这里插入图片描述
  • 拓扑排序的应用
    在这里插入图片描述
  • 排列生成一】对于n个数,要得到它们的不同排列,并且希望满足最小变化要求,即交换前一排列(如果存在的话)中的两个元素就能够得到下一个排列,使用Johnson-Trotter算法
    在这里插入图片描述
    在这里插入图片描述
  • 排列生成二】依旧要得到n个数的排列,但希望满足字典序,即将数字理解成字母之后,在字典中那样的顺序。
    在这里插入图片描述
    想法是对于排列 a 1 a 2 . . . a n − 1 a n a_1a_2...a_{n-1}a_n a1a2...an1an,如果 a n − 1 < a n a_{n-1}<a_n an1<an,那么交换二者位置即可;反之需要找到该序列的最长递减子序列 a i + 1 > a i + 2 > . . . > a n − 1 > a n a_{i+1}>a_{i+2}>...>a_{n-1}>a_n ai+1>ai+2>...>an1>an,注意此时 a i < a i + 1 a_i<a_{i+1} ai<ai+1,然后将 a i a_i ai与递减子序列中大于它的最小元素互换,最后将新的递减子序列逆序,得到一个升序序列。举例362541按照字典序,其后继排列为364125,这一算法的历史可以追溯到14世纪的印度。
    在这里插入图片描述
    在这里插入图片描述
  • 生成子集】n个元素的集合 A = a 1 , a 2 , . . , a n A={a_1,a_2,..,a_n} A=a1,a2,..,an的所有 2 n 2^n 2n个子集和长度为n的所有 2 n 2^n 2n个位串之间是一一对应的,如果 a i a_i ai属于该子集,那么就令 b i = 1 b_i=1 bi=1;否则 b i = 0 b_i=0 bi=0,现在希望得到一个满足最小变化要求的位串生成算法。二进制反射格雷码就能够满足这样的需求,Frank Gray作为 A T AT AT& T T T实验室的研究员,为了降低传送数字信号时的误差影响,于20世纪40年代重建了格雷码。
    在这里插入图片描述
  • 折半查找
    在这里插入图片描述
    在这里插入图片描述
    折半查找的平均键值比较次数为 l o g 2 n log_2^n log2n.
  • 俄式乘法】两个正整数相乘的非主流算法,利用如下的等式:
    在这里插入图片描述
    在这里插入图片描述
  • 选择问题Selection Problem】对于拥有n个元素的列表,求取其中第k小的元素,该元素被称为第k个顺序统计量。当k=n/2时,该元素被称为中值。想要求取中值,对于整个数组进行排序后获取是不必要的,我们采用划分Partioning的思路,将列表根据某个枢轴量pivot进行重新整理,使得左边的元素都是小于等于pivot的,紧接着是pivot本身,再接着是大于等于pivot的元素。
  • Lomuto划分
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    快速选择算法在最坏情况下的时间效率是平方级的,但其平均情况下的时间效率是线性的,并且计算机科学家发现了一种更加复杂的算法,它在最坏情况下的时间效率也是线性的。
  • 插值查找】这一算法在查找过程中,考虑了查找键的值。如果在某一次迭代中处理的是数组两个端点值 A [ l ] A[l] A[l] A [ r ] A[r] A[r]之间的一部分,插值查找假设数组的值是线性递增的,也就是由 ( l , A [ l ] ) 、 ( r , A [ r ] ) (l,A[l])、(r,A[r]) (l,A[l])(r,A[r])两个点确定的这条直线,那么将要被访问以进行比较的下一个元素是这样确定的:
    在这里插入图片描述
    该点在直线上,并且其纵坐标等于查找键的值,由此来确定其在数组中的下标:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 拈游戏Nim Game
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44246009/article/details/108246791
今日推荐