数据结构总结1:了解数据结构、时间复杂度、空间复杂度

news2024/11/24 11:25:14

后续可能会有补充和更改

目录

一、数据结构 

1.算法介绍

二、时间复杂度、空间复杂度

三、练习

1.时间复杂度

2.空间复杂度 


一、数据结构 

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

数据结构和数据库的区别

数据结构是在内存中存储管理数据的,数据库是在磁盘中存储管理数据的。

二者的本质都是存储管理数据。

内存和磁盘的区别

内存:带电存储(如果电脑突然关机,没有保存,则数据丢失。要快速访问,用内存,用数据结构)

磁盘:不带电存储(存储到数据库中、或以文件形式存储,项目当中存储的数据方便查找数据,方便遍历数据,最好用数据库存储。想持久化,长期保存下来,用数据库) 

算法就是对数据按要求进行某些处理,将输入数据转换成想要的输出结果。例如:查找、排序...... 

二、时间复杂度、空间复杂度

时间复杂度主要衡量一个算法的运行快慢,而空间复杂度主要衡量一个算法运行所需要的额外空间。(注意,空间复杂度不是计算程序占用了多少字节的空间,而是计算的是变量的个数。即时间复杂度算次数,空间复杂度算额外变量个数)

衡量一个算法的好坏,主要看其时间复杂度和空间复杂度,它们也是衡量性能、效率的两个主要指标。复杂度是用来计算算法中基本操作的执行次数的。实际中一般取的是算法的最差运行情况。

算复杂度不要数循环,因为它不一定准确,而是要看算法思想。

冒泡排序的时间复杂度:

二分查找的时间复杂度:O(logN)以二为底。最好情况为O(1)

空间复杂度

斐波那契数列的空间复杂度:O(N)

注意:时间是累积的,空间是不累积的,可以重复利用

 第二节1:03:00

复杂度一般用大O的渐进表示法来表示

推导大O的方法:

1.用常数1取代运行时间中的所有加法常数(无论是多大的常数,因为现在计算机计算速度特别快,平时用到的常数次并不算多)

2.在修改后的运行次数函数中,保留最高阶项

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

3.如果最高阶项存在且不是1,则去除与这个项目相乘的常数。得到的结果就是大O阶。

如果遇到O(N+M),N和M都是常数,这时,如果N远大于M,则是O(N),M远大于N,则是O(M),M和N一样大,就是O(N)或O(M)

O(1)表示的是常数次

函数(递归......)的时间复杂度:函数的深度及各层深度计算次数相加

很多算法大部分情况下,空间复杂的都是O(1),不是O(1)就是O(n)。

注意:函数运行时所需要的栈空间(存储参数、局部变量、一些寄存器信息等)在编译期间已经确定好了,因此空间复杂度主要通过函数在运行时显式申请的额外空间来决定

一般logn都是以2为底

栈的大小一般只有8MB

递归的深度太深时,空间不够 ,栈会溢出,栈溢出就是空间不够

三、练习

1.时间复杂度

1.下列有关大O表示法的说法错误的是()

A.大O表示法只是对程序执行的一个估算

B.大O表示法只保留最高阶项

C.大O表示法会保留一个系数来更准确的表示复杂度

D.大O表示法一般表示的是算法最差的运行时间

选C

大O是一个渐进表示法,不会去表示精确的次数,cpu的运算速度很快,估计精确的没有意义。

B:随着问题规模的增加,次高阶项和更低阶项对总时间的影响逐渐减小,最终可以忽略不计

C:大O表示法通常不会保留一个系数来更准确地表示复杂度,因为在算法分析中,常数项通常不是很重要,会随着具体实现方式和硬件环境的不同而变化。

2.分析以下函数的时间复杂度

void fun(int n) {
  int i=l;
  while(i<=n)
    i=i*2;
}

O(logN)

该循环并没有被执行n次,i每次都是变为自己的2倍,所以循环只会被执行log以2为底的n次

3. 分析以下程序的时间复杂度

for(int i=0;i<n;i++)
  for(int j=0;j<n;j++)
    a[i][j]=i*j;

O(N^2)

程序有两次循环,每个循环都有n次操作,所以时间复杂度为n^2

4.下面算法的时间复杂度是

  int f ( unsigned int n ) {
    if (n == 0 || n==1) 
      return 1;
    else 
      return n * f(n-1);
  }

O(N)

此函数会被递归调用n - 1次,每次操作都是一次,所以时间复杂度为n

5.给定一个整数sum,从有N个有序元素的数组中寻找元素a,b,使得a+b的结果最接近sum,最快的平均时间复杂度是

O(N)

可以使用双指针法来解决这个问题,最快的平均时间复杂度是 O(N)

具体实现步骤如下:

1.将指针 left 指向数组的第一个元素,将指针 right 指向数组的最后一个元素。

2.计算 left 和 right 指向的元素之和。

3.如果和大于sum,则将 right 指针向左移动一位,以减小和。

如果小于sum,则将 left 指针向右移动一位,以增大和。

如果等于sum,则直接返回a和b。

在移动指针的过程中,还需记录最接近目标值的a和b,以及对应的 arr[left]和arr[right] 值。当left和right指针相遇时,结束。

因为该算法只需要遍历一次数组,每次操作都只涉及到两个指针的移动和数值的比较,因此时间复杂度是 O(N)。

6.设某算法的递推公式是T(n)=T(n-1)+n,T(0)=1,则求该算法中第n项的时间复杂度为

O(N)

T(n)

=T(n-1)+n

=T(n-2)+(n-1)+n

=T(n-3)+(n-2)+(n-1)+n

...

=T(0)+1+2+...+(n-2)+(n-1)+n

=1+1+2+...+(n-2)+(n-1)+n

该题即将T(n)推演到T(0),共递归了n次,相加次数为1+1到n,为n+1次,所以时间复杂度为O(N)

2.空间复杂度 

1.如果一个函数的内部中只定义了一个二维数组a[3][6],请问这个函数的空间复杂度为

O(1)

函数内部数组的大小是固定的,空间复杂度计算的是额外空间的大小,所以不论函数运行多少次,所需空间都是固定大小的,因此空间复杂度为O(1)

2.分析以下函数的空间复杂度

  int** fun(int n) {
    int ** s = (int **)malloc(n * sizeof(int *));
    while(n--)
      s[n] = (int *)malloc(n * sizeof(int));
    return s;
  }

O(N^2)

先是为二级指针开辟空间,大小为n个一级指针。

然后分别为二级指针的每个指针开辟空间。

实际开辟后的是一个二维数组,数组有n行,每行分别有1,2,3,...n列,所以是n(n + 1)/2个元素空间。空间复杂度为O(N^2)

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

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

相关文章

Jmeter测试POST请求

Jmeter测试POST请求 1、添加http请求 线程组->取样器->http请求 参数说明&#xff1a; 协议&#xff1a;http 服务器&#xff1a;10.1.1.26&#xff08;也就是ip地址&#xff09; 端口&#xff1a;8081 方法&#xff1a;POST 路径&#xff1a;例如&#xff…

滴滴 Java 一面面经

目录 1.了解Java集合嘛&#xff0c;详细说一下Map&#xff1f;2.为什么HashTable线程安全却不常用&#xff1f;3.HashMap不是线程安全&#xff0c;多线程下会出现什么问题&#xff1f;4.什么办法能解决HashMap线程不安全的问题呢5.ConcurrentHashmap是怎么实现的&#xff1f;6.…

ALOHA 开源机械臂(Viper 300 Widow X 250 6DOF机械臂 操作系统)第三部分

详情链接&#xff1a;https://tonyzhaozh.github.io/aloha/ Learning Fine-Grained Bimanual Manipulation with Low-Cost Hardware 用低成本硬件学习细粒度双手操作 Tony Zhao Vikash Kumar Sergey Levine Chelsea Finn Stanford University UC Berkeley Meta 斯坦福大学…

分布式锁解决方案_Zookeeper分布式锁原理

通过召zk实现分布式锁可靠性时最高的 公平锁和可重入锁的原理 取水秩序&#xff1a; &#xff08;1&#xff09;取水之前&#xff0c;先取号&#xff1b; &#xff08;2&#xff09;号排在前面的&#xff0c;就可以先取水&#xff1b; &#xff08;3&#xff09;先到的排在…

Go语言的学习【1】基础语法之前的准备事项

目录 什么是云原生学习方法go语言的IDE配置之VScode写go代码要注意的事情一些基本命令基础语法Go 语言原生自带测试Go vetPrint-format 错误&#xff0c;检查类型不匹配的printBoolean 错误&#xff0c;检查一直为 true、false 或者冗余的表达式Range 循环&#xff0c;比如如下…

ThingsBoard部署tb-gateway并配置OPCUA

1、安装 我实在自己的虚拟机上安装,使用官方Docker的安装方式 docker run -it -v ~/.tb-gateway/logs:/thingsboard_gateway/logs -v ~/.tb-gateway/extensions:/thingsboard_gateway/extensions -v ~/.tb-gateway/config:/thingsboard_gateway/config --name tb-gateway --…

《安富莱嵌入式周报》第312期:开源磁场照相机,仿生神经元PCB,开源无线耳机,手机系统PalmOS移植到各种单片机,开放系统组装协议OSAP

周报汇总地址&#xff1a;嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Powered by Discuz! 更新一期视频教程&#xff1a; BSP视频教程第26期&#xff1a;CAN/CANFD/CANopen专题&#xff0c;CANFD整个运行机制精…

PyTorch RNN的原理及其手写复现。

PyTorch RNN的原理及其手写复现。 记忆单元(考虑过去的信息)分类包括&#xff1a;1.RNN 2.GRU 3.LSTM模型类别&#xff1a;1.单向循环(左到右) 2.双向循环&#xff08;考虑未来信息&#xff09; 3.多层单向或双向循环优缺点应用场景具体公式 代码实现 记忆单元(考虑过去的信息)…

网络安全合规-数据安全评估

目前&#xff0c;我国在数据管理领域&#xff0c;已经正式出台的国家标准有《数据管理能力成熟度评估模型&#xff08;GB/T 36073-2018&#xff09;》&#xff08;DCMM&#xff09;&#xff0c;在数据安全检测评估、认证领域的标准有《数据安全能力成熟度模型&#xff08;GB/T …

实现取关和关注功能

将关注过的用户id存如数据库中 //关注或者取关 Override public Result follow(Long id, Boolean flag) { //1.获取当前登录用户的id UserDTO user UserHolder.getUser(); if(usernull){ return Result.fail("请先登录"); } Long userId user.getId(); //2.判断是关…

vue3+antDesignVue前端纯导出

效果 <a-buttonsize"default"style"margin-left: 10px"click"exportData">导出</a-button>1.下载所需依赖 npm install xlsx --save npm install file-saver --save<script setup> import { reactive, ref } from "vue…

SpringBoot——多环境开发

简单介绍&#xff1a; 在我们的开发过程中&#xff0c;我们的程序开发分为几个基本的阶段&#xff0c;比如开发阶段&#xff0c;调试阶段&#xff0c;运行阶段&#xff0c;在不同的阶段可能需要有不同的配置文件去对我们的项目做配置&#xff0c;那么要如何在不同的环境中配置…

C语言:数组定义方式

一、数组简介 <1>前言 大家首先来思考一个问题&#xff0c;若是我们想要定义两个变量&#xff0c;求这两个数的平均数&#xff0c;该怎么求呢&#xff1f; 例如&#xff1a;int a 10,b 20 int average (a b) / 2; 上面的公式&#xff0c;我相信大家应该很快就能够求出…

牛奶蛋白过敏VS乳糖不耐受,看完这篇终于分清了

乳糖不耐受 乳糖不耐症的主要表现为一些胃肠道症状&#xff0c;有腹部紧张、肠鸣、腹痛、排气和腹泻等症状。如出现这些症状都是乳糖不耐受症的表现之一&#xff0c;但患有乳糖不耐的个体症状差异很大&#xff0c;而严重的乳糖不耐受多于摄入一定量乳糖后30min至数小时内发生。…

Python安装教程2023(小白专用)已验证

第一次接触Python&#xff1f;下面从一个完全不懂的Python 的小白来安装Python 等一系列工作的记录&#xff0c;并且遇到的问题也会写出&#xff0c;让完全不懂的小白也可上手安装&#xff0c;并且完成第一个Hello world代码。 [Python 安装] 目前&#xff0c;Python有两个版本…

【手机建站】Android Termux+cpolar内网穿透,搭建外网可以访问的网站

文章目录 概述1.搭建apache2.安装cpolar内网穿透3.公网访问配置4.固定公网地址5.添加站点 概述 Termux是一个Android终端仿真应用程序&#xff0c;用于在 Android 手机上搭建一个完整的Linux 环境&#xff0c;能够实现Linux下的许多基本操作&#xff0c;不需要root权限Termux就…

Word怎么转换成PDF免费?分享适合你的Word转PDF方法

随着数字化时代的到来&#xff0c;将文件转换为PDF格式已经成为一个常见的需求。PDF文件格式的广泛应用使其在各个领域都非常重要&#xff0c;而Word文档则是最常见的文件类型之一。因此&#xff0c;将Word转换为PDF的方法备受关注。在下面&#xff0c;我将分享一种适合任何人使…

基于ARIMA-CNN-LSTM预测模型研究(Python代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

大数据服务之linux中安装hadoop

安装hadoop之前&#xff0c;必须要先有jdk。所以jdk 在linux环境中配置java全局变量 第一步&#xff0c;下载 下载地址&#xff1a;Index of /dist/hadoop/common/hadoop-3.1.3 第二步&#xff0c;解压 tar -zxvf hadoop-3.1.3.tar.gz 第三步&#xff0c;获取文件路径 pw…

站的更高一点看分布式系统中的复制

复制意味着在通过网络连接的多台机器上保留相同数据的副本。 我们希望能复制数据&#xff0c;可能出于各种各样的原因&#xff1a; 使得数据与用户在地理上接近&#xff08;从而减少延迟&#xff09;即使系统的一部分出现故障&#xff0c;系统也能继续工作&#xff08;从而提…