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

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

复杂度目录

  • 一、初识数据结构
    • 1.基础概念
    • 2.如何学好数据结构
  • 二、复杂度
    • 1.复杂度
    • 2.时间复杂度
      • ①有限数的时间复杂度
      • ②函数的时间复杂度
      • ③二分查找时间复杂度
      • ④递归
      • 拓展练习题1:消失的数字
    • 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;
}

拓展练习题③数组,二级指针

在这里插入图片描述

拓展练习题④移除元素

原题链接:LINK
在这里插入图片描述

//三条思路
//1.传统的覆盖
//2.开新数组
//3.双指针
int removeElement(int* nums, int numsSize, int val) {int i = 0;int p1 = 0;//探路者int p2 = 0;//守家者for(i = 0;i<numsSize;i++){if(nums[p1]==val){p1++;}else{nums[p2++] = nums[p1++];}}return p2;
}
#if 1
/*解题思路:1. 设置一个变量count,用来记录nums中值等于val的元素的个数2. 遍历nums数组,对于每个元素进行如下操作:a. 如果num[i]等于val,说明值为val的元素出现了一次,count++b. 如果nums[i]不等于元素,将nums[i]往前搬移count个位置因为nums[i]元素之前出现过count个值等于val的元素,已经被删除了因此次数需要将nums[i]往前搬移3. 返回删除之后新数组中有效元素个数时间复杂度:O(N)   空间复杂度:O(1)*/
int removeElement(int* nums, int numsSize, int val){int count = 0;for(int i = 0; i < numsSize; ++i){if(nums[i] == val){count++;}else{nums[i-count] = nums[i];}}return numsSize - count;
}
#endif

EOF

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

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

相关文章

Java常用API_System——常用方法及代码演示

1.System.exit(int status) 方法的形参int status为状态码&#xff0c;如果是0&#xff0c;说明虚拟机正常停止&#xff0c;如果非0&#xff0c;说明虚拟机非正常停止。需要将程序结束时可以调用这个方法 代码演示&#xff1a; public class Test {public static void main(S…

提示工程中的10个设计模式

我们可以将提示词定义为向大型语言模型(Large Language Model&#xff0c;LLM)提供的一个查询或一组指令&#xff0c;这些指令随后使模型能够维持一定程度的自定义或增强&#xff0c;以改进其功能并影响其输出。我们可以通过提供细节、规则和指导来引出更有针对性的输出&#x…

fakebook-攻防世界

题目 先目录扫描一下 dirseach 打开flag.php是空白的 访问robots.txt,访问user.php.bak <?php class UserInfo { public $name ""; public $age 0; public $blog ""; public function __construct($name, $age, $blog) { …

Day5-Hive的结构和优化、数据文件存储格式

Hive 窗口函数 案例 需求&#xff1a;连续三天登陆的用户数据 步骤&#xff1a; -- 建表 create table logins (username string,log_date string ) row format delimited fields terminated by ; -- 加载数据 load data local inpath /opt/hive_data/login into table log…

GitHub教程:最新如何从GitHub上下载文件(下载单个文件或者下载整个项目文件)之详细步骤讲解(图文教程)

&#x1f42f; GitHub教程&#xff1a;最新如何从GitHub上下载文件(下载单个文件或者下载整个项目文件)之详细步骤讲解(图文教程) &#x1f4c1; 文章目录 &#x1f42f; GitHub教程&#xff1a;最新如何从GitHub上下载文件(下载单个文件或者下载整个项目文件)之详细步骤讲解(图…

四、书城开发--1、书城首页的开发

书城开发需求分析&#xff1a; 书城首页有标题搜索->随机推荐->猜你喜欢->热门推荐->精选->分类推荐->全部分类->分类列表 还有搜索列表页、图书详情页 题外话&#xff0c;隔了几天时间去小捣了一下vue3的项目的时候改了一下node版本&#xff0c;结果导…

2024.4.8-day12-CSS 常用样式属性和字体图标

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; 文章目录 作业2024.4.8-学习笔记盒子阴影文本阴影透明的vertical-align字体使用 作业 &…

Linux网络编程二(TCP图解三次握手及四次挥手、TCP滑动窗口、MSS、TCP状态转换、多进程/多线程服务器实现)

文章目录 1、TCP三次握手(1) 第一次握手(2) 第二次握手(3) 第三次握手 2、TCP四次挥手(1) 一次挥手(2) 二次挥手(3) 三次挥手(4) 四次挥手 3、TCP滑动窗口4、TCP状态时序图5、多进程并发服务器6、多线程并发服务器 1、TCP三次握手 TCP三次握手(TCP three-way handshake)是TCP协…

UE4_动画基础_角色的缩放

以第三人称模板进行制作。 一、首先为角色缩放新建粒子效果 1、新建niagara system&#xff0c;重命名为NS_Shrink。 2、双击打开设置参数&#xff1a; 发射器重命名&#xff1a; Emitter State&#xff1a; 发射器一次喷发数量&#xff1a; 粒子初始大小&#xff0c;生命周…

DLDP简介

定义 设备链路检测协议DLDP&#xff08;Device Link Detection Protocol&#xff09;用来监控光纤或铜质双绞线&#xff08;例如超五类双绞线&#xff09;的链路状态。如果发现单向链路存在&#xff0c;DLDP协议会根据用户配置&#xff0c;自动关闭或通知用户手工关闭相关接口…

法向量估计

法向量估计 1. 求解点P法向量的原理2. 法向量估计的证明3. 为什么求点P的法向量&#xff0c;需要使用以P为中心的邻域内的点&#xff1f;4. 法向量估计的应用和思考5. 权重法向量估计 1. 求解点P法向量的原理 已知有一组点 P ( p 1 , p 2 , p 3 , . . . , p n ) , p i ∈ R 3…

基于Springboot+Vue实现前后端分离酒店管理系统

一、&#x1f680;选题背景介绍 &#x1f4da;推荐理由&#xff1a; 近几年来&#xff0c;随着各行各业计算机智能化管理的转型&#xff0c;以及人们经济实力的提升&#xff0c;人们对于酒店住宿的需求不断的提升&#xff0c;用户的增多导致酒店管理信息的不断增多&#xff0c;…

表单流程管理系统:推进数字化转型理想助手

在数字化转型新时代&#xff0c;谁拥有理想的软件平台助手&#xff0c;谁就能在流程化管理新进程中迈出坚实的步伐。面对激烈的市场竞争&#xff0c;低代码技术平台及表单流程管理系统正在广阔的市场环境中越扎越稳&#xff0c;成为助力企业数字化转型升级的重要利器设备。想要…

20240325-1-HMM

HMM 直观理解 马尔可夫链&#xff08;英语&#xff1a;Markov chain&#xff09;&#xff0c;又称离散时间马尔可夫链&#xff08;discrete-time Markov chain&#xff0c;缩写为DTMC&#xff09;&#xff0c;因俄国数学家安德烈马尔可夫&#xff08;俄语&#xff1a;Андре…

【退役之重学Java】pom文件没啥问题但报红

复制过来的pom文件&#xff0c;有几处版本号报红 刚开始以为是版本号的问题&#xff0c;但是按道理从大佬那里复制过来的&#xff0c;应该不会有问题&#xff0c;还是检查了一下&#xff1a; 把项目压缩发给师傅&#xff0c;师傅哪里没报错好吧&#xff0c;我已经猜到了为什么……

MS SQL Server STUFF 函数实战 统计记录行转为列显示

目录 范例运行环境 视图样本设计 数据统计要求 STUFF函数实现 小结 范例运行环境 操作系统&#xff1a; Windows Server 2019 DataCenter 数据库&#xff1a;Microsoft SQL Server 2016 视图样本设计 假设某一视图 [v_pj_rep1_lname_score] 可查询对某一被评价人的绩效…

基于Vue3 中后台管理系统框架

基于Vue3 中后台管理系统框架 文章目录 基于Vue3 中后台管理系统框架一、特点二、源码下载地址 一款开箱即用的 Vue 中后台管理系统框架&#xff0c;支持多款 UI 组件库&#xff0c;兼容PC、移动端。vue-admin, vue-element-admin, vue后台, 后台系统, 后台框架, 管理后台, 管理…

Jenkins 持续集成 【CICD】

持续集成 &#xff08;Continuous integration&#xff0c;简称CI&#xff09; 持续集成是一种开发实践&#xff0c;它倡导团队成员频繁的集成他们的工作&#xff0c;每次集成都通过自动化构建&#xff08;包括编译、构建、打包、部署、自动化测试&#xff09;来验证&#xff…

SpringBoot集成Skywalking链路追踪

安装skywaling 参考&#xff1a;Centos7搭建 SkyWalking 单机版-CSDN博客 下载Agents https://archive.apache.org/dist/skywalking/java-agent/9.0.0/apache-skywalking-java-agent-9.0.0.tgz 1. 在IDEA中使用skywalking agent 在VM options中填入如下信息 -javaagent后是…

[C++][算法基础]字符串统计(Trie树)

维护一个字符串集合&#xff0c;支持两种操作&#xff1a; I x 向集合中插入一个字符串 x&#xff1b;Q x 询问一个字符串在集合中出现了多少次。 共有 N 个操作&#xff0c;所有输入的字符串总长度不超过 &#xff0c;字符串仅包含小写英文字母。 输入格式 第一行包含整数…