复杂度分析

news2025/1/12 20:49:02

算法

如何评估一个算法的好坏?(事后统计法的应用)

在同一个问题上 比较不同算法对于同一输入的执行时间

事后统计法的缺点

1.严重依赖硬件以及运行时各种不确定因素(比如cpu好一点的效率就高一点)

2.必须编写相应的测试代码

3.测试时输入的数据难以保证公平性(比如你输入20时 第一台主机效率高一点 第二台主机效率第一点 当你输入40时 第一台主机效率低一点 第二台主机效率高一点)

事后统计法的优化

为了弥补事后统计法的缺点 我们可以通过一下这三个维度去评估算法的好坏:

1.正确性(编写代码时代码写的正不正确)、可读性(比如可以多行书写的代码开发人员却写成了一整行 导致用户的观感变差)、健壮性(对不合理的输入进行判断并且做出处理)

2.时间复杂度(计算代码执行所需要的时间)

3.空间复杂度(计算代码占用所需要的内存空间)

大O表示法

大O表示法是对复杂度的估算 用于描述复杂度

大O表示法的原则:保留最高阶、舍弃较低阶以及最高阶的系数

对数阶的细节

众所周知:log2(n) = log2(3) * log3(n)

所以我们可以知道一个对数等于一个常数乘以一个对数

所以我们对于对数可以简化成O(logn)

大O表示法实例一

public void test1(int n){
    // 以下是一个多重if语句的实例
    // 由于多重if语句属于互斥事件 所以只会执行一次 所以用大O表示法表示为O(1)
    if(n > 10){
        System.out.println("n>10");
    }else if(n > 5){
        System.out.println("n>5");
    }else{
        System.out.println("n<=5");
    }
    // 以下是一个for循环的案例
    // 针对for循环 执行次数是这样算的 包括初始化语句、条件判断语句、条件控制语句、循环体语句 其中条件判断语句=条件控制语句=循环体语句 所以执行次数等于1+4+4+4=13次 用大O表示法表示为O(1)
    for(int i = 0; i < 4; i++){
        System.out.println("test");
    }
}

大O表示法实例二

public void test2(int n){
    // 以下还是一个for循环案例 只不过是把案例一的4换成了n而已 目的在于让for循环的复杂度变得通用
    // 根据案例一的分析 我们可以知道执行次数一共为1+3n 用大O表示法表示为O(n)
    for(int i = 0; i < n; i++){
        System.out.println("test");
    }
}

大O表示法实例三

public void test3(int n){
    // 以下是嵌套for循环案例 执行次数为1+2n+n(1+3n)=3n^2+3n+1 用大O表示法表示为O(n^2)
    for(int i = 0; i < n; i++){
        for(int j = 0; j < n; j++){
            System.out.println("test");
        }   
    }
}

大O表示法实例四

public void test4(int n){
    // 以下是嵌套for循环的案例 只不过把内层循环的条件判断语句换成了非变量而已 那么这下子的执行次数即为1+2n+n(1+3*15)=1+48n 用大O表示法表示为O(n)
    for(int i = 0; i < n; i++){
        for(int j = 0; j < 15; j++){
            System.out.println("test");
        }
    }
}

大O表示法案例五

public void test5(int n){
    // 以下是while循环的案例 我们可以通过举例子的形式来帮助大家理解
    // 假设n=8 第一次执行时n为4 第二次执行时n为2 第三次执行时n为1 一共执行了3次 即为log2(8)次 有根据对数阶的规则我们可以知道用大O表示法表示为O(logn) 而且while循环执行次数一般不把条件判断语句算入其中 只把循环体语句算入其中
    while((n = n / 2) > 0){
        System.out.println("test");
    }
}

大O表示法案例六

public void test6(int n){
    // 以下案例是while循环 假设n=25 当n=5时 为第一次执行次数 当n=1时 为第二次执行次数 所以一共有2次执行次数 即为log5n次 用大O表示法表示为O(logn)
    while((n = n / 5) > 0){
        System.out.println("test");
    }
}

大O表示法案例七

public void test7(int n){
    // 以下是嵌套for循环 综上几个案例所述  我们可以知道这个嵌套循环的执行次数为1+2log2n+log2n*(1+3n) 化简后为3nlog2n+3log2n+1 用大O表示法表示为O(nlogn)
    for(int i = 1; i < n; i = i * 2){
        for(int j = 0; j < n; j++){
            System.out.println("test");
        }
    }
}

大O表示法案例八

public void test8(int n){
    // 以下是空间复杂度的案例 变量a、b、c分别占用3个内存空间 而array数组则是开辟了n个内存空间 所以一共开辟了n+3个内存空间 用大O表示法表示为O(n)    
    int a = 10;
    int b = 20;
    int c = a + b;
    int[] array = new int[n];
    for(int i = 0; i < array.length; i++){
        System.out.println(array[i]);
    }
}

大O表示法案例九

public void test9(int n, int k){
    // 以下案例时针对多个数据规模进行的 所以用大O表示法表示为O(n + k)
    for(int i = 0; i < n; i++){
        System.out.println("test");
    }
    for(int j = 0; j < k; j++){
        System.out.println("test");
    }
}

算法的优化方向

1.用尽量少的空间

2.用尽量少的时间

3.用时间换空间或者用空间换时间

复杂度

 

复杂度的大小比较

O(1) < O(logn) < O(n) < O(nlogn) < O(n^2) < O(n^3) < O(2^n) < O(n!) < O(n^n)

复杂度的大小比较(数据规模较小时结合图像分析)

 复杂度的大小比较(数据规模较大时结合图像分析)

斐波拉契数列的代码实现

递归算法

public int fib1(int n){
    // 分类讨论 分成n<=1和n>1两种情况
    if(n <= 1)return n;
    return fib1(n - 1) + fib1(n - 2);
}

 复杂度分析

当我们的输入为5时

那么用大O表示法表示为O(2^n) 但是0.5*2^n - 1并不是适用于所有的输入 

当我们的输入为6时

 

 这个时候总的执行次数为2^(n - 1) - 7 也就是0.5*2^n - 7 所以用大O表示法表示为O(2^n)

非递归实现

public int fib2(int n){
    // 索引 0 1 2 3 4 5 6
    // 菲薄 0 1 1 2 3 5 8
    // 次数     1 2 3 4 5
    // 结论 运算次数 = 索引 - 1
    // 我们可以根据输入进行分类讨论
    if(n <= 1)return n;
    int first = 0;
    int second = 1;
    for(int i = 0; i < n - 1; i++){
        int sum = first + second;
        // 为两个变量重新赋值 但是切记两者顺序不能调换
        first = second;
        second = sum;
    }
    return second;
}

非递归优化实现

public int fib3(int n){
    // 这是斐波拉契数列非递归算法的优化实现 体现在了for循环循环体内部
    if(n <= 1)return n;
    int first = 0;
    int second = 1;
    while((n--) > 1){
        int sum = first + second;
        second += first;
        first = second - first;
    }
}

复杂度分析

未优化和优化后的算法的复杂度均为O(n)

递归算法和非递归算法的区别

对于递归算法而言:执行时间会随着输入的增大而增大 

对于非递归算法而言:执行时间则是一成不变 均为0

从这我们可以知道:算法的差距往往比硬件的差距更大 也就是说算法的差距往往可以弥补硬件之间的差距

LeetCode

推荐一个练习算法的好网站:

力扣

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

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

相关文章

【数据挖掘机器学习】招聘网站的职位招聘数据的分位数图、分位数-分位数图以及散点图、使用线性回归算法拟合散点图处理详解

文章目录一.本次需求背景二.职位招聘数据的分位数图、分位数-分位数图三.使用散点图、使用线性回归算法拟合散点图处理数据一.本次需求背景 本文主题&#xff1a;招聘网站的职位招聘数据的分位数图、分位数-分位数图以及散点图、使用线性回归算法拟合散点图处理详解 之前的文…

《Python多人游戏项目实战》第三节 在窗口上显示玩家ID以及对话内容

目录 3.1 显示不同的人物图片 3.2 显示玩家ID 3.3 显示玩家对话内容 3.4 完整代码下载地址 本节只是在上一节内容的基础上加一些小功能&#xff1a;显示不同的人物图片、在人物头顶上显示玩家ID以及人物头顶上显示一个聊天对话框。大家可以把这一节内容当做一个过渡&#x…

【OpenCV-Python】教程:6-2 Pose Estimation (姿态估计)

OpenCV Python Pose Estimation (姿态估计) 【目标】 利用calib3d模块在图像中创建一些3D效果。 【理论】 这是一小部分。在上一节中&#xff0c;已经找到了摄像机矩阵&#xff0c;失真系数等。给定一个图案图像&#xff0c;我们可以利用上面的信息来计算它的姿态&#xff…

【云原生进阶之容器】第一章Docker核心技术1.5.2节——cgroups原理剖析

2 cgroups原理解析 上面是说的cgroups 是内核提供的功能,但现在我们在用户空间想使用的是cgroup的功能。其原理是:linux 内核有一个很强大的模块叫做VFS(vritual File System),VFS 把具体的文件系统的细节隐藏起来,给用户态进程提供一个完备的文件系统API接口。linux 也是通…

昆仑万维重磅发布AIGC全系列算法与模型,领跑未来

2022年12月15日&#xff0c;昆仑万维在北京举行AIGC技术发布会&#xff0c;会上昆仑万维CEO方汉正式发布了「昆仑天工」AIGC全系列算法与模型&#xff0c;并宣布模型开源。「昆仑天工」旗下模型包括天工巧绘SkyPaint、天工乐府SkyMusic、天工妙笔SkyText、天工智码SkyCode&…

[附源码]Python计算机毕业设计高校学科竞赛报名系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

四、移动手机自动化测试

移动手机自动化测试4.1 Appium 介绍4.1.1 Appium 中的常用术语1. Session2. Desired Capabilities3. Appium Server4.1.2 Appium 服务关键字Appium 服务相关参数的说明4.1 Appium 介绍 Appium 是一个开源、跨平台的自动化测试工具&#xff0c;可以用来测试 Native 及混合的移动…

Web3中文|Reddit用户在Polygon上铸造了超500万个NFT

Reddit用户通过Collectible Avatars 计划&#xff0c;已经铸造了超过 500 万个NFT。 Reddit的NFT头像是在以太坊扩展网络Polygon上铸造的&#xff0c;大多数都是免费赠送给Reddit用户。 在NFT销量下滑和加密货币市场动荡的情况下&#xff0c;Reddit对NFT头像的推动是一个罕见…

Spring 之类元数据封装—MetadataReader

在 Spring 中最喜欢干的事情就是将多个参数封装到一个对象&#xff0c;这里就挑选一个例子讲讲——MetadataReader&#xff0c;这个对象是将一个类封装成了三部分&#xff1a;File 文件本身&#xff0c;类元数据&#xff0c;注解元数据。 MetadataReader 元数据对象 先看下这…

架构设计(四):CDN

架构设计&#xff08;四&#xff09;&#xff1a;CDN 作者&#xff1a;Grey 原文地址&#xff1a; 博客园&#xff1a;架构设计&#xff08;四&#xff09;&#xff1a;CDN CSDN&#xff1a;架构设计&#xff08;四&#xff09;&#xff1a;CDN CDN 全称 Content delivery…

Redis面试准备

1. redis网站 Redis Redis文档中心 -- Redis中国用户组&#xff08;CRUG&#xff09; 数据库排名网站&#xff1a;DB-Engines - Knowledge Base of Relational and NoSQL Database Management Systems 2. 基础知识 磁盘中的寻址速度是毫秒级&#xff0c;内存中寻址速度是纳…

[ vulhub漏洞复现篇 ] struts2远程代码执行漏洞s2-048(CVE-2017-9791)

一、漏洞编号 s2-048 CVE-2017-9791二、影响范围 Apache Struts 2.3.x系列中启用了struts2-struts1-plugin插件的版本三、漏洞描述 Apache Struts2 2.3.x 系列启用了struts2-struts1-plugin 插件并且存在 struts2-showcase 目录,其漏洞成因是当ActionMessage接收客户可控的参…

【论文精读】Focal Inverse Distance Transform Maps for Crowd Localization

文章目录摘要主要贡献主要内容一、FIDT二、LMDS三。I-SSIM loss摘要 在本文中&#xff0c;我们关注人群定位任务&#xff0c;这是人群分析的一个重要课题。基于回归的方法大多使用卷积神经网络( CNN )对密度图进行回归&#xff0c;在极度稠密的场景中无法准确定位实例&#xf…

跨境卖家如何以最少量的预算建立品牌知名度?

关键词&#xff1a;跨境卖家、品牌知名度 什么是品牌知名度&#xff1f; 品牌知名度反映了您的目标受众对您的品牌的了解、认可和记忆程度。 为什么品牌知名度至关重要&#xff1f; 当您的目标受众需要您提供的产品或服务时&#xff0c;您希望他们考虑您的品牌。为此&#xf…

windows下nginx隐藏HTTP 请求头文件中的Server信息

简介 本文主要是隐藏HTTP 请求头文件中的Server信息 解决问题主要分下面几步 一、准备编译所需要的环境 二、修改nginx源码改变配置 三、编译nginx源码生成新的nginx.exe 四、替换nginx.exe&#xff0c;重新启动nginx 1. 准备所需环境 环境都需要准备好&#xff0c;因为编译是…

精品spring boot+MySQL线上点餐系统vue

《spring bootMySQL线上点餐系统》该项目含有源码、论文等资料、配套开发软件、软件安装教程、项目发布教程等 使用技术&#xff1a; 操作系统&#xff1a;Windows 10、Windows 7、Windows 8 开发语言&#xff1a;Java 使用框架&#xff1a;spring boot 前端技术&#xff…

大数据毕业设计人体跌倒检测系统

文章目录前言1 实现方法传统机器视觉算法基于机器学习的跌倒检测SVM简介SVM跌倒检测原理算法流程算法效果实现代码深度学习跌倒检测最终效果网络原理最后前言 背景和意义 在美国&#xff0c;每年在65岁以上老人中&#xff0c;平均每3人中就有1人发生意外跌倒&#xff0c;每年…

[附源码]Node.js计算机毕业设计关于人脸识别的实验教学管理系统Express

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

嵌入式分享合集122

一、分析电容降压电路工作原理 电容降压电路&#xff0c;因其成本低廉、体积小而被广泛地使用&#xff0c;此一优点足以掩盖其它所有缺点&#xff1a;输出电流小&#xff08;一般控制在100mA以内&#xff09;&#xff0c;与市电直通非隔离而存在安全隐患&#xff0c;输出电压波…

饥荒服务器搭建(windows)

文章目录1. 获取服务器票据2. 新建游戏存档3. 饥荒服务器配置1. 获取服务器票据 步骤1&#xff1a;登录Klei官网 步骤2&#xff1a;点击菜单栏游戏——选择饥荒服务器 步骤3&#xff1a;创建服务器获取票据&#xff0c;后面将会用到。 2. 新建游戏存档 步骤1&#xff1a;下载…