首页 > 编程语言 >算法分析设计复习 (时间复杂度)

算法分析设计复习 (时间复杂度)

时间:2023-12-12 23:55:21浏览次数:28  
标签:复习 圆盘 复杂度 最大值 算法 递推 关系式 left

目录

前言

本文为JMU22级软件算法分析考前复习而总结归纳,讲解时间复杂度的计算。
应该重点考察递归算法的拓展递归分析法。

分2步。一、求出递推关系式。二、设问题规模n=某个值,展开找规律合并下结论。



求递推关系式

例一 汉诺塔

大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,任何时候,在小圆盘上都不能放大圆盘,且在三根柱子之间一次只能移动一个圆盘。问应该如何操作?(每次只能移动1个盘子,大盘子只能放在小盘子下面)。

算法简述

求把n个圆盘移到目标柱时:

  • 1.把n-1个圆盘移到工具柱。
  • 2.把最大盘移到目标柱。
  • 3.把n-1个移到目标柱。
public static void hanoi(int nDisks,char  A,char B,char C){
        if (nDisks==1){ move(nDisks,A,C);return;}

        hanoi(nDisks-1,A,C,B);
        move(nDisks,A,C);
        hanoi(nDisks-1,B,A,C);
}

求关系式

  • 我个人觉得最容易出错的就是有时候是+1,有时候是+n。后来发现最准确的方法是顺序分析算法到底做了什么,它的时间复杂度和问题规模是否有关。

n个圆盘的递推关系式用T(n)表示。
如果目前此步只剩移动1个圆盘,那么直接移动,不递归,时间复杂度就是执行一次移动的时间,为1。
如果不止一个,那么递归移动n-1个圆盘移到工具柱,时间复杂度就是T(n-1),接着把最大盘移到目标柱,时间复杂度=1,最后递归移动n-1个圆盘移到目标柱,时间复杂度就是T(n-1)。
所以有:

图片名称

例二 分治法求最大值

算法简述

在长度为n的数组求最大值

  • 拆成两半,分别求次最大值
  • 2者比较,得出最大值
void FindMax (int *Array, int left, int right,int *max)
{
       if ((right - left) == 0)
       {
              *max = *min = Array[left];
       }
      else {
                     int max1, max2;
                     FindMinMax (Array, left, (right - left)/2 + left, &max1);
                     FindMinMax (Array, (right - left)/2+1 + left, right,&max2);
                     (min1 > min2) ? *min = min2 : *min = min1;
                     (max1 > max2) ? *max = max1 : *max = max2;
       }
}

求关系式

在长度为n的数组求最大值,递推关系式用T(n)表示。
拆成两半,分别求次最大值,时间复杂度就是2T(n/2)。然后2者比较,时间复杂度为1。
所以有:
图片名称



求时间复杂度

例一 汉诺塔

上面我们已经求得递推关系式:
图片名称

扩展

将递推关系式式拓展,就是不停带入关系式,一般写3层就行了:
图片名称

找规律

写了3步就可以知道,n是一次次减到1为止,所以一共拓展n-1次(n-1到1),那么系数就是2的n-1次方,还要加上n项,首项为1,公比为2的等比数列。

图片名称

大O表示法

大O表示法要忽略常量、低次幂和最高次幂的系数。
所以最后得到O(n的2次方)。


例二 分治法求最大值

扩展

带入表达式:
图片名称

找规律

要一直递归到T(1)时才停,需要求出第几层,得出关系式 n/2的k次方 = 1 ,也就是k = logn。要递归logn层。那么T(1)的系数就是,2的k次方,也就是n,然后再加上k项,首项为1,公比为2的等比数列。
图片名称

大O表示法

忽略常量和系数,得到O(n)复杂度。

标签:复习,圆盘,复杂度,最大值,算法,递推,关系式,left
From: https://www.cnblogs.com/lmj00/p/17898142.html

相关文章

  • EM算法——最大似然估计的拓展
    EM算法(Expectation-Maximization)是一种用于解决含有隐变量的概率模型参数估计问题的迭代优化算法。其基本思想是通过交替进行期望(Expectation)和最大化(Maximization)两个步骤来优化模型参数。在E步骤中,通过当前参数对隐变量的条件分布进行估计,计算完全数据对数似然的期望值。这一步......
  • 文心一言 VS 讯飞星火 VS chatgpt (155)-- 算法导论12.3 2题
    二、用go语言,假设通过反复向一棵树中插人互不相同的关键字来构造一棵二叉搜索树。证明:在这棵树中查找关键字所检查过的结点数目等于先前插入这个关键字所检查的结点数目加1。文心一言:为了证明这个结论,我们可以使用二叉搜索树的性质:在二叉搜索树中,每个节点包含一个关键字以及指......
  • 一些好玩的Hash算法(CMU15445)
    graphLRR[HashTable]-->St[静态哈希策略] R-->Dy[动态哈希策略] St-->线性探测法 St-->t1[RobinHood] St-->t2[CuckooHashing] Dy-->Ch[ChainedHashing] Dy-->Ex[ExtendibleHashing] Dy-->Lin[LinearHashing] Hash策略的分类静态哈希哈希表......
  • 几种简单的排序算法(js实现)
    排序是日常开发中经常用到的代码,下面是几种常见的排序算法:冒泡排序(BubbleSort)functionbubbleSort(arr){letlen=arr.length;for(leti=0;i<len-1;i++){for(letj=0;j<len-1-i;j++){if(arr[j]>arr[j+1]){......
  • 机器学习中的算法——逻辑回归
    1.逻辑回归的定位机器学习分有监督和无监督以及半监督学习三种,其中有监督学习主要分为分类问题和回归问题;无监督主要是聚类的算法其中逻辑回归是属于分类问题跟上次讲的线性回归有不同,从字面上确实容易混淆2.逻辑回归的概念逻辑回归是在线性回归的基础上加上一个非线性......
  • 递归算法
    递归算法是一种特殊的算法,它在一个问题中调用自身来求解。在递归中,一个函数会调用自身,通常是为了简化问题的规模,或者逐步逼近问题的答案。递归算法通常包括两个主要部分:基准情况(BaseCase):这是递归过程的终止条件。如果没有满足这个条件,递归将继续进行。递归情况(RecursiveCase):......
  • 学习C++算法入门第二天
    头文件#include<iostream> i=input,o=outputusingnamespacestd;头文件函数:https://blog.csdn.net/qq_32699009/article/details/104615792参考这个HelloWorld!---C学过,第一次接触C++,开启新的语言学习cin>>输入;cout<<输出<<endl; 啥是闰年?---非整百年:能被4整除的为闰......
  • 数据标注质量&算法效果评估的要点解读
     算法质量保障要点解读算法质量保障流程数据标注事项● 明确数据标注目的和需求:如明确是训练模型、测试模型、评估模型等● 制定标注计划:范围、进度、人员、工具等● 选择合适的标注人员:专业知识、背景、能力等● 提供标注培训/指导:标注目的/需求的介绍、标注标准......
  • 算法战斗第一天C++1
    A.Watermelon西瓜(timelimitpertest:1second,memorylimitpertest:64megabytes,input:standardinput,output:standardoutput)OnehotsummerdayPeteandhisfriendBillydecidedtobuyawatermelon.Theychosethebiggestandtheripest熟one,int......
  • 【算法】【线性表】最长单词
    1 题目给一个词典,找出其中所有最长的单词。样例1: 输入:{ "dog", "google", "facebook", "internationalization", "blabla" } 输出:["internationalization"]样例2: 输入:{ "like", "love&......