算法分析(概论)

目录

第一章 概论

1.算法的概念

1.定义

2.算法设计要求

3.算法的特性

4.算法描述

5.数据结构与算法

6.算法设计的基本步骤

2.算法分析

1.计算机资源

2.算法分析

3.评判算法效率的方法

4.算法时间复杂度分析

5.渐进符号

1.大Ο符号

2.大Ω符号

3.大Θ符号

4.三种符号图例

5.渐进符号特性 


第一章 概论(上)

1.算法的概念

1.定义

算法是求解问题的一系列计算步骤,是来将输入数据转换成输出结果。

用于将输入数据转换为输出结果。

2.算法设计要求

正确性:要求算法能够正确地执行预先规定的功能和性能要求。

②可使用性:要求算法能够很方便的使用。(用户友好性)

③可读性:算法应该易于人的理解。(可读性好:算法的逻辑必须是清晰的、简答的和结构化的)

④健壮性:要求算法具有很好的容错性,也就是可以提供异常处理,能够对不合理的数据进行检查,不经常出现异常中断或死机现象。

⑤高效性与低存储量需求:通常算法的效率主要指算法的执行时间。对同一个问题如果有多种算法求解,执行时间短的算法效率高。(算法存储量指的是算法执行过程中所需的最大存储空间,效率和低存储量都与问题的规模有关

举个例子:关于在带头结点的单链表h中查找第一个值为x的结点,并返回其逻辑序号(从1开始),找不到则返回0。

#include<stdio.h>
typedef struct node
{
    int data;
    struct node *next;
}LNode;
int Findx(LNode *h,int x)
{
    int i=0;
    LNode *p=h->next;
    while(p->data!=x&&p!=NULL)
    {
        p=p->next;
        i++;
    }
    if(p==NULL)
    {
        return 0;
    } else{
        return i;
    }
}

3.算法的特性

①有限性:一个算法必须总是(对任何合法的输入值)在执行有限步之后结果,且每一步都可在有限时间内完成。

②确定性:算法每一步指令必须有确切的含义,不会产生二义性。

③可行性:算法中的每一条运算都必须是足够基本的,也就是它们在原则上都能精确的执行,甚至人们仅用笔和纸做有限次运算就可以完成。

④输入性:一个算法有零个或者多个输入。大部分算法的输入参数是必要的,但对于较简单的算法,可以不需要任何输入参数(例如1+2)。因此算法可以是一个或者多个。

⑤输出性:一个算法可以有零个或者多个输出。算法用于某种数据的处理,如果没有输出,这样的算法是没有意义的,这些输出是和输入有着某些特定关系的量。

错误举例:

//举例1:不满足算法的有限性(无限循环)
void main()
{
    int n=2;
    while(n%2==0)
    {
        n+=2;
    }
    printf("%d\t",n);
}
//举例2:不满足算法的可行性(分母为0)
void main()
{
    int x,y;
    x=0;
    y=5/x;
    printf("%d,%d",x,y);
}

4.算法描述

C语言可以使用指针方式实现形参的回传;

C++语言使用引用型参数的概念,引用型参数名前需要添加&,表示这样的形参在执行后会将结果回传给对应的实参。

//C
bool fun(int n,int s)
{
    if(n<=0)
    {
        return false;
    }
    s=0;
    for(int i=1;i<=n;i++)
    {
        s+=i;
    }
    return true;
}
void main()
{
    int a=10,b=0;
    if(fun(a,b))
    {
        printf("%d",b);
    }else{
        printf("输入错误!");
    }
}
//C++
bool fun(int n,int &s)
{
    if(n<=0)
    {
        return false;
    }
    s=0;
    for(int i=1;i<=n;i++)
    {
        s+=i;
    }
    return true;
}

5.数据结构与算法

数据结构是算法设计的基础,算法的操作对象是数据结构。

数据结构设计主要是选择数据的存储方式(例如确定求解问题中的数据采用数组存储还是采用链表存储);算法设计就是在选定的存储结构上设计一个满足要求的好的算法。

数据结构关注的是数据的逻辑结构、存储结构以及基本操作;算法关注的是如何在数据结构的基础上解决实际问题。

算法是编程思想,数据结构是思想的逻辑基础。

6.算法设计的基本步骤

①分析求解问题:确定求解问题的目标(功能)、给定的条件(输入)、生成的结果(输出)

②选择数据结构和算法设计策略:设计数据对象的存储结构,因为算法效率取决于数据结构的存储表示。算法设计策略包括迭代法、分治法、动态规划和回溯法等

③描述算法:清步骤晰准确记录所设计的求解

④证明算法的正确性:可以采用数学证明方法

⑤算法分析:在多个算法中选取最好的算法

2.算法分析

1.计算机资源

①计算时间②内存空间。

2.算法分析

是分析算法占用计算机资源的情况,算法分析包括:①时间复杂度②空间复杂度,目的在于考察算法的时间和空间效率,以求改进算法或对不同算法进行比较。

3.评判算法效率的方法

①事后统计法(必须执行程序)②事前分析估算法(存在其他因素掩盖算法本质)

4.算法时间复杂度分析

  1. 时间复杂度分析:在计算机上运行时所消耗的时间与很多因素有关,仅考虑算法本身的效率高低,可以认为一个特定算法的“运行工作量”的大小只依赖于问题的规模,或者是问题规模的函数。这就是事前分析估算法一个算法是由控制结构(顺序、分支、循环)和原操作(指固定数据类型的操作)构成。算法的执行时间主要与问题规模有关。

  2. 分析算法时间复杂度的一般步骤:算法分析问题规模n,找出其中的基本语句,求出其运算次数f(n)用大Ο,大Ω或Θ表示(大Ο,大Ω或Θ是渐进符号,采用渐进符号表示的算法时间复杂度也称为渐进时间复杂度,反映的是一种增长趋势)

  3. 通常称渐进时间复杂度为多项式的算法为有效算法;称n!或2^n这样的低效算法为指数时间算法。

5.渐进符号

1.大Ο符号

定义1(大〇符号):f(n)=O(g(m))(读作“ (n)是g(n)的大O”),当且仅当存在正常量c和no,使当n≥n。时f(n)≤cg(m),即g(n)为f(n)的上界。

2.大Ω符号

定义 2(大Ω符号):f(n)=Ω(g(n))(读作“f(n)是g(n)的大Ω”),当且仅当存在正常量c和n,使当 n>no 时 f(n)>cg(n),即 g(n)为 f(n)的下界。

3.大Θ符号

定义 3(大 @ 符号):f(n)= @(g(n))(读作“f(n)是g(n)的大@”),当且仅当存在正常量 c、c: 和 no,使当 n>n 时有 cg(n)<f(n)<cg(n),即 g(n)与 f(n)的同阶。

4.三种符号图例

在每个部分中,n0是最小的可能值,大于n0的值也有效,成为渐进分析。Θ(g(n))对应的g(n)是渐进确界,O(g(n))对应的g(n)是渐进上界,Ω(g(n))对应的g(n)是渐进下界。

5.渐进符号特性 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Allure 内置特性

章节目录&#xff1a; 一、内置特性概述二、展示环境信息三、测试结果分类四、用例步骤说明五、添加附件六、添加用例描述七、设置动态的用例标题八、报告中添加链接九、组织测试结果9.1 使用与理解9.2 指定运行 十、划分用例级别十一、动态生成附加信息十二、清空历史报告记录…

Cesium反向遮罩指定区域挖空---Primitive、PolygonGeometry、PolylineGeometry实现

PolylineRegionalExcavationFun2() {import("./data/安徽省.json").then((res) => {console.log(`res`, res);let features = res.features;let positionArray = [];let borderLinePositionArray = [];// 获取区域的经纬度坐标if (features[0]?.geometry?.coord…

【大数据】Flink 中的状态管理

Flink 中的状态管理 1.算子状态2.键值分区状态3.状态后端4.有状态算子的扩缩容4.1 带有键值分区状态的算子4.2 带有算子列表状态的算子4.3 带有算子联合列表状态的算子4.4 带有算子广播状态的算子 在前面的博客中我们指出&#xff0c;大部分的流式应用都是有状态的。很多算子都…

【陈工笔记-Transformer】Transformer的基础认识

对Transformer生动形象的比喻 Transformer包括了Encoder和Decoder&#xff0c;在知乎上看到了对两个部分关系的一种理解&#xff0c;非常有趣。即&#xff0c;“一个人学习跳舞&#xff0c;Encoder是看别人是如何跳舞的&#xff0c;Decoder是将学习到的经验和记忆&#xff0c;…

被动信息搜集

被动信息搜集主要通过搜索引擎或者社交等方式对目标资产信息进行提取&#xff0c; 通常包括IP查询、Whois查询、子域名搜集等。进行被动信息搜集时不与目标产 生交互&#xff0c;可以在不接触到目标系统的情况下挖掘目标信息。主要方法包括&#xff1a;DNS 解析、子域名挖掘、…

Unity中创建Ultraleap 3Di交互项目

首先&#xff0c;创建新的场景 1、创建一个空物体&#xff0c;重命名为【XP Leap Provider Manager】&#xff0c;并在这个空物体上添加【XR Leap Provider Manager】 在物体XP Leap Provider Manager下&#xff0c;创建两个子物体Service Provider(XR)和Service Provider(…

随机点名--好玩哦

大屏滚动&#xff0c;随机点名&#xff0c;可刺激哦 想屏幕名字滚动得快一点&#xff0c;sleep时间就小一点 效果图 代码 #!/bin/bash namefile"/opt/name.txt" linenum$(sed -n $ $namefile) while : docleartmp$(sed -n "$[RANDOM%linenum1]p" $namefi…

文件上传之大文件分块上传

原则&#xff1a;合久必分&#xff0c;分久必合 优势部分&#xff1a;减少了内存占用&#xff0c;可实现断点续传&#xff0c;并发处理&#xff0c;利用带宽&#xff0c;提高效率 不足之处&#xff1a;增加复杂性&#xff0c;增加额外计算存储 应用场景&#xff1a;云存储大文件…

Springboot的 Lombok全部关联注解以及核心注解@Data详解

目录 工具安装 依赖注入 注解类别 1. Getter / Setter 2. ToString 3. EqualsAndHashCode 4. NoArgsConstructor / RequiredArgsConstructor / AllArgsConstructor 5. Data 示例 注意事项 6. Value 7. Builder 8. Slf4j / Log / Log4j / Log4j2 / XSlf4j 9. NonN…

03.领域驱动设计:了解实体和值对象以及它们的区别

目录 1、概述 2、实体 1.实体的业务形态 2.实体的代码形态 3.实体的运行形态 4.实体的数据库形态 3、值对象 1.值对象的业务形态 2.值对象的代码形态 3.值对象的运行形态 4.值对象的数据库形态 5.值对象的优势和局限 4、实体和值对象的区别 5、总结 1、概述 DDD战…

企业虚拟机服务器中了lockbit3.0勒索病毒怎么办,lockbit3.0勒索病毒解密处理流程

对于企业来说&#xff0c;企业的数据是企业的核心命脉&#xff0c;关乎着企业的生产与运营的所有工作。随着网络技术的不断发展&#xff0c;网络安全威胁也在不断增加。近期&#xff0c;云天数据恢复中心接到了很多企业的求助&#xff0c;企业的虚拟机服务器遭到了lockbit3.0勒…

vue的pinia环境搭建

一、 pinia是什么&#xff1f; Pinia是Vue的新一代轻量级状态管理库&#xff0c;它允许您跨组件/页面共享状态。Pinia由Vue.js官方成员重新设计&#xff0c;旨在提供更直观、更易于学习的状态管理解决方案。 Pinia的主要特点包括&#xff1a; 对Vue2和Vue3提供良好的支持&#…

机器学习之pandas库学习

这里写目录标题 pandas介绍pandas核心数据结构SeriesDataFrameDataFrame的创建列访问列添加列删除行访问行添加行删除数据修改 pandas介绍 pandas是基于NumPy 的一种工具&#xff0c;该工具是为了解决数据分析任务而创建的。Pandas 纳入 了大量库和一些标准的数据模型&#xff…

C#学习(十一)——Array和Collection

一、集合 集合重要且常用 孤立的数据是没有意义的&#xff0c;集合可以作为大量数据的处理&#xff0c;可进行数据的搜索、迭代、添加、删除。 C#中&#xff0c;所有集合都必须实现ICollection接口&#xff08;数组Array除外&#xff09; 集合说明Array数组&#xff0c;固定长…

【Linux】进程间通信概念 | 匿名管道

文章目录 一、什么是进程间通信进程间通信的概念进程间通信的目的进程间通信的分类进程间通信的本质 二、什么是管道三、匿名管道匿名管道的原理✨站在内核角度理解管道✨站在文件描述符角度理解管道 pipe系统调用fork后在父子进程间使用管道通信代码实现 匿名管道的读写规则管…

初识人工智能,一文读懂机器学习之逻辑回归知识文集(7)

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…

CSS 双色拼接按钮效果

<template><view class="sss"><button> <!-- 按钮 --><view class="span"> 按钮 </view> <!-- 按钮文本 --></button></view></template><script></script><style>body {b…

uniapp微信小程序-input默认字的样式

需要的是这样的 问题 正常是在input框上面写样式就行&#xff0c;但是uniapp不起作用 解决 直接在input上写placeholder-style"color就解决了 <input class"findInput" type"text" placeholder"关键词查询"placeholder-style"co…

Gin 框架之jwt 介绍与基本使用

文章目录 一.JWT 介绍二.JWT认证与session认证的区别2.1 基于session认证流程图2.2 基于jwt认证流程图 三. JWT 的构成3.1 header : 头部3.2 payload : 负载3.2.1 标准中注册的声明 (建议但不强制使用)3.2.2 公共的声明3.2.3 私有的声明3.2.4 定义一个payload 3.3 signatrue : …

一文掌握SpringBoot注解之@Component 知识文集(5)

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…