【数据结构】复杂度(长期维护)

news2025/1/16 0:26:41

本篇博客主要是浅谈数据结构概念及时间复杂度,并做长期的维护更新,有需要借鉴即可。

复杂度目录

  • 一、初识数据结构
    • 1.基础概念
    • 2.如何学好数据结构
  • 二、复杂度
    • 1.复杂度
    • 2.时间复杂度
      • ①有限数的时间复杂度
      • ②函数的时间复杂度
      • ③二分查找时间复杂度
      • ④递归
      • 拓展练习题1:消失的数字:[LINK](https://leetcode.cn/problems/missing-number-lcci/description/)
    • 3.空间复杂度
      • 拓展练习题2:旋转数组

一、初识数据结构

1.基础概念

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

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

在内存与磁盘中管理数据的区别:
在内存中,

  • 数据存储速度比较快(相对磁盘而言)
  • 属于带点存储类型

相对应的,在磁盘中,

  • 数据存储速度比较慢(相对内存而言)
  • 属于不带点存储类型。

思考:带电与不带电存储对存储的影响是什么?
答:存储寿命
如果是需要带电存储,那么就需要不断电,那么也就意味这文件内容不能永久性存储;相应的,如果可以脱离电量进行存储,那么就可以永久性存储在硬件中(这里不考虑硬件寿命问题)。

2.如何学好数据结构

  • 画图
    在这里插入图片描述
  • 代码练习与思考
    在这里插入图片描述

二、复杂度

1.复杂度

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

元素个数的逐渐增大,复杂度的差异逐渐明显
在这里插入图片描述
复杂度包括两个方面:

  • 时间复杂度
  • 空间复杂度

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

  1. 用常数1取代运行时间中的所有加法常数。
  2. 在修改后的运行次数函数中,只保留最高阶项。
  3. 如果最高阶项存在且不是1,则去除与这个项目相乘的常数。得到的结果就是大O阶。
  4. 在实际中一般情况关注的是算法的最坏运行情况。

复杂度的意义何在?
用来衡量/决策比较某一种/多种实现方法的优劣
复杂度是准确的吗?
复杂度是粗略估计,对算法进行大致分“阶级”

2.时间复杂度

算法中的基本操作的执行次数,为算法的时间复杂度。

举例:

①有限数的时间复杂度

在这里插入图片描述

②函数的时间复杂度

在这里插入图片描述
注strchr:LINK

③二分查找时间复杂度

在这里插入图片描述
时间复杂度:O(logN)

④递归

在这里插入图片描述



在这里插入图片描述
在这里插入图片描述

拓展练习题1:消失的数字:LINK

在这里插入图片描述

在这里插入图片描述

int missingNumber(int* nums, int numsSize){

// //思路二:先加起来然后减去,即可得到消失的数字
// int i = 0;
// int lose = 0;
// int sum = 0;
// //加上0到numsSize全部的数字
// for(i = 0;i<numsSize+1;i++)
// {
//     sum+=i;
// }
// //减去原数组0到numsSize的数字
// for(i = 0;i<numsSize;i++)
// {
//     sum-=nums[i];
// }
// //得到消失的数字
// lose = sum;
// return lose;

//思路三:异或操作
int i = 0;
int lose = 0;
//异或正常的数组
for(i = 0;i<numsSize+1;i++)
{
    lose^=i;
}
//异或原来的数组
for(i = 0;i<numsSize;i++)
{
    lose^=nums[i];
}
//返回
return lose;
}

3.空间复杂度

为了实现某个功能额外开辟的空间。

需要注意的是:时间一去不复返,但是空间可以重复利用滴。

拓展练习题2:旋转数组

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>

//旋转数组
void printArray(int arr[],int length)
{
	for (int i = 0; i < length; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
}

//1.暴力求解
void test1(int arr[],int length,int k)
{
	while (k--)
	{
		int temp = arr[length - 1];
		for (int i = length -1-1; i >= 0; i--)
		{
			arr[i+1] = arr[i];
		}
		arr[0] = temp;
	}
	printArray(arr, length);
}

void Swap(int arr[],int start,int end)
{
	while (start < end)
	{
		int temp = arr[start];
		arr[start] = arr[end];
		arr[end] = temp;
		start++;
		end--;
	}

}
//2.逆置法
void test2(int arr[], int length, int k)
{
	//1.首先逆置后半部分
	Swap(arr,length-k, length-1);
	printArray(arr, length);

	//2.其次逆置前半部分
	Swap(arr, 0, length - k - 1);
	printArray(arr, length);

	//3.整个数组进行逆置
	Swap(arr, 0, length - 1);

	printArray(arr, length);
}


//3.空间换时间方法
void test3(int arr[], int length, int k)
{
	//开辟空间
	int* temp = (int*)malloc(sizeof(int) * length);
	if (temp == NULL)
	{
		perror("malloc fail");
		exit(-1);
	}
	
	//拷贝值到新数组中去
	for (int i = 0,j = k; i <= length - k - 1; i++,j++)
	{
		temp[j] = arr[i];
	}
	for (int i = length - k, j = 0; i <= length - 1; i++, j++)
	{
		temp[j] = arr[i];
	}

	//拷贝回去
	for (int i = 0; i < length; i++)
	{
		arr[i] = temp[i];
	}

	printArray(arr, length);
}

int main()
{
	int k = 3;
	int arr[] = { 1,2,3,4,5,6,7 };
	//test1(arr, sizeof(arr) / sizeof(int), k);
	//test2(arr, sizeof(arr) / sizeof(int), k);
	test3(arr, sizeof(arr) / sizeof(int), k);
	return 0;
}

EOF

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

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

相关文章

1.k8s架构

k8s集群架构 一个Kubernetes集群至少包含一个控制平面(control plane)&#xff0c;以及一个或多个工作节点(worker node)。控制平面(Control Plane) : 控制平面负责管理工作节点和维护集群状态。所有任务分配都来自于控制平面。工作节点(Worker Node) : 工作节点负责执行由控制…

Selenium的简单防反爬和浏览器配置

# Selenium的简单使用&#xff1a;https://zhuanlan.zhihu.com/p/557463669 # 防反爬参考&#xff1a;https://blog.csdn.net/weixin_51368459/article/details/125462178 from selenium import webdriver from selenium.webdriver.edge.options import Options# 设置浏览器驱动…

Linux初学(十四)LampLnmp

一、简介 LAMP和LNMP是两种常见的web服务器组合。具体如下&#xff1a; LAMP&#xff1a;LAMP代表的是Linux&#xff08;操作系统&#xff09; Apache&#xff08;HTTP服务器&#xff09; MySQL&#xff08;数据库&#xff09; PHP&#xff08;编程语言&#xff09;。这个组合被…

基于Spring Boot的职称评审管理系统

基于Spring Boot的职称评审管理系统 开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/idea 部分系统展示 前台首页界面 用户注册登录界面 管理员登录界面 个人中心界面…

【Canvas技法】图解绘制圆弧的重要函数 arc(x,y,r,startAngle,endAngle,clockWise)

【一图释疑】 【绘制上图用代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>Html5/Canvas中绘制圆弧的重要函数 arc(x,y,r,startA…

Datacom HCIP笔记-路由策略与路由控制 之一

1、流量可达性控制的2种手段 对流量下手&#xff0c;拒绝流量通过 对路由下手&#xff0c;过滤掉可达的路由信息 Filter-PolicyRIP&#xff0c;OSPF&#xff0c;ISIS&#xff0c;BGP协议都可以使用filter-policy对路由进行过滤。 对协议接收的路由进行过滤&#xff1a;filter-p…

【Qt 学习笔记】Qt 开发环境的搭建 | Qt 安装教程

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt 开发环境的搭建 | Qt 安装教程 文章编号&#xff1a;Qt 学习笔记 /…

Calico IPIP和BGP TOR的数据包走向

IPIP Mesh全网互联 文字描述 APOD eth0 10.7.75.132 -----> APOD 网关 -----> A宿主机 cali76174826315网卡 -----> Atunl0 10.7.75.128 封装 ----> Aeth0 10.120.181.20 -----> 通过网关 10.120.181.254 -----> 下一跳 BNODE eth0 10.120.179.8 解封装 --…

一个线程池的理解

最近看到一个线程池&#xff0c;写的实在太好&#xff0c;于是想深入理解一下。原始代码出处&#xff1a;GitHub - Ahajha/CTPL: Modern and efficient C Thread Pool Library 由于平时的工程一般只支持到C11,而拿到的代码应该是在C20下才能编译通过&#xff0c;因此也做了一些…

Kubernetes(K8s)技术解析

1. K8s简介 Kubernetes&#xff08;简称K8s&#xff09;是一个开源的容器编排平台&#xff0c;旨在简化容器化应用程序的部署、扩展和管理。为开发者和运维人员提供了丰富的功能和灵活的解决方案&#xff0c;帮助他们更轻松地构建、部署和管理云原生应用程序。以下是关于Kubern…

3.Swagger整合

一、引入相关依赖 <!-- 图像化依赖 --> <dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger-ui</artifactId><version>2.9.2</version> </dependency> <!--引入swagger2依赖 --> <d…

SQL注入---盲注

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 一.盲注概述 注是一种SQL注入攻击的形式&#xff0c;在这种攻击中&#xff0c;攻击者向目标应用程序发送恶意注入代码&#xff0c;然后通过观察应用程序的响应来推断出数据库中的信息。与常规的…

C++中二叉搜索树的模拟实现(二叉搜索树是map,set的底层原理)

搜索二叉树 定义 搜索二叉树:左子树小于根,右子树大于根.搜索二叉树的中序序列是升序的.所以对于二叉树而言,它的左子树和右子数都是二叉搜索树 下图就是二叉搜索树 二叉搜索树的性质: 二叉搜索树的中序遍历出的数据是有序的,并且二叉树搜索树在查找某个数的时候,一般情况下…

Outlook会议邀请邮件在答复后就不见了

时常会有同事找到我说&#xff0c;Outlook答复会议邀请邮件后收件箱就找不到会议邀请的邮件了。 这其实是Outlook的的一个机制&#xff0c;会把应答后的会议邀请邮件从收件箱自动删除&#xff0c;到已删除的邮件那里就能找到。如果不想要自动删除&#xff0c;改一个设置即可。…

kafka 高吞吐设计分析

说明 本文基于 kafka 2.7 编写。author blog.jellyfishmix.com / JellyfishMIX - githubLICENSE GPL-2.0 概括 支撑 kafka 高吞吐的设计主要有以下几个方面: 网络 nio 主从 reactor 设计模式 顺序写。 零拷贝。 producer producer 开启压缩后是批量压缩&#xff0c;bro…

k8s部署微服务例子

一、部署服务 需要部署minio、nacos、mysql、consul、elasticsearch、视频解析服务、nfs、skywalking-oap及ui。 二、三个微服务程序 minio服务解析视频-》上传到minio进行存储&#xff0c;构造领域对象信息保存到hive&#xff08;hive on spark&#xff09;异步处理-》元数据…

c#程序报错引用无效解决办法之一:检查引用的文件路径

直接右键然后打开本地 打开这个.csproj文件&#xff0c;直接对着路径看看里面的路径对不对。 一般是很多人一起开发&#xff0c;然后这个文件路径被推送上来的问题

前端三剑客 —— CSS (第四节)

目录 内容回顾&#xff1a; 1.常见样式 2.特殊样式 特殊样式 过滤效果 动画效果 动画案例&#xff1a; 渐变效果 其他效果&#xff1a; 多列效果 字体图标&#xff08;icon&#xff09; 内容回顾&#xff1a; 1.常见样式 text-shadow x轴 y轴 阴影的模糊程度 阴影的…

kubectl explain资源文档命令

学习并使用了一段时间的kubernetes&#xff0c;发现对k8s还是了解甚少&#xff0c;于是利用上下班通勤的时间又去B站看一些大佬的视频&#xff0c;又来重学巩固一遍知识&#xff0c;并做些记录。 之前在学习使用过程中未成了解过explain这个命令&#xff0c;因为自己部署的版本…

一站式知识库服务平台真的有那么好用吗?看完你就懂了

在快速发展的信息化社会&#xff0c;我们经常会听到“知识就是力量”的这句话&#xff0c;而一个一站式的知识库服务平台就是这样一把“开启力量之门”的钥匙。那么&#xff0c;这把钥匙真的有那么好用吗&#xff1f;让我们一起探讨一下。 首先&#xff0c;“一站式”可能已经解…