数据结构初阶--算法复杂度(1)

以下我用C语言实现基础的数据结构。

目录

初识数据结构与算法

数据结构

算法

算法效率

练习:轮转数组(不完全版)

时间复杂度

大O的渐进表示法

例一: 

例二:

例三:

例四:

例五:

总结:

例六:

例七:

例八:阶乘递归的时间复杂度


初识数据结构与算法

数据结构

数据结构(Data Structure)是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素集合。如:线性表,树,图,哈希等。

  • 常见组织数据方式:增删查改。

算法

算法(Algorithm)定义良好的计算过程,取一个或一组的值为输入,并产生出一个或一组值作为输出。简单来说就是一系列的计算步骤,用来将输入数据转化成输出结果。

  • 输入:乱序数组
  • 输出:有序数组

算法有好坏之分--就看算法复杂度

提升数据结构与算法的方法:死磕、画图

算法效率

练习:轮转数组(不完全版)

对于给定的整数数组nums,将数组中的元素向右轮转k个位置,其中k是非负数。

#include <stdio.h>
void rotate(int* nums,int numsSize,int k)
{while(k--){int tmp=nums[numsSize-1];for(int i=numsSize-1;i>0;i--){nums[i]=nums[i-1];}nums[0]=tmp;}
}

算法在编写成可执行程序后,运行时需要消耗时间资源和空间(内存)资源。衡量一个算法的好坏,一般是从时间和空间两个维度来衡量的,即时间复杂度和空间复杂度。

  • 时间复杂度:衡量一个算法的运行快慢
  • 空间复杂度:衡量一个算法运行所需要的额外空间

时间复杂度

算法的时间复杂度是一个函数式T(N),而非具体的运行时间数字。它定量描述了该算法的运行时间。

括号中N指代变量,函数式可能为:T(N)=m+n。

这个T(N)函数计算了程序的执行次数。实际看的是循环语句,变量的单次定义可以忽略不计。衡量的是变量对算法效率结果的影响趋势

大O的渐进表示法

推导大O阶规则:

  • 时间复杂度函数式T(N)中,只保留高阶项,去掉低阶项。当N不断变大时,低阶项对结果影响越来越小,可以忽略不计。
  • 如果最高阶存在且不是1,就去掉这个项目的常数系数,当N不断变大,这个系数对结果影响越来越小,可以忽略不计。
  • T(N)中如果没有N相关项目,只有常数项,用1取代所有加法常数。

例一: 

void Func1(int N)
{int count = 0;int i=0;for(i=0;i<N;++i){int j;for(j=0;j<N;++j){++count;}}int k=0;for(k=0;k<2*N;++k){++count;}int  M = 10;while(_M--){++count;}
}

执行基本操作次数:T(N)=n^2+2*n+10,

根据公式,Func1的时间复杂度为:O(N^2)

例二:

void Func2(int N)
{int count = 0;int k=0;for(k=0;k<2*N;++k){++count;}int M = 10;while(_M--){++count;}
}

执行基本操作次数:T(N)=2*N+10

Func2时间复杂度为:O(N)

例三:

void Func3(int N,int M)
{int count = 0;int k=0;for(k=0;k<N;++k){++count;}for(k=0;k<N;++k){++count;}printf("%d\n",count);
}

执行基本操作次数:T(N)=M+N

类似Func3时间复杂度一般默认为:O(N+M)

但非要说也可以分为三种情况:

  • M==N  M>N   M<N: 那么T(N)=2M或者2N  所以O(M)/(N)
  • M>>N  那么N为低阶项即T(N)=M  所以O(M)
  • M<<N  那么M为低阶项即T(N)=N  所以O(N)

例四:

  1. void Func4(int N)
    {int count = 0;int k=0;for(k=0;k<100;++k){++count;}printf("%d\n",count);
    }

执行基本操作次数:T(N)=100

Func4时间复杂度为:O(1)

例五:

coust char *strchr(coust char * str,char character)
{coust char* p_begin=s;while(*p_begin != character){if(*p_begin =='\0'){return NULL;}p_begin++;}return p_begin;
}

执行基本操作次数:

  1. 要查找字符在第一个/前面位置,T(N)=1
  2. 在最后一个:T(N)=N
  3. 在中间:T(N)=N/2

Func5时间复杂度:

  1. 对应最好情况:O(1)
  2. 对应最坏情况:O(N)
  3. 对应平均情况:O(N)
总结:

一些算法的时间复杂度存在最坏、最好和最坏情况

最坏:任意输入规模的最大期望运行次数(上界)

最坏,任意输入规模的最小期望运行次数(下界)

平均,任意输入规模的期望运行次数

大O的渐进表示在实际中一般情况关注的是算法的上界,就是最坏运行情况。

例六:

冒泡排序:

void BubbleSort(int* a,int n)
{assert(a);size_t end;for(end = n;end>0;--end){int exchange=0;size_t i;for(i=1;i<end;++i){if(a[i-1]>a[i]){Swap(&a[i-1],&a[i]);exchange=1;}}if(exchange==0)break;}
}

执行基本操作次数:

  • 若数组有序:那么T(N)=N
  • 有序且降序T(N)=(N*N+1)/2
  • 在中间位置:T(N)=(N*(N+1))/2;

T(N) = (n-1)*(1+n-1)/2=n*n-n/2

时间复杂度:

O(N^2):O(n^2)

例七:

void func5(int n)
{int cnt = 1;while(cnt < n){cnt *= 2;}
}

执行基本操作次数:

T(N)=log₂n

时间复杂度:

O(log₂n)

其中关于对数的写法,有时候不像数学一样严谨。​​​​​​​log₂n可能会表示为​​​​​​​log₂n、​​​​​​​logn、​​​​​​​lgn

这一方面是因为在计算机中无法输入对数的底数,所以不规范,另一方面是n接近无穷大时,底数对时间复杂度影响不大

例八:阶乘递归的时间复杂度

long long Fac(size_t N)
{if(0 ==N)return 0;return Fac(N-1)*N;
}

递归算法的时间复杂度=单次递归的时间复杂度*递归次数

执行基本操作次数:

T(N)=N

时间复杂度:

O(N)

总执行时间=每条语句运行时间 * 执行次数

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C# 中LINQ的详细介绍

文章目录 前言一、 LINQ 的基本概念二、查询语法与方法语法三、LINQ 的投影操作四、LINQ 的排序操作五、LINQ 的过滤操作六、LINQ 的分组操作七、LINQ 的连接操作八、LINQ 的聚合操作九、LINQ 的延迟执行十、LINQ 的错误处理十一、LINQ 的合并操作十二、LINQ 的自定义对象查询十…

mongo开启慢日志及常用命令行操作、数据备份

mongo开启慢日志及常用命令行操作、数据备份 1.常用命令行操作2.mongo备份3.通过命令临时开启慢日志记录4.通过修改配置开启慢日志记录 1.常用命令行操作 连接命令行 格式&#xff1a;mongo -u用户名 -p密码 --host 主机地址 --port 端口号 库名&#xff1b; 如&#xff1a;连…

lyapunov指数的绘制

有如下方程&#xff1a; %% 方程式 % x(n1)1y(n)-a*x(n)^2 % y(n1)b*x(n)绘制其对应的lyapunov指数。 MATLAB实现方式&#xff1a; clc; clearvars; close all;%% 方程式 % x(n1)1y(n)-a*x(n)^2 % y(n1)b*x(n)%% 代码 N 1000; a (0:0.001:1.4); b 0.3; na length(a…

数字时代的文化宝库:存储技术与精神生活

文章目录 1. 文学经典的数字传承2. 音乐的无限可能3. 影视艺术的数字化存储4. 结语 数字时代的文化宝库&#xff1a;存储技术与精神生活 在数字化的浪潮中&#xff0c;存储技术如同一座桥梁&#xff0c;连接着过去与未来&#xff0c;承载着人类文明的瑰宝。随着存储容量的不断增…

关于csgo游戏搬砖作弊与封禁

关于csgo的游戏作弊与封禁 一.关于作弊 什么叫作弊&#xff1f; 1.换肤&#xff0c;换库存 2.各种参&#xff08;回溯&#xff0c;自瞄&#xff0c;透视&#xff0c;急停&#xff0c;连跳&#xff0c;假身&#xff0c;子弹跟踪等&#xff09; 3.某一部分更改游戏内存&…

Arduino IDE for mac 无法加载界面

打开软件后&#xff0c;无法加载界面的问题 1.手动删除“~/Library/Arduino15”文件夹 2.终端中输入sudo nano /etc/hosts&#xff0c;在里面添加“127.0.0.1 localhost”

Go的Gin比java的Springboot更加的开箱即用?

前言 隔壁组的云计算零零后女同事&#xff0c;后文简称 云女士 &#xff0c;非说 Go 的 Gin 框架比 Springboot 更加的开箱即用&#xff0c;我心想在 Java 里面 Springboot 已经打遍天下无敌手&#xff0c;这份底蕴岂是 Gin 能比。 但是云女士突出一个执拗&#xff0c;非我要…

使用国内镜像源加速Qt“更新/安装”的方法

QT更新/安装时&#xff0c;国外源下载很慢&#xff0c;国内镜像源也因网络环境的不同而速度各异&#xff0c;下文给出国内镜像源的配置方法。 一、命令行 1、切换对应目录&#xff0c;更新器默认目录是 C:\Qt 2、文件名镜像源 安装示例&#xff1a; .\qt-unified-windows-x…

Hbase整合Mapreduce案例2 hbase数据下载至hdfs中——wordcount

目录 整合结构准备数据下载pom.xmlMain.javaReduce.javaMap.java操作 总结 整合结构 和案例1的结构差不多&#xff0c;Hbase移动到开头&#xff0c;后面跟随MR程序。 因此对于输入的K1 V1会进行一定的修改 准备 在HBASE中创建表&#xff0c;并写入数据 create "wunaii…

python 装饰器学习与实践

目录 装饰器学习1、最基本装饰器2、函数带参数的装饰器3、装饰器带参数4、类中函数的装饰器5、装饰器实践6、pyqt5类中方法的装饰器实现时遇到的问题 装饰器学习 先假定一个场景 在之前的一篇文章中&#xff0c;分享了一个pyqt5将日志实时展示在gui界面上的功能python在pyqt5l…

OCR的评价指标和常用数据集

1.OCR任务简介 OCR(Optical Character Recognition,光学字符识别)是指对包含文本内容的图像或者视频进行处理识别&#xff0c;并提取其中所包含的文字及排版信息的过程。例如&#xff0c;一个常见的应用是将包含文档图像的不可编辑状态的 PDF 文档通过 OCR 技术识别后&#xf…

解决el-select数据量过大的3种方法

在准备上线的后台管理系统中&#xff0c;我们发现有两个下拉框&#xff08;select&#xff09;&#xff0c;其选项数据量超过 1 万条&#xff0c;而在测试环境中这些数据量只有几百条。这导致在页面加载时&#xff0c;浏览器性能出现瓶颈&#xff0c;页面卡顿甚至崩溃。 想了一…

计算机网络 第5章 运输层

计算机网络 &#xff08;第8版&#xff09; 第 5 章 传输层5.4 可靠传输的原理5.4.1 停止等待协议5.4.2 连续ARQ协议 5.5 TCP报文段的首部格式5.6 TCP可靠传输的实现5.6.1 以字节为单位的滑动窗口5.6.2 超时重传时间的选择 5.7 TCP的流量控制5.7.1 利用滑动窗口实现流量控制 5.…

【PyTorch】(基础三)---- 图像读取和展示

图像读取和展示 pytorch本身并不提供图像的读取和展示功能&#xff0c;利用pytorch执行计算机视觉任务的时候&#xff0c;通常是利用opencv等工具先进行图像处理&#xff0c;然后将结果转化成tensor类型传递给pytorch&#xff0c;在pytorch执行之后&#xff0c;也可以将tensor…

Java课程设计项目-servlet+jsp美食系统、菜品管理系统

文章目录 Java课程设计项目-servletjsp美食系统一、项目介绍二、技术介绍2.1 环境需要2.2 技术栈 环境需要三、功能实现3.1登录注册3.2首页菜品展示、轮播图3.3美食菜品分类、查询3.4作品动态、个人简介、菜品收藏3.5创建菜谱、添加步骤 四、系统代码展示4.1项目架构&#xff0…

使用Unity脚本模拟绳索、布料(碰撞)

效果演示&#xff1a; 脚本如下&#xff1a; using System.Collections; using System.Collections.Generic; using UnityEngine;namespace PhysicsLab {public class RopeSolver : MonoBehaviour {public Transform ParticlePrefab;public int Count 3;public int Space 1;…

Python 【图像分类】之 PyTorch 进行猫狗分类功能的实现(Swanlab训练可视化/ Gradio 实现猫狗分类 Demo)

Python 【图像分类】之 PyTorch 进行猫狗分类功能的实现(Swanlab训练可视化/ Gradio 实现猫狗分类 Demo) 目录 Python 【图像分类】之 PyTorch 进行猫狗分类功能的实现(Swanlab训练可视化/ Gradio 实现猫狗分类 Demo) 一、简单介绍 二、PyTorch 三、CNN 1、神经网络 2、卷…

【Python网络爬虫笔记】8- (BeautifulSoup)抓取电影天堂2024年最新电影,并保存所有电影名称和链接

目录 一. BeautifulSoup的作用二. 核心方法介绍2.1 构造函数2.2 find()方法2.3 find_all()方法2.4 select()方法 三. 网络爬虫中使用BeautifulSoup四、案例爬取结果 一. BeautifulSoup的作用 解析HTML/XML文档&#xff1a;它可以将复杂的HTML或XML文本转换为易于操作的树形结构…

ZLMediaKit+wvp (ffmpeg+obs)推拉流测试

这里使用了两种方式: ffmpeg命令和 OBS OBS推流在网上找了些基本没有说明白的, 在ZLMediaKit的issues中看到了一个好大哥的提问在此记录一下 使用OBS推流&#xff0c;rtmp&#xff0c;报鉴权失败 推流 1. ffmpeg命令推流 官方说明文档地址: 推流规则 rtsp://192.168.1.4:10554…

Linux入门攻坚——40、Linux集群系统入门-lvs(1)

Cluster&#xff0c;集群&#xff0c;为了解决某个特定问题将多台计算机组合起来形成的单个系统。 这个单个集群系统可以扩展&#xff0c;系统扩展的方式&#xff1a;scale up&#xff0c;向上扩展&#xff0c;更换更好的主机&#xff1b;scale out&#xff0c;向外扩展&…