数据结构复杂度

news2024/9/22 17:34:35

文章目录

  • 一. 数据结构前言
    • 1.1 数据结构
    • 1.2 算法
  • 二. 算法效率
    • 2.1 时间复杂度
      • 2.1.1 T(N)函数式
      • 2.1.2 大O的渐进表示法

一. 数据结构前言

1.1 数据结构

什么是数据结构呢?打开一个人的主页,有很多视频,这是数据(杂乱无章)。从上到下按照顺序整齐排列,这是在管理这些视频,即结构。

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

没有一种单一的数据结构对所有用途都有用,所以我们要学各式各样的数据结构,如:线性表、树、图、哈希等

1.2 算法

对数据进行 增删查改 就是计算,算法就是定义良好的计算过程

数据结构和算法不分家。数据结构是载体,算法是工具(让我们可以更好地从载体里面取数据)

二. 算法效率

在下面的案例中,运行(调试)成功,但是提交失败了。失败原因是:超出时间限制。这就涉及到效率问题了。

在这里插入图片描述

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

时间复杂度主要衡量一个算法的运行快慢,而空间复杂度主要衡量一个算法运行所需要的额外空间。(现在不太关注空间复杂度,因为如今的计算机储存容量很高)

2.1 时间复杂度

2.1.1 T(N)函数式

定义:在计算机科学中,算法的时间复杂度是一个函数式T(N),它定量描述了该算法的运行时间。

那为什么不能直接计算程序的运行时间,而要用时间复杂度来衡量程序的时间效率呢?

1.因为程序运行时间和编译环境 ,运行机器的配置都有关系,
(1)同一个算法程序,老编译器和新编译器都进行编译,在同样机器下运行时间不同;同一个算法程序,用一个低配置机器和高配置机器,运行时间也不同。

2.时间只能程序写好后测试,不能在写程序之前,通过理论思想计算评估。

T(N)函数式是用来计算程序的执行次数,假设每句指令执行时间基本一样,那么执行次数和运行时间(总时间)成等比正相关。这样就可以脱离具体的编译运行环境,使得执行次数就可以代表程序时间效率的优劣。

例一:
在这里插入图片描述
总共执行了T(N)=N ^ 2+2N+10次。

2.1.2 大O的渐进表示法

大O符号(Big O notation):是用于描述 函数渐进 行为的数学符号。

推导大O阶规则

1.时间复杂度函数T(N)中,只保留最高阶项。(当N趋近于无穷时,低阶项影响很小)
2.如果最高阶不是常数,则去掉最高阶的系数。(当N趋近于无穷时,系数影响很小)
3.如果T(N)中只有常数项,则用常数1取代所有加法常数。O(1)

根据上面的规则,例一的时间复杂度是O(1)。

例二:
在这里插入图片描述

在这里插入图片描述
1)若要查找的字符在字符串第一个位置,则:T (N) = 1
2)若要查找的字符在字符串最后一个位置,则:T (N) = N
3)若要查找的字符在字符串第一个中间位置,则:T (N) = 1/2N [去掉系数]

所以,strchr的时间复杂度分为:最好的情况O(1),中间的情况O(N),最坏的情况O(2)

例三:

在这里插入图片描述
T(N)=100,如果T(N)中只有常数项,则用常数1取代所有加法常数,所以Func2的时间复杂度为: O(1)。

在这里插入图片描述
例四:

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

在这里插入图片描述

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

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

相关文章

了解k8s架构,搭建k8s集群

kubernetes 概述 Kubernetes 集群图例 安装控制节点 安装网络插件 安装 calico 安装计算节点 2、node 安装 查看集群状态 kubectl get nodes # 验证容器工作状态 [rootmaster ~]# kubectl -n kube-system get pods

【学习笔记】:Maven初级

一、Maven简介 1、为什么需要maven Maven是一个依赖管理工具,解决如下问题: 项目依赖jar包多jar包来源、版本问题jar包导入问题jar包之间的依赖Maven是一个构建工具: 脱离IDE环境的项目构建操作,需要专门的工具2、Maven介绍 https://maven.apache.org/what-is-maven.htm…

代码随想录算法训练营第44天|LeetCode 1143.最长公共子序列、1035.不相交的线、53. 最大子序和、392.判断子序列

1. LeetCode 1143.最长公共子序列 题目链接&#xff1a;https://leetcode.cn/problems/longest-common-subsequence/description/ 文章链接&#xff1a;https://programmercarl.com/1143.最长公共子序列.html 视频链接&#xff1a;https://www.bilibili.com/video/BV1ye4y1L7CQ…

苹果离线打包机配置和打包

1、虚拟机安装 macOS虚拟机安装全过程&#xff08;VMware&#xff09;-腾讯云开发者社区-腾讯云 给 windows 虚拟机装个 mac 雪之梦 1、安装苹果镜像 去网上下载&#xff0c;打包机的镜像要和自己mac电脑上的保持一致。 同时打包机的用户名也需要和自己的mac保持一致。 2、…

云原生专题-k8s基础系列-k8s-namespaces详解

获取所有的pod实例&#xff1a; k8s中&#xff0c;命名空间&#xff08;Namespace&#xff09;提供一种机制&#xff0c;将同一集群中的资源划分为相互隔离的组。同一命名空间内的资源名称要唯一&#xff0c;命名空间是用来隔离资源的&#xff0c;不隔离网络。 https://kubern…

Kafka 实战使用、单机搭建、集群搭建、Kraft集群搭建

文章目录 实验环境单机服务启动停止服务简单收发消息其他消费模式理解Kakfa的消息传递机制 集群服务为什么要使用集群部署Zookeeper集群部署Kafka集群理解服务端的Topic、Partition和Broker总结 Kraft集群相关概念 实验环境 准备三台虚拟机 三台机器均预装CentOS7 操作系统。…

探索Transformer中的多头注意力机制:如何利用GPU并发

什么是多头注意力机制&#xff1f; 首先&#xff0c;什么是多头注意力机制&#xff1f;简单来说&#xff0c;它是Transformer模型的核心组件之一。它通过并行计算多个注意力头&#xff08;attention heads&#xff09;&#xff0c;使模型能够从不同的表示子空间中捕捉不同的特…

Oracle服务器windows操作系统升级出现计算机名称改变导致数据库无法正常连接

1.数据库莫名奇妙无法正常连接&#xff0c;经排查是主机名称改变&#xff0c;导致oracle无法正常运行 如何查看ORACLE主机名称及路径&#xff1a;需要修改 listener 和 tnsnames的配置的主机名 2.修改tnsnames配置的主机名称&#xff0c;HOST主机名称 3.修改listener中的主机…

【案例36】Apache未指向新的openssl

客户发现apache报openssl相关漏洞&#xff0c;于是升级了操作系统的openssl组件。但再次漏扫发现相关版本依旧显示openssl的版本为&#xff1a;1.0.2k。怀疑升级的有问题。 问题分析 查看libssl.so.10指向的是/lib64.so.10 ldd mod_ssl.so libssl.so.10指向的是openssl1.0.2k…

【实际案例】服务器宕机情况分析及处理建议

了解银河麒麟操作系统更多全新产品&#xff0c;请点击访问麒麟软件产品专区&#xff1a;https://product.kylinos.cn 服务器环境以及配置 物理机/虚拟机/云/容器 物理机 外网/私有网络/无网络 私有网络 处理器&#xff1a; Kunpeng 920 内存&#xff1a; 4 TiB BIOS版…

【JVM基础18】——实践-Java内存泄漏排查思路?

目录 1- 引言&#xff1a;2- ⭐核心&#xff1a;2-1 排查思路2-2 步骤1&#xff1a;获取堆内存快照 dump2-3 步骤2、3&#xff1a;使用 VisualVM 打开 dump文件 3- 小结&#xff1a;3-1 Java内存泄漏排查思路&#xff1f; 1- 引言&#xff1a; 首先得明确哪里会产生内存泄漏的…

Solidworks API利用C# 实现物体的运动与碰撞检测

详情见github连接 SolidWorks-API-Collision-Detection Use SolidWorks API to MovePart and Collision Detection 利用solidworks的API来移动控件物体以及进行碰撞检测 visual studio 2022 利用Nuget 安装这些库 打开solidworks 可以看到有两个控件 部件运动 使用封装的函…

嵌入式初学-C语言-十七

#接嵌入式初学-C语言-十六# 函数的递归调用 含义&#xff1a; 在一个函数中直接或者间接调用了函数本身&#xff0c;称之为函数的递归调用 // 直接调用a()->a(); // 间接调用a()->b()->a();a()->b()->..->a();递归调用的本质&#xff1a; 本是是一种循环…

深入理解Spring的三级缓存机制

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

Ubuntu(20.04 LTS)更换镜像源

此换镜像源方法只适用x86_64架构的系统&#xff0c;其他架构的系统参考ubuntu-ports的方法 1、备份文件 sudo mv /etc/apt/sources.list /etc/apt/sources.list.bk2、创建新文件 sudo vi /etc/apt/sources.list根据自己系统版本选择下面对应的镜像源添加到新文件中&#xf…

智能指针--

智能指针简介 头文件&分类 智能指针都在memory中&#xff0c; 有auto_ptr, unique_ptr, shared_ptr, weak_ptr 智能指针发展史 C&#xff0b;&#xff0b;98就有智能指针了&#xff08;auto_ptr&#xff09; c&#xff0b;&#xff0b;11前&#xff0c;智能指针主要靠bo…

FPGA开发——在Quartus中实现对IP核的PLL调用

一、简介 PLL主要由鉴相器&#xff08;PD&#xff09;、环路滤波器&#xff08;LF&#xff09;和压控振荡器&#xff08;VCO&#xff09;三部分组成。鉴相器检测输入信号与VCO输出信号的相位差&#xff0c;并输出一个与相位差成正比的电压信号。该信号经过环路滤波器滤除高频噪…

esp32学习笔记

前言&#xff1a;学习视频链接放在最后&#xff0c;开发方式为esp32Arduino&#xff0c;使用型号为ESP32-WROOM-32&#xff0c;引脚功能分配图如下。 #esp32介绍 GPIO的引脚默认情况下&#xff0c;只能当做普通功能引脚使用&#xff0c;也就是只能输入&#xff0c;输出&#x…

git 常用指令(创建分支、提交分支、解决冲突)

1. 初始化git 将你的代码放入你创建的文件中&#xff0c;执行 git init(前提你电脑安装过git哈)2. 查看当前项目git 状态 git status 3. 将代码添加到暂存区 git add . &#xff08;提交所有修改的代码&#xff0c;如果向指定提交使用&#xff1a;git add <文件名>&am…

SQL语句创建数据库(增删查改)

SQL语句 一.数据库的基础1.1 什么是数据库1.2 基本使用1.2.1 连接服务器1.2.2 使用案例 1.2 SQL分类 二.库的操作2.1 创建数据库2.2 创建数据库示例2.3 字符集和校验规则2.3.1 查看系统默认字符集以及校验规则2.3.2查看数据库支持的字符集2.3.3查看数据库支持的字符集校验规则2…