数据结构---算法的时间复杂度

文章目录

  • 前言
  • 计算机重要存储
    • 数据结构与算法
      • 数据结构概念
      • 算法
    • 数据库
      • 概念
  • 算法的复杂度
  • 时间复杂度
    • 概念
    • 为什么有时间复杂度
    • 大O渐进表示法
    • 时间复杂度实例
      • 实例1:时间复杂度:O(N)
      • 实例2:这里输入参数是不确定的所以 时间复杂度为O(M+N)

前言

计算机重要存储

  • 重要存储分为俩种:内存硬盘

数据结构与算法

数据结构概念

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

*简述
对内存进行数据管理

算法

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

简述

对数据进行处理

数据库

概念

*简述
对硬盘进行数据管理

算法的复杂度

算法在编写成可执行程序后,运行时需要耗费时间资源和空间(内存)资源。
因此衡量一个算法的好坏,一般是从时间和空间两个维度来衡量的,即时间复杂度和空间复杂度。时间复杂度主要衡量一个算法的运行快慢,而空间复杂度主要衡量一个算法运行所需要的额外空间。在计算机发展的早期,计算机的存储容量很小。所以对空间复杂度很是在乎。但是经过计算机行业的迅速发展,计算机的存储容量已经达到了很高的程度。所以我们如今已经不需要再特别关注一个算法的空间复杂度。

时间复杂度

概念

时间复杂度的定义:在计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。一个算法执行所耗费的时间,从理论上说,是不能算出来的,只有你把你的程序放在机器上跑起来,才能知道。但是我们需要每个算法都上机测试吗?是可以都上机测试,但是这很麻烦,所以才有了时间复杂度这个分析方式。一个算法所花费的时间与其中语句的执行次数成正比例,算法中的基本操作的执行次数,为算法的时间复杂度。

即:找到某条基本语句与问题规模N之间的数学表达式,就是算出了该算法的时间复杂度

为什么有时间复杂度

时间复杂度能让我们了解当前思路的执行程序次数。 当一个问题拥有几个解决的思路算出解决思路的时间复杂度,可知最优的解决思路

大O渐进表示法

大O渐进表示法:

是用于描述函数渐进行为的数学符号。
估算出来的时间复杂度
推导大O阶方法:
1、用常数1取代运行时间中的所有加法常数。
2、在修改后的运行次数函数中,只保留最高阶项。
3、如果最高阶项存在且不是1,则去除与这个项目相乘的常数。得到的结果就是大O阶。

有些时间复杂度分为多种情况:例如: 最好 - 平均 - 最坏

能让算法的时间复杂度在预估计的执行范围内

时间复杂度实例

实例1:时间复杂度:O(N)

// 计算Func2的时间复杂度?
void Func2(int N)
{
 int count = 0;
 for (int k = 0; k < 2 * N ; ++ k) 这里执行2N次
 {
 ++count;
 }
 int M = 10;
 while (M--) 执行10{
 ++count;
 }
 printf("%d\n", count);
}

实例2:这里输入参数是不确定的所以 时间复杂度为O(M+N)

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

实例3:输入参数与执行次数无关 执行常数次 所以是 O(1)

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

实例4
这里从一个字符串中寻找一个字符 寻找的情况分为
最好:1-前几个找到
平均:在中间前后范围找到
最坏:最后一找到 or 没有找到
时间复杂度取最坏情况:所以是O(N)

// 计算strchr的时间复杂度?
const char * strchr ( const char * str, int character );
{
	while(*str)
	{
		if(*str==character)
			return str;
		else
			++str;
	}
	
}

实例5:
计算时间复杂度最好是按思路计算 数循环不能正确算出所有的时间复杂度
排序:将数据按升序或降序排列
冒泡排序的思想:一组数据 从第一个和第二个比较,按升序排列如果后一个小于前一个交换数值,否则不交换,接着第二个和第三个比较,直至比较到最后一个和前一个相比较,最后最大值交换到最后一项,下一趟只需比较到最后一项的前一个选出次大的。
第一次的执行次数为n-1次,因为一次俩俩比较,比较到最后
例如俩俩比较一共5个数据,执行总数据个数-1次
下一趟选出次大的,执行总数据-2次
一直到不足两个数据结束。
在这里插入图片描述

((1+n-1)*(n-1))/2 时间复杂度:O(N^2)

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

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

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

相关文章

期货开平规则(期货交易开平规则解析)

什么是期货开平规则 期货开平规则&#xff0c;简单来说是指期货交易中的开仓和平仓所遵循的一系列规定。具体而言&#xff0c;开仓是指买入或卖出期货合约&#xff0c;建立一个新的持仓&#xff1b;平仓则是指买入或卖出相应数量的期货合约&#xff0c;用以解除原有持仓。开平…

MapReduce编程:Join应用

1. Reduce Join Map 端的主要工作&#xff1a;为来自不同表或文件的 key/value 对&#xff0c;打标签以区别不同来源的记录。然后用连接字段作为key &#xff0c;其余部分和新加的标志作为 value &#xff0c;最后进行输出。 Reduce 端的主要工作&#xff1a;在 Reduce 端…

解决IDEA编译/启动报错:Abnormal build process termination

报错信息 报错信息如下&#xff1a; Abnormal build process termination: "D:\Software\Java\jdk\bin\java" -Xmx3048m -Djava.awt.headlesstrue -Djava.endorsed.dirs\"\" -Djdt.compiler.useSingleThreadtrue -Dpreload.project.path………………很纳…

Mybatis之增删改查

一、引言 书接上回&#xff0c;我们在了解完mybatis之后&#xff0c;肯定要知道怎么使用&#xff0c;本文就来详细讲解Mybatis的增删改查事务&#xff0c;还不了解怎么配置mybatis的童鞋可以去这篇文章了解一下通俗易懂讲解javaweb之mybatis-CSDN博客 二、Mybatis——增 举例…

RK3568驱动指南|第八篇 设备树插件-第77章 注册group容器实验

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…

高校/企业如何去做数据挖掘呢?

随着近年来人工智能及大数据、云计算进入爆发时期&#xff0c;依托三者进行的数据分析、数据挖掘服务已逐渐成为各行业进行产业升级的载体&#xff0c;缓慢渗透进我们的工作和生活&#xff0c;成为新时代升级版的智能“大案牍术”。 那么对于多数企业来说&#xff0c;如何做数据…

MyBatis:动态 SQL 标签

MyBatis 动态 SQL 标签if 标签where 标签trim 标签choose 、when 、otherwise 标签foreach 标签附 动态 SQL 标签 MyBatis 动态 SQL 标签&#xff0c;是一组预定义的标签&#xff0c;用于构建动态的 SQL 语句&#xff0c;允许在 SQL 语句中使用条件、循环和迭代等逻辑。通过使…

Java代码审计Mybatis注入文件上传下载读取(非常详细!!)

目录 0x00 前言 0x01 Mybatis注入审计 - 若依&#xff08;Ruoyi&#xff09;后台管理系统 4.6.0 1、项目介绍与部署 - Ruoyi 2、若依 Ruoyi - Mybatis注入 - 代码审计 3、代审常搜词 - Java SQL 注入 0x02 文件上传漏洞审计 - Inxedu && Tmall 1、项目介绍与部署…

UE4移动端最小包优化实践

移动端对于包大小有着严苛的要求,然而UE哪怕是一个空工程打出来也有90+M,本文以一个复杂的工程为例,探索怎么把包大小降低到最小。 一、工程简介 工程包含代码、插件、资源、iOS原生库工程。 二、按官方文档进行基础优化 官方文档 1、勾选Use Pak File和Create comp…

linux buffer的回写的触发链路

mark_buffer_dirty中除了会标记dirty到buffer_head->state、page.flag、folio->mapping->i_pages外&#xff0c;还会调用inode所在文件系统的dirty方法&#xff08;inode->i_sb->s_op->dirty_inode&#xff09;。然后为inode创建一个它所在memory group的wri…

Moonbeam生态项目分析 — — 游戏项目The Great Escape

概览 The Great Escape是一款2D的Play and Earn平台游戏&#xff0c;曾入选MoonbeamMoonbeam Accelerator&#xff0c;并经此培训孵化后于2023年7月正式发表。 玩家必须在给定时间内在充满敌人和陷阱的关卡中收集尽可能多的水果。游戏结束后&#xff0c;游戏主要根据收集的水…

SpringSecurity深度解析与实践(2)

目录 引言1.Springboot结合SpringSecurity用户认证流程1.1 配置pom文件1.2.配置application.yml 2.自定义MD5加密3.BCryptPasswordEncoder密码编码器4.RememberMe记住我的实现5.CSRF防御5.1.什么是CSRF 引言 上篇网址 1.Springboot结合SpringSecurity用户认证流程 1.1 配置p…

大开关与计算机技术

大开关与计算机技术 一、引言 随着科技的飞速发展&#xff0c;计算机技术已经成为了我们生活中不可或缺的一部分。在这个信息化的时代&#xff0c;大开关作为计算机硬件中的重要组成部分&#xff0c;发挥着至关重要的作用。本文将详细介绍大开关的基本概念、原理以及在计算机…

利用Matplotlib画简单的线形图

实验题目&#xff1a;简单的线形图 实验目的&#xff1a;利用Matplotlib画简单的线形图 实验环境&#xff1a;海豚大数据和人工智能实验室&#xff0c;使用的Python库 名称 版本 简介 numpy 1.16.0 线性代数 Pandas 0.25.0 数据分析 Matplotlib 3.1.0 数据可视化 …

CMake项目管理

背景 目前看到很过很多框架&#xff0c;很好奇大家如何从头搭建一个C的库&#xff0c;这里简单介绍一个基本模板. 参考&#xff1a;https://zhuanlan.zhihu.com/p/631257434 目录组织 假如项目名称叫project&#xff0c; 一般可以按照下面的方式组织代码&#xff0c;这里可以…

深入浅出堆排序: 高效算法背后的原理与性能

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《linux深造日志》 《高效算法》 ⛺️生活的理想&#xff0c;就是为了理想的生活! &#x1f4cb; 前言 &#x1f308;堆排序一个基于二叉堆数据结构的排序算法&#xff0c;其稳定性和排序效率在八大排序中也…

浏览器开发者工具(Developer Tools)详解

作为一名前端开发人员&#xff0c;熟练应用浏览器开发工具很重要。笔者在这方面的知识未成体系&#xff0c;最近在跟着chorme官方文档学习&#xff0c;于是整理了本文&#xff0c;如有不足&#xff0c;欢迎指正。 目录 1.elements(元素) 2.console(控制台) 3.sources(源代码…

逻辑斯蒂回归-建模概率计算(鸢尾花)

导入的数据说明 因为气候不同&#xff0c;造就性不同&#xff0c;统计鸢尾花的关键特征数据&#xff1a;花萼长度、花萼宽度、花瓣长度&#xff0c;花瓣宽度 植物学家划分&#xff1a; setosa(中文名&#xff1a;山鸢尾) versicolor(中文名&#xff1a;杂色鸢尾) virginica(中…

React学习计划-React16--React基础(三)收集表单数据、高阶函数柯里化、类的复习

1. 收集表单数据 包含表单的组件分类 受控组件——页面中所有输入类的DOM,随着输入&#xff0c;把值存维护在状态里&#xff0c;需要用的时候去状态里取值&#xff08;推荐&#xff0c;避免了过渡使用ref&#xff09;非受控组件——页面中所有输入类的DOM&#xff0c;现用现取…

高级算法设计与分析(五) -- 回溯法

系列文章目录 高级算法设计与分析&#xff08;一&#xff09; -- 算法引论 高级算法设计与分析&#xff08;二&#xff09; -- 递归与分治策略 高级算法设计与分析&#xff08;三&#xff09; -- 动态规划 高级算法设计与分析&#xff08;四&#xff09; -- 贪心算法 高级…