Outline

分治思想和递归表达式

大整数乘法

矩阵乘法的Strassen算法

快速傅里叶变化

基于分治的排序

merge-sort排序

快速排序

排序的下界问题

中位数和顺序统计量

最邻近点对

凸包

Notes

## 分治思想和递归表达式

【分治思想】算法

将一个问题分解为与原问题类似但规模更小的若干子问题,递归地解这些子问题,而后将这些子问题的解结合起来构成原问题的解。这种方法在每层递归上均包括三个步骤:编程

divide(分解):将问题划分为若干个子问题

conquer(求解):递归地解这些子问题;若子问题Size足够小,则直接解决之

Combine(组合):将子问题的解组合成原问题的解

【分治递归表达式】数组

设T(n)是Size为n的执行时间,若Size足够小,如n ≤ C (常数),则直接求解的时间为θ(1)

①设完成划分的时间为D(n)

②设分解时,划分为a个子问题,每一个子问题为原问题的1/b,则解各子问题的时间为aT(n/b)

③设组合时间C(n)

则有递归方程总结为:

T(n)=θ(1) if n

T(n)=aT(n/b)+D(n)+C(n) if n≥c

技术细节(注意):

在声明、求解递归式时,经常忽略向上取整、向下取整、边界条件

边界条件可忽略,这些细节通常只影响常数因子的大小,不改变量级。求解时,先忽略细节,而后再决定其是否重要!

## 大整数乘法

*********优化划分阶段,下降T(n)=aT(n/b) + f(n) 中的 a*********ide

这里咱们假设有两个大整数X、Y,分别设X=123四、Y=5678。如今要求X*Y的乘积,小学的算法就是把X与Y中的每一项去乘,可是这样的乘法所需的时间复杂度为O(n^2),效率低下,咱们能够尝试使用分治来解决。函数

XY = (A2n/2 + B)(C2n/2 + D)优化

= AC2n + (AD+BC)2n/2 + BDui

= AC2n + ((A-B)(D-C)+AC+BD)2n/2 + BDidea

算法分析:

首先将X和Y分红A,B,C,D

此时将X和Y的乘积转化为上述式子,把问题转化为求解式子的值

此时递归式为 T(n)=4T(n/2)+θ(n)

算法复杂度T(n)=θ(n2)

继续优化: AD+BC=(B-A)(C-D)+AC+BD

算法过程:

划分产生A,B,C,D;

计算 B-A 和 C-D;

计算 n/2 位乘法 AC、BD、(B-A)(C-D);

计算 (B-A)(C-D) + AC + BD;

AC左移n位,((B-A)(C-D) + AC + BD) 左移n/2位;

计算XY

递推式:

T(n)=θ(1)                   if n=1

T(n)=3T(n/2)+O(n)          if n>1

算法复杂度:          T(n)=O(nlog3) =O(n1.59)

## 矩阵乘法的Strassen算法

【矩阵相乘的朴素算法 T(n) = Θ(n3)】spa

朴素矩阵相乘算法,思想明了,编程实现简单。时间复杂度是Θ(n^3)。伪码以下3d

1 for i ← 1to n2 do for j ← 1to n3 do c[i][j] ← 0

4 for k ← 1to n5 do c[i][j] ← c[i][j] + a[i][k]⋅ b[k][j]

【矩阵相乘的strassen算法 T(n)=Θ(nlog7) =Θ (n2.81)】

通常算法须要八次乘法,四次加法;算法效率是Θ(n^3);

鉴于上面的分治法方案没法有效提升算法的效率,要想提升算法效率,由主定理方法可知必须想办法将2中递归式中的系数8减小。Strassen提出了一种将系数减小到7的分治法方案,以下图所示。

咱们能够看到上面只有7次乘法和屡次加减法,最终达到下降复杂度为O( nlg7 ) ~= O( n2.81 );

SQUARE-MATRIX-MULTIPLY-RECURSIVE(A,B)

n=A.rows

let C be anew n*n matrixif n==1c11=a11*b11else partition A, B and C as in equation(1)

C11=SQUARE-MATRIX-MULTIPLY-RECURSIVE(A11,B11) + SQUARE-MATRIX-MULTIPLY-RECURSIVE(A12,B21)

C22=SQUARE-MATRIX-MULTIPLY-RECURSIVE(A11,B12) + SQUARE-MATRIX-MULTIPLY-RECURSIVE(A12,B22)

C21=SQUARE-MATRIX-MULTIPLY-RECURSIVE(A21,B11) + SQUARE-MATRIX-MULTIPLY-RECURSIVE(A22,B21)

C22=SQUARE-MATRIX-MULTIPLY-RECURSIVE(A21,B22) + SQUARE-MATRIX-MULTIPLY-RECURSIVE(A22,B22)return C

## 快速傅里叶变换(FFT)

问题定义:

算法思想:

伪代码:

递归方程:

算法复杂度:   T(n) = θ(n logn)

## 基于分治的排序

【归并排序】

归并排序是分治思想的典型应用,

划分策略:根据中间点将数组集合划分红两部分,不断递归

合并策略:比较a[i]和b[j]的大小,若a[i]≤b[j],则将第一个有序表中的元素a[i]复制到r[k]中,并令i和k分别加上1;不然将第二个有序表中的元素b[j]复制到r[k]中,并令j和k分别加上1,如此循环下去,直到其中一个有序表取完,而后再将另外一个有序表中剩余的元素复制到r中从下标k到下标t的单元。

MergeSort(A,i,j)

Input: A[i,…,j]

Output:排序后的A[i,…,j]1. k ← (i+j)/2;2. MergeSort(A,i,k);3. MergeSort(A,k+1,j);4. l←i; h ← k+1; t=i; //设置指针

5. While l≤k & h

9. For v ←l To k Do10. B[t] ← A[v]; t ← t+1;11. IF h

12. For v ←h To j Do13. B[t] ← A[v]; t ← t+1;14. For v ← i To j Do //将归并后的数据复制到A中

15. A[v] ← B[v];

复杂度分析: T(n)=2T(n/2)+O(n)  T(n)=O(nlogn)

复习:归并排序具备以下特色:

归并排序的时间复杂度为O(nlogn),这是基于比较的排序算法所能达到的最高境界;

归并排序是一种稳定的算法,这一点在某些场景下相当重要;

归并排序是最经常使用的外部排序方法(当待排序的记录放在外存上,内存装不下所有数据时,归并排序仍然适用,固然归并排序一样适用于内部排序...);

但其也须要O(n)的辅助空间,而与之效率相同的快排和堆排分别须要O(logn)和O(1)的辅助空间,在同类算法中归并排序的空间复杂度略高

【快速排序】

划分策略:选取一个记录做为枢轴,通过一趟排序,将整段序列分为两个部分,其中一部分的值都小于枢轴,另外一部分都大于枢轴。

递归策略:而后继续对这两部分继续进行排序,从而使整个序列达到有序。

合并策略:无操做

QuickSort(A,i,j)

Input: A[i,…,j], x

Output: 排序后的A[i,…,j]1. temp←rand(i,j); //产生i,j之间的随机数

2. x ← A[temp]; //以肯定的策略选择x

3. k=partition(A,i,j,x); //用x完成划分

4. QuickSort(A,i,k); //递归求解子问题

5. QuickSort(A,k+1,j);

Partition(A,i,j,x)

1. low←i ; high ←j;

2. While( low< high ) Do

3.     swap(A[low], A[high]);

4. While( A[low] < x ) Do

5.     low←low+1;

6. While( A[low] < x ) Do

7.     high←high-1;

8. return(high)

平均、最优的时间复杂度为O(nlogn),最差的时间复杂度为O(n^2)

平均的空间复杂度为O(logn),最差的空间复杂度为O(n)

排序的下界是:Ω(n log n)

## 中位数和顺序统计量

【最大值最小值】

算法MaxMin(A)

输入: 数组A[i,…,j]

输出:数组A[i,…,j]中的max和min1. If j-i+1 =1Then 输出A[i],A[i],算法结束2. If j-i+1 =2Then3. If A[i]

5. m1,M1 ←MaxMin(A[i:k]);6. m2,M2 ←MaxMin(A[k+1:j]);7. m ←min(m1,m2);8. M ←max(M1,M2);9. 输出m,M

时间复杂度分析:T(n) = 3n/2 - 2

因此时间复杂度为:O( ⌊3n/2⌋ )

【中位数的线性时间选择算法】

这种算法在最坏的状况下的时间复杂度为O(n),其具体过程以下:

将输入数组划分为n/5组,每组有5个元素,且剩下的至多有一组的元素小于5个。

寻找这n/5个组中每一个组的中位数,能够将每组作一次排序,而后选取每组的第三个元素。

对于第2部找出的n/5个中位数递归的调用Select函数求出其中位数x.(约定偶数个中位数为其较小的中位数)

按照找到的中位数x将数组划分为两个部分,求得小于或者等于x的元素有q个

若是k==q则返回x,若k

Input: 数组A[1:n], 1≤i≤n

Output: A[1:n]中的第i-大的数1. for j←1 to n/5

2. InsertSort(A[(j-1)*5+1 : (j-1)*5+5]);3. swap(A[j], A[[(j-1)*5+3]);4. x ←Select(A[1: n/5], n/10);5. k ←partition(A[1:n], x);6. if k=i then returnx;7. else if k>i then retrun Select(A[1:k-1],i);8. else retrun Select(A[k+1:n],i-k);

递归方程式:T(n) ≤ T( ⌈n/5⌉ ) +T(7n/10+6) + O(n)

时间复杂度:T(n) = O(n)

## 最邻近点对

输入:Euclidean空间上的n个点的集合Q

输出:P1, P2∈Q,    Dis(P1, P2)=Min{Dis(X, Y) | X, Y∈Q}

算法过程:

若是Q中仅包含一个点,则算法结束;

把Q中点分别按x-坐标值和y-坐标值排序.

划分:

计算Q中各点x-坐标的中位数m;

用垂线 L:x=m 把Q划分红两个大小相等的子集合QL 和QR, QL中点在L左边, QR 中点在L右边.

求解:

递归地在QL、QR中找出最接近点对:(p1, p2)∈QL , (q1, q2)∈QR

d=min{Dis(p1, p2), Dis(q1, q2)};

合并:

在临界区查找距离小于d的点对(pl, qr), pl∈QL,qr∈QR;

若是找到,则(pl, qr)是Q中最接近点对,不然(p1, p2)和(q1, q2) 中距离最小者为Q中最接近点对

时间复杂度:

Divide阶段须要O(n)时间

Conquer阶段须要2T(n/2)时间

Merge阶段须要O(n)时间

递归方程

T(n)= O(1)                 n = 2

T(n) = 2T(n/2) + O(n)      n ≥ 3

用Master定理求解T(n)

T(n) = O(nlogn)

## 凸包

C语言分治算法求中位数,【算法复习】分治算法相关推荐

  1. 【老生谈算法】matlab实现Kruskal避圈算法求最小生成树——Kruskal避圈算法

    基于MATLAB的Kruskal避圈算法求最小生成树 1.原文下载: 本算法原文如下,有需要的朋友可以点击进行下载 序号 原文(点击下载) 本项目原文 [老生谈算法]基于MATLAB的Kruskal避 ...

  2. c语言 秦九韶算法,高二数学期末复习秦九韶算法与排序的知识点

    高二数学期末复习秦九韶算法与排序的知识点 f(x)=anxn+an-1xn-1+.+a1x+a0求值问题 f(x)=anxn+an-1xn-1+.+a1x+a0=( anxn-1+an-1xn-2+. ...

  3. 算法提高课-图论-有向图的强连通分量-AcWing 1174. 受欢迎的牛:tarjan算法求强连通分量、tarjan算法板子、强连通图

    文章目录 题目解答 题目来源 题目解答 来源:acwing 分析: 强连通图:给定一张有向图.若对于图中任意两个结点x,y,既存在从x到y的路径,也存在从y到x的路径,则称该有向图是"强连通 ...

  4. matlab 凸包质心算法,求多边形凸包(线性算法)--陈氏凸包算法--Computing the convex hull of a simple polygon(源码)...

    陈氏凸包算法-算法参考:Computing the convex hull of a simple polygon 作者:Chern-Lin Chen 陈氏算法提供了一个线性效率求凸包的算法,本文使用 ...

  5. c语言分治法求众数重数_分治算法:求众数及其重数

    问题描述: 给定含有 n 个元素的多重集合 S,每个元素在 S 中出现的次数称为该元素的重数.多重集合 S 中重数最大的素称为众数.例如多重集合 S={1,2,2,7,2,7,5},其中众数是 2,其 ...

  6. 语言非递归求解树的高度_算法素颜(11):无死角“盘”它!二分查找树

    引言 <菜鸟也能"种"好二叉树!>一文中提到了:为了方便查找,需要进行分层分类整理.而满足这种目标的数据结构之一就是树. 树的叶子节点可以看作是最终要搜寻的目标物:叶子 ...

  7. c语言减治法求a的n次方算法,拜托,面试别再问我斐波那契数列了!!!

    面试中,问得比较多的几个问题之一,求斐波那契数列f(n)? 画外音:姐妹篇 <拜托,面试别再问我TopK了!!!> <拜托,面试别再让我数1了!!!> 什么是斐波那契数列? 斐 ...

  8. c语言bellman算法,求 最短路径中BELLMAN FORD算法实现的C程序

    匿名用户 1级 2010-06-01 回答 //这个是邻接表 typedef struct oo { int len,num; struct oo *next; } link; typedef str ...

  9. prim算法求最小生成树_克鲁斯卡尔算法(Kruskal算法)求最小生成树

    上一节介绍了求最小生成树之普里姆算法.该算法从顶点的角度为出发点,时间复杂度为O(n2),更适合与解决边的绸密度更高的连通网.本节所介绍的克鲁斯卡尔算法,从边的角度求网的最小生成树,时间复杂度为O(e ...

最新文章

  1. Spring MVC 相关资料整理
  2. vb listview 修改
  3. Java 利用接口实现回调
  4. 路径搜索算法 python实现_A*算法在栅格地图上的路径搜索(python实现)
  5. HD_2553N皇后问题
  6. pl sql 连接mysql_PL/SQL 连接mysql步骤
  7. CVPR 2020 |商汤提出应对尺度变化的目标检测新算法
  8. Oracle 有long类型字段的表 使用insert into select 语句 ,出现:ORA-00997 错误
  9. JS流程控制语句 重复重复(for循环)语句结构: for(初始化变量;循环条件;循环迭代) { 循环语句 }...
  10. 01.linux内核源码结构
  11. win10系统设置护眼色 word2016页面显示失败
  12. STM32F103ZET6驱动TM7705(AD7705)代码加心得
  13. CTO能力知识地图正式发布
  14. k3服务器系统资源不足,金蝶k3云服务器已离线
  15. 2021届西农计算机复试工作方案(学院)
  16. 女人爱与不爱你的表现
  17. C++模拟扑克过五关
  18. c++ 两个Map容器的差异性比较,返回差异内容
  19. 百度seo快排点击系统源码[易语言]拨号模拟点击(仅供学习使用!)
  20. 我爱Flask框架之Flask简介与URL和视图介绍

热门文章

  1. [elixir! #0023] 引擎盖下, `IO.puts` 如何运作
  2. JMS(三):MessageListener
  3. asp.net文本编辑器FCKeditor使用方法详解 - 橙色大地 - 博客园
  4. Dynamics CRM 2013 installation
  5. bzoj 5093 [Lydsy1711月赛]图的价值——第二类斯特林数
  6. js分享微信 ,微博 ,qq空间
  7. 计算机编程之高级语言
  8. linux安装 lr agent
  9. 通过伙伴系统申请内核内存的函数有哪些?
  10. 【摘录】Android画图之抗锯齿