目录

非递归形式算法分析:

递归形式算法分析:

【例2-9】交换a和b的值。

非递归

【例2-10】求n!

非递归:

思考题:韩信点兵

【例2-11】对于任意给定的n阶方阵A和B,求A×B的积C并且 分析它算法执行效率。

问题分析:

计算模型:

非递归:

【例2-13】汉诺塔(Tower of Hanoi)问题。

问题分析:

计算规模:​

【例2-14】试分析二路归并排序算法的时间复杂度。



非递归形式算法分析:

 决定用哪些参数表示输入规模;
找出算法的核心操作,它通常位于算法的最内层循环中;
检查核心操作的执行次数是否只依赖于输入规模。如果 它还依赖于一些其他的特性,则可能需要对最差效率、 平均效率以及最优效率分别研究;
以式(2-1)的思想为核心,建立一个算法基本操作执行次 数的求和表达式;
利用求和运算标准公式和法则来建立一个操作次数的闭合公式,或者至少确定它的增长
次数。

递归形式算法分析:

决定用哪些参数作为输入规模的度量标准;
找出算法的核心操作,它通常是递推公式;
检查一下,对于相同规模的不同输入,核心操作的执行次数是否可能不同。如果有这种可能,则必须对最差效率、平均效率以及最优效率做单独研究;
对于算法核心操作的执行次数,建立一个递推关系以及相应的边界条件;
解这个递推式,或者至少确定它的解的增长次数。

谨慎使用递归算法,因 为它们的简洁可能会掩 盖其低效率的事实。

【例2-9】交换ab的值。

非递归

算法设计与描述 算法分析
输入:a,b (1)输入a,b两个数,规模为2
输出:a,b

swap(a,b)

{
        Temp <- a;

a <- b;

b <- Temp;

output(a,b);

}

(2)核心操作为3条交换语句;

(3)核心操作执行的次数是一个与输入规模无关的常数

(4)算法的时间复杂度为常数阶 T(n)= O(1)   //O渐近上界 0 ≤ f(n)  ≤ c*g (n )

【例2-10】求n!

非递归:

算法设计与描述 算法分析
输入:n (1)输入n,规模为n ,控制迭代次数。
输出:n !

F (n)

{
        s <- 1;

for i <- 1 to n do

s=s*i ;

output(s);

}

(2)核心操作为 s=s*i ; 一次乘法运算

(3)核心操作执行的次数,只受输入规模n控制

(4)依据定理2.5 算法的时间复杂度为常数阶 T(n)= ∑(n,i=1) 1 = Θ(n) //渐近紧界

递归:
计算模型:
算法设计与描述 算法分析
输入:n (1)输入n,规模为n ,计算规模也是n
输出:n !

F (n)

{
        if(n==0) return 1;

else return n*F(n-1);

}

(2)核心操作为 n*F(n-1) ; 一次乘法运算

(3)根据递推公式,每递推一次,执行一次乘法操作,因此有以下推导过程:
T(n) =1+T(n-1) =1+1+T(n-2)……=1+1+…+1+T(1)=1+1+…+1=n=Θ(n)

(4) //渐近紧界

思考题:韩信点兵

#include<iostream>
using namespace std;
int main()
{int n=1;while( (n%3!=2)||(n%5!=3)||(n%7!=2)){n++;}cout<<n;//23return 0;} 

优化:

//a,b,c中,c的大小对该结果影响最大,因此从c入手可以稍微提高运算效率。
void hanxin01()
{int n=9;//7+2int i=0; while(true){if(n%3==2&&n%5==3)break;i++;n+=7;}cout<<"次数:"<<i<<"结果"<<n<<endl;
} 

【例2-11】对于任意给定的n阶方阵AB,求A×B的积C并且 分析它算法执行效率。

问题分析:

C也是n阶方阵,每个元素 = 矩阵A的行 和矩阵B的列 的点积 。

对于 i>=0 , j<= n-1 的每一对下标 ,有 C[i,j] = A[i,0]B[0,j] +... + [i,k]B[k,j] + .... + A[i,n-1]B[n-1,j]

计算模型:

设 i , j, k ∈[0, n-1],矩阵运算中将反复执行下述计算公式:

非递归:

算法设计与描述 算法分析
输入:A,B  (1)输入A,B,规模为n x n 
输出:C=Ax B

MatrixMultiplication  (A[n] ,B[n] )

{

for i <- 0 to n-1 do

for j <- 0 to n-1 do

{

C[i,j] <- 0.0 ;

for k <- 0 to n-1 do

C[i,j] = C[i,j] + A[i,k]*B[k,j];

}

return C;

}

(2)核心操作 通过加法和乘法运算 求C[i,j]

(3)核心操作执行的次数,只受输入规模n控制 ∑(n-1 , k=0) 1

(4)依据定理2.5 算法的时间复杂度为常数阶 T(n)=  Θ(n^3 ) //渐近紧界

【例2-13汉诺塔(Tower of Hanoi)问题。

如图2-2所示,有n个 大小不同的盘子和3根木桩。开始时,所有盘子都套在第A根 木桩上,最大的盘子在底部,最小的盘子在顶部。现在要借 助第B根木桩把所有盘子都移动到第C根木桩上,但是移动时, 必须保证大盘子在下面,小盘子在上面。

问题分析:

把n 个盘子从木桩A移到木桩C,三个步骤:
1)把n-1个盘子从木桩A移到木桩B,借助于木桩C;
2)把一个盘子从木桩A移到木桩C
3)把n-1个盘子从木桩B移到木桩C,借助木桩A

计算规模:

递归:

算法设计与描述 算法分析
输入:n (1)输入n,计算规模是n
输出:显示

Hanoi (A,C,n)

{
        if(n==1) move(A,C,1);//移动展示

else

{

Hanio(A,B,n-1);//n-1个盘子,从A移到B,借助另一个

move(A,C); // 从A移动到C

Hanoi(B,C,n-1); //

}

}

(2)核心操作为 移动盘子

(3)根据递推公式,。。。【不全】

【例2-14试分析二路归并排序算法的时间复杂度。

问题分析:

二路归并排序的思想是:将待排序 的数列分成相等的两个子数列(数量 相差±1),然后,再使用同样的算 法对两个子序列分别进行排序,最 后将两个排好的子序列归并成一个 有序序列。
代码:
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
//二路归并
int a[100];
int n=10;
void merge(int a[],int low,int mid,int high)
{int sum1=mid-low+1;//元素个数 int sum2=high-mid;int b[100]={0};int c[100]={0};for(int i=0;i<sum1;i++){b[i]=a[i+low];} for(int i=0;i<sum2;i++){c[i]=a[i+mid+1];}//int i=0,j=0;int k=low;while(i<sum1&&j<sum2){//先从数组中找出较小的值if(b[i]<=c[j]){a[k]=b[i];i++;} else{a[k]=c[j];j++;}k++; }//如果有剩余if(i>sum1)//c有剩余 {for(;j<sum2;j++,k++){a[k]=c[j];}} else{for(;i<sum1;i++,k++){a[k]=b[i];}}
}
void mergesort(int a[],int low,int high)
{int mid;if(low<high){mid=(low+high)/2;mergesort(a,low,mid);mergesort(a,mid+1,high);merge(a,low,mid,high);}
}
void init(int a[])
{srand(time(0));for(int i=0;i<n;i++){a[i]=rand()%100;}
}
void show()
{for(int i=0;i<n;i++){cout<<a[i]<<"\t";}cout<<endl;
}
int main()
{init(a);show();mergesort(a,0,n-1);show();return 0;
}
算法设计与描述 MergeSort( A,p,r ) 算法分析【换元迭代】
输入:n个数的无序序列A[p,r] , 1<= p <= r <= n , (1)输入n,计算规模是n
输出:n个数的有序序列A[p,r]

MergeSort (A,p,r)

{
        if( p<r )

{

q <- (p+r)/2 ;//中间

MergeSort (A,p,q); //左侧

MergeSort(A,q+1,r) ;//右侧

Merge (A,p,q,r);

}

}

(2)核心操作为 移动盘子

(3)

(4)

换元

代码代码

Merge

算法设计与描述 Merge( A,p,q,r ) 算法分析
输入:n按递增顺序排好的 A[p...q] 和 A[q+1...r ] (1)输入n,计算规模是n
输出:按照递增顺序排序的A[p,r]

Merge (A,p,q,r)

{

x <- q-p+1 ,y <- r-q;//x,y分别是两个子数组的元素数

A[p...q] -> B[1...x] , A[q+1...r] -> C[1...y] //两个新数组

i <- 1 ,j<- 1 ,k <- p

while i<=x and j <= y do

{

if ( B[i] <= C[ j ] ) //注意是i 和 j

{

A[k] <- B[i];//较小数

i <- i+1;

}

else

{

A[k] <- C[j] ;

j <- j+1;

}

k=k+1;

}

if(i>x)        C[j...y] -> A[k..r] //如果还要剩余的元素,就不需要比较,直接赋值回去就行

else         B[i..x] -> A[k...r]

}

(2)核心操作为 移动盘子

(3)根据递推公式,。。。【不全】

【算法设计zxd】第2章 算法分析实例 递归非递归——交换,n阶乘,矩阵乘法,汉诺塔,二路归并,相关推荐

  1. 【算法设计zxd】第一章 算法基础 1.基本概念+最大公约数

    目录 一.基本概念: 例1-1:求最大公约数 问题分析: 计算模型: 1) 穷举法 2) 欧几里德算法(辗转相除法) 算法设计与描述: 算法分析-效率: 1) 穷举法: 2) 欧几里德算法分析-渐近法 ...

  2. 【算法设计zxd】第一章 算法基础 4.设计工具【三角矩阵,】

    目录 1. 循环设计 (1) 设计思维 自底向上的设计(Down - Top Design) 自顶向下的设计(Top-Down Design) (2)挖掘内在规律构建计算模型 [例1-3]设计算法,输 ...

  3. 【算法设计zxd】第一章 算法基础 5.基本数据结构

    目录 思考题:学过的数据结构及其特点 (1)线性数据结构 (2) 树 (2) 树-二叉树 (3) 图 (3) 图-表示方法.邻接矩阵法 (3) 图-表示方法.邻接表 思考题:学过的数据结构及其特点 线 ...

  4. 多柱汉诺塔最优算法设计探究

    多柱汉诺塔最优算法设计探究   引言 汉诺塔算法一直是算法设计科目的最具代表性的研究问题,本文关注于如何设计多柱汉诺塔最优算法的探究.最简单的汉诺塔是三个柱子(A.B.C),因此多柱汉诺塔的柱子个数M ...

  5. 算法分析:傻瓜式理解汉诺塔递归问题

    算法分析:傻瓜式理解汉诺塔递归问题 一.汉诺塔问题规则 设a.b.c是三个塔座, 开始时,a上有n个圆盘自下而上,从大到小地叠放在一起. 现要求将a上的圆盘移到b上,仍按相同顺序叠放 规则1:每次只能 ...

  6. C++Tower of Hanoi汉诺塔的实现算法(附完整源码)

    C++Tower of Hanoi汉诺塔的实现算法 C++Tower of Hanoi汉诺塔的实现算法完整源码(定义,实现,main函数测试) C++Tower of Hanoi汉诺塔的实现算法完整源 ...

  7. 汉诺塔python代码解释_python实现汉诺塔算法

    题目: 汉诺塔给出最优解,如果对汉诺塔的定义有不了解,请翻看数据结构教材. 除了最基本的之外,还有一题,给定一个数组,arr=[2,3,1,2,3],其含义是这是一个有5个圆盘的汉诺塔,每一个数字代表 ...

  8. 汉诺塔算法python_python实现汉诺塔算法

    题目: 汉诺塔给出最优解,如果对汉诺塔的定义有不了解,请翻看数据结构教材. 除了最基本的之外,还有一题,给定一个数组,arr=[2,3,1,2,3],其含义是这是一个有5个圆盘的汉诺塔,每一个数字代表 ...

  9. 【算法设计zxd】第2章 分析基础——渐近的界,基本效率类型

    多数情况:贪心>动态规划[同阶,但是系数不同] 增长的记号: O渐近上界,o f比g低阶,Ω渐近下界,ω f比g高阶,Θ渐近紧界 算法效率评价的指标: 算法对计算机资源的使用:          ...

最新文章

  1. Java框架JSON-RPC项目demo代码实战 + JAVA WEB配置虚拟目录(转自21天java web开发)
  2. JS中class和id的区别
  3. 数据结构与算法(C++)– 图(Graph)
  4. java ssh 下载excel,SSH整合WEB导出EXCEL案例
  5. des加密算法python代码_python des加密算法代码(pydes模块加密)
  6. 两个链表的第一个公共结点-输入两个链表,找出它们的第一个公共结点。
  7. P4424-[HNOI/AHOI2018]寻宝游戏【结论】
  8. LeetCode 676. 实现一个魔法字典(哈希)
  9. ecshop nginx php-fpm,ecshop在nginx下配置常见问题
  10. 我国计算机系统安全保护等级的划分,信息安全技术题库:我国制定了强制性国家标准《计算机信息系统安全保护等级划分准则》,其中属于第二级的是()。...
  11. python爬虫︱百度百科的requests请求、百度URL格式、网页保存、爬虫模块
  12. 3dmax学习6——扫描命令
  13. 论文阅读:Aspect-based Sentiment Classification with Aspect-specific Graph Convolutional Networks
  14. 如何提高自制力?自制力差怎么办?
  15. PAT_乙级_1006_筱筱
  16. OPS and So on.
  17. ERP系统里的BOM展开函数
  18. 区块链、通证与供应链风险管理适应性分析研究
  19. linux服务器光衰,linux下怎么查看光模块光功率
  20. 【Linux从青铜到王者】第二十篇:Linux网络基础第三篇之IP协议

热门文章

  1. DPDK — Userspace PMD 源码分析
  2. 等我千年的城市------凤凰!
  3. 程序员都比较容易胖?配合曲仙止弹豆浆健康饮食跟肉肉说再见
  4. 机器人无限火力无限e符文_LOL无限火力青龙刀机器人黑科技套路 无限晕加超高伤害...
  5. 字符串相似度计算工具和算法
  6. cocos脏话过滤_字符串多模式精确匹配(脏字/敏感词汇/关键字过滤算法)——TTMP算法 之实战F模式...
  7. 鸿蒙harmonyOS方舟框架ARK etsUI 页面跳转动画translate不显示的问题
  8. 小米mix2手机MIUI10系统降级为MIUI9
  9. Android APP 如何发送短信?
  10. 【UML】UML几种图的绘制