数据结构与算法——算法与算法分析

news2024/11/14 12:11:57

算法与算法分析

  • 初识算法
    • 算法的定义
    • 算法的描述
    • 算法与程序
    • 算法的特性
    • 算法设计的要求
  • 算法时间效率的度量
    • 事前估计法
    • 算法时间复杂度的渐进表示法
    • 算法时间复杂度案例分析
    • 最好、最坏和平均时间复杂度
    • 算法的空间复杂度

初识算法

算法的定义

  算法,即是对特定问题求解方法和步骤的一种描述。它是指令的有限序列。其中每个指令表示一个或多个操作。
  简而言之,算法就是解决问题的方法和步骤。

step1 ……
step2 ……
step 3……
……

算法的描述

  • 自然语言
  • 流程图:传统流程图、N-S流程图
  • 伪代码:类语言、类C语言
  • 程序代码:C语言程序……
      

算法与程序

  • 算法是解决问题的一个方法或者一个步骤,考虑如何将输入转化为输出,一个程序可以有多种算法。
  • 程序是某种程序设计语言对算法的具体实现。
  • 程序=数据结构+算法;数据结构通过算法实现操作,算法根据数据结构设计程序。

算法的特性

  • 有穷性
  • 确定性
  • 可行性
  • 输入
  • 输出

算法设计的要求

  • 正确性
  • 可读性
  • 健壮性
      当输入的数据非法时,好的算法能适当地做出正确反应或进行相应处理。
  • 高效性
      高效性包括时间空间两个方面。
     时间高效是指算法设计合理,执行效率高,可以用时间复杂度来度量。
     空间高效是指算法占用存储容量合理,可以用空间复杂度来度量。

算法时间效率的度量

   算法时间效率可以用依据该算法编制的程序在计算机上所消耗的时间来度量。

两种度量方法:

  • 事后统计法
  • 事前估计法
       事后统计法的缺点很明显,需要将算法实现,需要花费较多的精力,然后测算其时间和空间开销。所以一般是事前估计。

事前估计法

  算法运行时间=一个简单操作所需要的时间 × \times ×简单操作次数
 语句频度,即每条语句的执行次数
  算法运行的总时间= ∑ \displaystyle \sum 每条语句的语句频度 × \times ×执行该语句所需哟的时间。
  每条语句执行一次的时间一般是由机器而异的,与算法本身无关。我们设每条语句执行一次所需的时间均是单位时间。
 算法运行的时间就可以转化成频度之和来计算了。
例:两个n × \times ×n矩阵相乘

for (i=i;i<=n;i++)     //n+1次(最后一次判断,退出循环)
    for (j=1;n<=n;j++)  //n(n+1)次
    {
        a[i][j]=0;//n*n次
        for(k=1;k<=n;k++) //n*n*(n+1)次
            a[i][j]=a[i][k]*a[k][j];//n*n*n次
     }

T(n)= 2 n 3 + 3 n 2 + 2 n + 1 2n^3+3n^2+2n+1 2n3+3n2+2n+1

算法时间复杂度的渐进表示法

  为了便于比较不同算法的效率,我们仅仅比较它们的数量级。
  若有某个辅助函数f(n),当n趋于无穷大时,T(n)/f(n)的极限值为不等于0的常数,则称f(n)是T(n)的同数量级函数,记作T(n)=O(f(n)),称O(f(n))为算法的渐进时间复杂度。(O是数量级的符号),简称时间复杂度。
  在上述n阶矩阵相乘的例子中,当n趋于无穷大时,T(n)=O( n 3 n^3 n3),这就是上述问题的渐进时间复杂度,简称时间复杂度

  一般情况下,我们只需要考虑算法中基本操作执行的次数。
当n趋于无穷大时,两者的增长率相同
当n趋于无穷大时,两者的增长率相同。
T(n)=O(f(n))表示存在正的常数C和 n 0 n_{0} n0,使得当n≥ n 0 n_{0} n0时都满足0≤T(n)≤Cf(n)。

算法时间复杂度案例分析

定理
f(n)= a m n m + a m − 1 n m − 1 + … + a 1 n + a 0 a_{m}n^m+a_{m-1}n^{m-1}+…+a_1n+a_0 amnm+am1nm1++a1n+a0是一个m次多项式,则T(n)=O( n m n^m nm)。
  在计算算法时间复杂度时,可以忽略所有低次幂项和最高次幂的系数,这样可以简化算法分析,也体现出了增长率的含义。
分析算法时间复杂度的基本方法

  1. 找出语句频度最大的那条语句作为基本语句;
  2. 计算基本语句的频度得到问题规模n的某个函数f(n);
  3. 取数量级用符号'O'表示;
x=0;   //1次
y=0;   //1次
for (int k=0;k<n;k++)  //n+1次
    x++;  //n次
for (int i=0;i<n;i++)  //n+1次
    for (int j=0;j<n;j++)  //n(n+1)次
        y++;//n*n次

T(n)=O( n 2 n^2 n2)
时间复杂度是由嵌套最深层语句的频度决定的。

  • 常量阶示例
x++;
s=0;

  两条语句的频度均为1,算法的执行时间是一个与问题规模n无关的常数,所以算法的时间复杂度为T(n)=O(1)。
再如:

for (i=0;i<1000;i++)  //1001次
{
    x++;  //1000次
    s=0;
}

上面算法的执行次数虽然是1000次,但是它不会随着问题规模n的增长而增长,即使这个常数再大,算法的时间复杂度都是O(1)

  • 线性阶示例
for (i=0;i<n;i++)  //n+1次
{   
    x++;    //n次
    s=0;
}

T(n)=O( n n n)

  • 平方阶示例
x=0;y=0;   
for (k=1;k<=n;k++)
    x++; //n次
for (i=1;i<=n;i++)
    for (j=1;j<=n;j++) 
    y++;  //n*n次

   当有若干个循环语句时,算法的时间复杂度是由最深层循环内的基本语句的频度f(n)决定的。

  • 对数阶示例
 for(i=1;i<=n;i=i*2)
     {x++;s=0}

此算法的时间复杂度T(n)=O( log ⁡ 2 n \log_{2}n log2n)

  常见的时间复杂度按数量级递增排列依次为:常量阶O(1)、对数阶O( log ⁡ 2 n \log_{2}n log2n)、线性阶O(n)、线性对数阶O( n l o g 2 n nlog_{2}n nlog2n)、平方阶O( n 2 n^2 n2)、立方阶O( n 3 n^3 n3)、n次方阶( n k n^k nk),指数阶( 2 n 2^n 2n)等
在这里插入图片描述

最好、最坏和平均时间复杂度

例:对于某些问题的算法,其基本语句的频度不仅仅于问题的规模相关,还依赖于其他因素。
在一维数组a中查找某个值等于e的元素,并返回其所在位置。

for (i=0;i<n;i++)
   if (a[i]==e) return i+1;
   return 0;

  若在n个元素中,必有一个元素等于e,其中会有最好的情况,那就是a[0]=e,此时不论数组多大,时间复杂度都是O(1);有最坏的情况,那就是数组的最后一个元素才和e相等,此时的时间复杂度为O(n).
  一般情况下,可假设待查找的元素在数组中所有位置上出现的可能性均相同,则可取语句的频度在最好情况与最坏情况下的平均值,即f(n)=n/2,作为它的度量。

   称算法在最好情况下的时间复杂度为最好时间复杂度,指的是算法计算量可能达到的最小值;称算法在最坏情况下的时间复杂度为最坏时间复杂度,指的是算法计算量可能达到的最大值;算法的平均时间复杂度是指算法在所有可能情况下,按照输入实例以等概率出现时,算法计算量的加权平均值。
  我们通常只讨论算法在最坏情况下的时间复杂度,因为最坏情况下,就是算法执行时间的上界。

算法的空间复杂度

  作为算法所需存储空间的量度,简称空间复杂度,它也是问题规模n的函数,记作:
S(n)=O(f(n))
  一般情况下,一个程序在机器上执行时,除了需要寄存本身所用的指令、常数、变量和输入数据外,还需要一些对数据进行操作的辅助存储空间。其中,对于输入数据所占的具体存储量取决于问题本身,与算法无关,这样只需分析该算法在实现时所需要的辅助空间就可以了。
例:
数组逆序问题:
第一个和倒数最后一个交换,第二个和倒数第二个交换……

for (i=0;i<n/2;i++)
{
    tmp=a[i];
    a[i]=a[n-1-i];
    a[n-1-i]=tmp;
}
     

  在这个算法中,只需要有一个中间变量就够了。所需要的辅助空间即为常数,与数组的长度无关,所以空间复杂度为O(1)
定义一个新的数组,用来存放a数组的逆序

for (i=0;i<n;i++)
    b[i]=a[n-1-i];
for (i=0;i<n;i++)
    a[i]=b[i];

  在这个算法中,需要一个数组长度为n的数组b来解决问题,所以算法的空间复杂度为S(n)=O(n)



  对于一个算法,其时间复杂度和空间复杂度往往是相互影响的,当追求一个较好的时间复杂度时,可能会导致占用较多的存储空间,即可能会使空间复杂度的性能变差,反之亦然。
  不过,通常情况下,鉴于运算空间较为充足,人们都以算法的时间复杂度作为算法优劣的衡量指标

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/535683.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Winform实现以管理员模式启动并实现修改系统时间

场景 SpringBoot/Java中定时请求并根据服务端响应头的date实现本地Windows修改时间/时间同步(管理员权限问题-bat管理员启动cmd并运行jar)&#xff1a; SpringBoot/Java中定时请求并根据服务端响应头的date实现本地Windows修改时间/时间同步(管理员权限问题-bat管理员启动cmd…

在家吃灰老主机怎么自建黑群晖NAS当影音服务器

准备:u盘一个,老主机一个,要显示器键盘,烧u盘软件win32-disk(网上找)、balena(balenaEtcher - Flash OS images to SD cards & USB drives)的 1,巴西大佬的引导文件 进来这里 GitHub - fbelavenuto/arpl: Automated Redpill Loader 点右边的release文件下载 下载…

golang 函数调用栈笔记

一个被函数在栈上的情况&#xff1a;&#xff08;栈从高地址向低地址延伸&#xff09; 返回地址&#xff08;函数执行结束后&#xff0c;会跳转到这个地址执行&#xff09; BP&#xff08;函数的栈基&#xff09;局部变量返回值&#xff08;指的是函数返回值&#xff0c;eg&am…

Facebook广告投放过程中,如何提高有效曝光?

在数字营销中&#xff0c;广告曝光是至关重要的一环&#xff0c;Facebook广告投放也不例外。 有效曝光能够提高广告的点击率和转化率&#xff0c;从而帮助企业实现更好的广告效果。那么在Facebook广告投放过程中&#xff0c;如何提高有效曝光呢&#xff1f;下面将为大家分享几…

【Mybatis】SpringBoot整合Mybatis

唠嗑部分 之前我们说了Mybatis的一些文章&#xff0c;相关文章&#xff1a; 【Mybatis】简单入门及工具类封装-一 【Mybatis】如何实现ORM映射-二 【Mybatis】Mybatis的动态SQL、缓存机制-三 【Mybatis】Mybatis处理一对多、多对多关系映射-四 这篇文章我们来说说SpringBoot如…

前端面试高频题精讲(一)

HTML篇 什么是语义化 用正确的标签做正确的事情。例如&#xff1a;段落用 p 标签&#xff0c;标题用 h 系列标签。 便于团队的开发和维护&#xff0c;我见过用div走天下的&#xff0c;但不利于看清页面结构。在没有加载 CSS 的情况下也能呈现较好的内容结构与代码结构&#xf…

Ubuntu18.04/20.04/22.04的Apollo8.0软件包安装(免编译)

本文主要介绍在如何使用软件包&#xff08;即 deb 包&#xff09;的方式来安装 Apollo&#xff0c;相对于源码方式安装&#xff0c;软件包安装方式不需要编译&#xff0c;更加快捷。但是对环境的支持比较单一&#xff0c;如果在自定义环境内安装&#xff0c;请移步源码安装方式…

camunda流程引擎connector如何使用

在 Camunda 中&#xff0c;Connector 是一种用于与外部系统或服务交互的机制。它允许 BPMN 模型中的 Service Task 节点与外部系统或服务进行通信&#xff0c;从而使流程更加灵活和可扩展。使用 Connector&#xff0c;可以将业务流程与外部系统集成在一起&#xff0c;而无需编写…

java商城 java电子商务Spring Cloud+Spring Boot+mybatis+MQ+VR全景+b2b2c

一个好的SpringCloudSpringBoot b2b2c 电子商务平台涉及哪些技术、运营方案&#xff1f;以下是我结合公司的产品做的总结&#xff0c;希望可以帮助到大家&#xff01; 搜索体验小程序&#xff1a;海哇 1. 涉及平台 平台管理、商家端&#xff08;PC端、手机端&#xff09;、买家…

Python学习27:存款买房(A)

描述‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬ 你刚刚大学毕业&#xff0c;…

亚马逊如何提高商品listing转化率?测评自养号优势和技巧有哪些?

之前有讲过&#xff0c;亚马逊店铺流量的几大入口&#xff0c;如何获取流量。那么获取了流量之后&#xff0c;亚马逊卖家就需要考虑到转化率的问题&#xff0c;如果流量来没有转化率&#xff0c;一样不会产生订单。如果转化率太低还会影响到商品的表现&#xff0c;比如排名会下…

亚马逊云科技基础设施为大型模型推理提供技术保障

在2019年的亚马逊云科技re:Invent上&#xff0c;亚马逊云科技发布了新的基础设施Inferentia芯片和Inf1实例。Inferentia是一种高性能机器学习推理芯片&#xff0c;由亚马逊云科技定制设计&#xff0c;其目的是提供具有成本效益的大规模低延迟预测。时隔四年&#xff0c;2023年4…

使用particles动态粒子效果,优化登录页

前言 书接上回&#xff0c;咱不是做了落日余晖登录页&#xff0c;说白了就是一个背景图&#xff0c;感觉需要进一步优化一下&#xff0c;做一个高大上的效果。所图所示&#xff0c;我想要背后的动态粒子效果&#xff0c;这就开搞&#xff0c;基于老的代码&#xff1a;vue2和el…

10种最常用的3D 分析工具【GIS】

3D 分析一直是 GIS 中的一个增长趋势&#xff0c;因为它可以更好地表示现实世界。 这不仅仅是为了一张漂亮的图片。 对于某些类型的问题&#xff0c;3D 分析有时是你解决问题的唯一方法。 推动这一需求的 3D 数据类型也呈爆炸式增长。 例如&#xff0c;激光雷达、BIM、无人机…

S7-200SMART 实现MODBUS TCP通信的具体方法示例(客户端读写+服务器响应)

S7-200SMART 实现MODBUS TCP通信的具体方法示例(客户端读写+服务器响应) 前面和大家介绍了MODBUS TCP的基本使用方法,具体可参考以下链接中的内容: S7-200SMART实现MODBUS TCP通信(客户端+服务器)的具体方法和步骤示例 本次继续和大家分享S7-200SMART 中实现MODBUS TCP通…

界面控件DevExtreme使用指南 - 如何为雷达图添加注释?

在之前的版本中&#xff0c;官方技术团队为DevExtreme图表引入了注释支持。在v20.1版本中&#xff0c;继续扩展了对Polar Chart&#xff08;雷达图&#xff09;注释的支持&#xff0c;现在可以根据需要应用文本、图像或自定义注释。创建注释后&#xff0c;可以将其附加到Polar …

【Git基础】Gitlab的使用

文章目录 1. 搭建Gitlab1.1 Gitlab介绍1.2 搭建Gitlab 2. Gitlab的权限管理2.1 用户注册2.2 创建用户组2.3 为用户组添加用户2.4 为工程添加访问权限 3. Gitlab的code review4. 团队知识管理4.1 是什么4.2 为什么4.3 怎么做 1. 搭建Gitlab 1.1 Gitlab介绍 GitLab是一个基于Ru…

Kylin-Server-10-SP2-x86_64安装HDP2.7.5.0、Ambari【已解决】

Kylin-Server-10-SP2-x86_64安装HDPAmbari【已解决】 报错赏析解决方案os_check.py主要是三个修改点 参考&#xff1a; 报错赏析 ERROR: Unexpected error Ambari repo file path not set for current OS. ERROR: Exiting with exit code 1. REASON: Failed to create user. E…

anji-plus / AJ-Captcha行为验证码前后端实现

一&#xff0c;简介及源码、文档地址 AJ-Captcha行为验证码&#xff0c;包含滑动拼图、文字点选两种方式&#xff0c;UI支持弹出和嵌入两种方式。后端提供Java实现&#xff0c;前端提供了php、angular、html、vue、uni-app、flutter、android、ios等代码示例。 行为验证码采用嵌…

【软考数据库】第十三章 云计算与大数据处理

目录 13.1 云计算 13.1.1 云计算的关键特征 13.1.2 云计算分类 13.1.3 云关键技术 13.1.4 云计算的安全 13.1.5 云安全实施的步骤 13.2 大数据 前言&#xff1a; 笔记来自《文老师软考数据库》教材精讲&#xff0c;精讲视频在b站&#xff0c;某宝都可以找到&#xff0c…