算法和算法评价

news2025/1/12 3:45:13

1 算法的基本概念

1.1 算法是什么?

算法是对特定问题求解步骤的一种描述,它是指令的有限序列,其中每条序列指令表示一个或多个操作。
举例:在这里插入图片描述程序 = 数据结构(要处理的信息) + 算法(处理信息的步骤);在这个例子中,食材代表数据结构,做菜步骤代表的就是算法了

1.2 算法的特性

  1. 有穷性:一个算法必须总在执行有穷步之后结束,且每一步都可在有穷时间内完成。(算法必须有穷,程序可以无穷)
  2. 确定性:算法中每条指令必须有确切的含义,对于相同的输入只能得到相同的输出。(不可有歧义)
  3. 可行性:算法中描述的操作都可以通过已经实现的基本运算执行有限次来实现。(不可以天马行空)
  4. 输入:一个算法有0个或者多个输入,这些输入取自某个特定的对象的集合。
  5. 输出:一个算法要有0个或者多个输出,这些输出与输入有着某种特定关系的量。

一个算法必须具备以上5个特性!

1.3 好算法的特点

  1. 正确性:算法应能够正确地解决求解问题。(一个好算法最基本的应该能正确解决问题吧!)
  2. 可读性:算法应具备良好的可读性,以帮助别人理解。(一个好算法最起码可以让别人轻易读懂吧!)
  3. 健壮性:输入非法数据时,算法能适当的做出反应或进行处理,而不会产生莫名奇妙的输出结果
  4. 效率与低存储量需求:效率是算法执行的时间,储存量需求是指算法执行过程中所需要的最大存储空间,这两者都与问题的规模有关。(怎么才可以从众多算法中脱颖而出,就看时间复杂度跟空间复杂度啦)

2 算法的时间复杂度

2.1 什么是时间复杂度

2.1.1 频度

一个语句的频度是指该语句在算法中被重复执行的次数。算法中所有语句的频度之和记为T(n),它是该算法问题规模n的函数,时间复杂度主要分析的就是T(n)的数量级

2.1.2 时间复杂度

通常采用算法中的基本运算的频度来分析算法的时间复杂度,因此算法的时间复杂度记为 T(n) = O(f(n))
问题1:为什么只看表达式最高阶的?忽略掉了表达式的其他部分呢?
答:在分析算法的时间复杂度时,我们通常只关注最高阶的项,忽略其他低阶项和常数系数。这是因为随着输入规模增加,最高阶项的影响会远远超过其他项。
问题2:顺序执行的代码,可以忽略吗?
答: 可以,顺序执行的代码仅仅影响常数项,我们只需要挑循环的一个基本操作分析它的执行次数与n的关系即可,如果有多层循环,只需要考虑最深层次的。

2.1.2 计算规则

  1. 加法规则:多项相加,只保留最高阶的项,且系数变为1
    在这里插入图片描述

  2. 乘法规则:多项相乘,都保留。
    nimg.cn/5c537b4dd0cc471e8ad9b6000e93d916.png)

  3. 常见的渐进时间复杂度
    在这里插入图片描述
    在这里插入图片描述

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

  1. 最好时间复杂度:在最好情况下,算法的时间复杂度(不重要)
  2. 最坏时间复杂度:在最坏情况下,算法的时间复杂度(重要)
  3. 平均时间复杂度:所有可能输入实例在等概率出现的情况下,算法的期望时间(重要)

举例

#include <iostream>
#include <vector>

int linearSearch(std::vector<int> arr, int target) {
    for (int i = 0; i < arr.size(); i++) {
        if (arr[i] == target) {
            return i;  // 返回目标元素在向量中的索引
        }
    }
    return -1;  // 目标元素不存在于向量中
}

int main() {
    std::vector<int> arr = {5, 2, 9, 1, 7};
    int target = 9;
    int result = linearSearch(arr, target);
    
    if (result != -1) {
        std::cout << "目标元素 " << target << " 在向量中的索引为 " << result << std::endl;
    } else {
        std::cout << "目标元素 " << target << " 不存在于向量中" << std::endl;
    }
    
    return 0;
}

对于这个程序,最好的情况就是搜索的元素在数组的第一个位置–T(n)=O(1);
最坏的情况就是搜索的元素在数组的最后一个位置–T(n)=O(n);
平均情况就是搜索的元素在数组的任意位置的概率相同为1/n–T(n)=O(n);

3 算法的空间复杂度(内存空间与问题规模的关系)

  • 算法的空间复杂度S(n)定义为该算法所耗费的存储空间,它是问题规模n的函数。记为:S(n)=O(g(n)),
  • 一个程序在执行时除了需要存储空间来存放本身所用的指令、常数、变量和输入数据外,还需要一些对数据进行操作的工作单元和存储一些为实现计算所需信息的辅助空间。若输入数据所占空间仅仅取决于问题本身,和算法无关,则只需分析除了输入和程序之外的额外空间
  • 算法原地工作:算法所需辅助空间为常量,O(1) (就是说存储空间与问题规模n没关系

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

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

相关文章

VMware vCenter Server 8.0安装并添加ESXi 7.0主机(含ESXi 6.7版本升级至7.0版本)

目录 一、VMware vSphere虚拟化方案名词梳理 1、VMware Workstation&#xff1a;虚拟化工具 2、VMware vSphere&#xff1a;虚拟化方案 2.1 ESXi&#xff1a;裸金属架构的虚拟化技术 2.2 vCenter Server&#xff1a;批量连接 ESXi 的管理工具 2.3 vSphere Client&#xf…

Linux--验证内存地址空间排布

验证&#xff1a; #include<stdio.h> #include<stdlib.h>int g_val1 10; int g_val2 20;int g_val3; int g_val4;int main(int argc, char* argv[], char* env[]) {//任务:验证进程地址空间//代码区printf("code address:%p\n", main);//只读常量区co…

录好的视频怎么把声音提取出来?这四种方法轻松提取

当我们录制好一段视频后&#xff0c;如果需要对视频中的声音进行编辑&#xff0c;或者是要对视频中的语音内容进行翻译&#xff0c;这时我们将需要提取视频中的声音&#xff0c;可以使得对语音内容进行编辑或翻译更加方便&#xff0c;因为不需要在视频中不断寻找对应的片段。那…

Python 自学 day02 循环语法 for ,函数定义和使用,容器的定义和使用,列表的函数和使用

1.for 循环基础语法 2.获取数字序列的函数 range 2.1 range 函数用法一 ; num range(5) #获取一个 0 到 4 的数字序列 &#xff08;注意不包含参数本身&#xff09; 2.2 range 函数用法二 &#xff1a; num1 range(2,5) #获取 一个 2 数到 4 的数字序列&#…

如何利用智云通CRM快速获取客户并实现销售

开发新市场是企业扩展业务和增加销售的重要策略之一。然而&#xff0c;在面对新的市场和客户时&#xff0c;如何高效地获取客户并实现销售一直是企业面临的挑战。智云通CRM作为一款领先的客户关系管理软件&#xff0c;则为企业提供了全方位的解决方案&#xff0c;帮助企业在开拓…

如何将jar 包下载到自定义maven仓库

下载命令 mvn install:install-file -Dfileartifactid-version.jar -DgroupIdgroupid -DartifactIdartifactid -Dversionversion -Dpackagingjar -DlocalRepositoryPath. -DcreateChecksumtrue参数解释 在上述命令中&#xff0c;需要替换以下参数&#xff1a; artifactid-vers…

阿里云无影云电脑具体价格表(1元入口)

阿里云无影云电脑配置费用&#xff0c;4核8G企业办公型云电脑可以免费使用3个月&#xff0c;无影云电脑地域不同费用不同&#xff0c;无影云电脑是由云桌面配置、云盘、互联网访问带宽、AD Connector、桌面组共用桌面session等费用组成&#xff0c;阿里云百科分享阿里云无影云电…

如何使用python这样的简单程序语言,在自己的电脑上搭建一个共享文件服务器.

文章目录 1. 前言2. 视频教程3. 本地文件服务器搭建3.1 python的安装和设置3.2 cpolar的安装和注册 4. 本地文件服务器的发布4.1 Cpolar云端设置4.2 Cpolar本地设置 5. 公网访问测试6. 结语 1. 前言 数据共享作为和连接作为互联网的基础应用&#xff0c;不仅在商业和办公场景有…

数据库应用:MySQL索引

目录 一、理论 1.MySQL三层逻辑架构 2.索引结构 3.MyISAM与InnoDB对比 4.sql优化 5.MySQL 索引 6.MySQL索引原理 二、实验 1.创建索引 三、总结 一、理论 1.MySQL三层逻辑架构 MySQL的存储引擎架构将查询处理与数据的存储/提取相分离。 MySQL的逻辑架构图如下&…

Flask结合gunicorn和nginx反向代理的生产环境部署及踩坑记录

前言 之前自己写的flask使用gunicorn上线生产环境没有什么问题&#xff0c;但是最近搭建了一个现成的flask项目&#xff0c;当使用python直接运行时不会有问题&#xff0c;而使用gunicorn时则会出现一些问题。 部署过程 运行测试 这里使用pyenv创建了一个虚拟环境&#xff0…

Android PackageManagerService源码分析和APK安装原理详解

前些天发现了一个蛮有意思的人工智能学习网站,8个字形容一下"通俗易懂&#xff0c;风趣幽默"&#xff0c;感觉非常有意思,忍不住分享一下给大家。 &#x1f449;点击跳转到教程 一、PackageManagerService简称PMS&#xff1a;PackageManagerService是Android系统中核…

城市餐饮油烟的监测与治理

摘要&#xff1a;为控制餐饮油烟污染&#xff0c;改善城市大气污染和生态环境&#xff0c;针对城市餐饮油烟污染现状&#xff0c;提出相应的治理政策。加快餐饮油烟污染立法进度&#xff0c;推进相关法律法规修订&#xff0c;加大油烟污染执法力度&#xff1b;维护清洗油烟净化…

windows安装使用 tesseract-ocr

OCR&#xff08;Optical character recognition&#xff0c;光学字符识别&#xff09;是一种将图像中的手写字或者印刷文本转换为机器编码文本的技术。 tesseract-ocr 是由Google开发&#xff0c;支持100多种语言 文档 tessdoc&#xff1a; https://tesseract-ocr.github.io…

3Ds max创建闪烁的星星效果

在这个简单的教程中&#xff0c;您将学习如何通过几个步骤创建闪烁的星星效果。 推荐&#xff1a; NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 步骤-1 在顶视图中创建球体 步骤-2 应用星形材料。 步骤-3 复制球体并稍微调整其大小&#xff08;两个球体必须完全相同&…

Ubuntu 的安装及其设置

文章目录 安装 Ubuntu屏幕分辨率设置修改软件源服务器锁屏时间设置设置 dash跨系统拖拽复制文件的设置 安装 Ubuntu 首先安装 VMware 虚拟机&#xff0c;虚拟机的安装比较简单&#xff0c;一步步点击Next即可完成安装。 安装完成后启动虚拟机&#xff0c;点击创建新的虚拟机。…

modelscope本地模型使用教程

阿里魔塔社区modelscope&#xff08;https://modelscope.cn/home&#xff09; 如果使用过模型&#xff0c;那么模型文件默认缓存地址&#xff1a;C:\Users\Administrator.cache\modelscope\hub 魔塔社区本地使用&#xff1a; 1、安装python环境&#xff1a;使用miniconda&…

Apache Knox Gateway

简介&#xff1a; Knox是一个提供认证和访问集群中hadoop服务的单个端点服务。目标是为用户和操作者简化hadoop安全。knox运行为一个服务或者集群服务&#xff0c;并提供集中访问一个或者多个hadoop集群。通常网关的目标如下&#xff1a; 1、为hadoop rest api 提供外层的安全…

实战攻防之积极防御体系建设 | 中睿天下受邀参与诸子云沙龙

7月8日&#xff0c;中睿天下受邀参与由诸子云举办的“网络与数据安全”主题沙龙&#xff0c;中睿天下技术经理徐丹丹就《实战攻防之积极防御体系建设》这一主题进行了分享交流。 本次沙龙由南京分会会长宋士明主持&#xff0c;活动邀请到BASF、江苏省联社、华泰证券、宁证期货、…

微软浏览器连不上网络

针对微软浏览器连不上网络&#xff0c;但其他浏览器仍能连上网络 控制面板 -> 网络和Internet -> Internet 选项 -> 连接 -> 局域网设置 -> 取消代理服务器

理清ROS通信的一些细节

目标&#xff1a;掌握ros的python编程 基本教程&#xff1a;https://www.bilibili.com/video/BV1sU4y1z7mw/?spm_id_from333.788&vd_source32148098d54c83926572ec0bab6a3b1d terminator 快捷键需要自己去重新启用 ctrlshifte 横向分屏 ctrlshifto 纵向分屏 ctrlshiftw …