数据结构·复杂度讲解

1. 什么是数据结构

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

        数据结构是用来在内存中管理数据的,类似的,我们熟悉的文件或数据库是在硬盘中管理数据的。内存中的数据是带点存储的,内存大小一般较小(8G/16G),而硬盘中的数据是不带电存储的,大小一般(512G\1T)。带电存储就是用电信号保存数据,如果突然我们的计算机断电了,那内存中的数据就都没了。

        带电存储和不带电存储算是相辅相成的关系,内存中的数据处理好了之后,就会存到硬盘上,防止断电后丢失。

2. 算法的复杂度

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

        时间复杂度主要用来衡量一个算法的运行快慢,而空间复杂度主要衡量一个算法运行所需要的额外空间。随着如今硬件的迭代升级,内存越来越大,现在我们已经不太关注空间复杂度了。

3. 时间复杂度

3.1 时间复杂度的概念

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

        那么我们现在判断一下下面这段代码的时间复杂度

        

        首先是两层循环嵌套:F(N) = N^2

        然后是2*N次的循环:F(N) = 2 * N

        最后是10次循环:F(N) = 10

        把他们都加在一起最终结果就是:F(N) = N^2 + 2*N + 10

        但是实际上,我们并不需要把时间复杂度计算的那么精准,只需要知道大概执行次数,所以这里引进了大O的渐进表示法

3.2 大O的渐进表示法

        推导大O阶方法:

        1. 用常数1替代运行时间中所有加法常数

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

        3. 如果最高阶项存在且不为1,则去除与这个项相乘的常数

        上一道题用大O的渐进表示法的结果就是O(N^2)

        其实说白了,这个方法的核心就是去估计最差的预期的数量级有多大

3.3 例题

3.3.1 冒泡排序的时间复杂度

                

        冒泡排序的遍历 (N - 1) + (N - 2) +···+ 3 + 2 + 1 次

        很明显这是个等差数列,头加尾除二,最后结果就是 O(N^2)

3.3.2 二分查找的时间复杂度

        二分查找最开始查找区间长度是N,找一次缩小一半,就是除2,最坏的情况就是最后区间长度缩小为1,或者为-1(没找到)。

        那么除多少个2就相当于找了多少次,我们假设除了x个2

        N /2 /2 /2······/2 == 1        两边同时成 2^x

        N == 2^x

        x == \log_{2}N

        所以最后二分查找的时间复杂度就是 O(\log_{2}N),因为这个对数不好写出来,所以有时候也会简写成 O(logN) ,大家看到这种写法的时候要注意识别。如果不是以2为底的话就不能简写了

3.3.3 计算阶乘的时间复杂度(简单阶乘)

                

        我们分析一下,递出去的时候要走N-1次到头,归回来也要走N-1次,然后最后返回数值走1次,所以说精细算的话一共走2N-1次,时间复杂度为O(N)

4. 空间复杂度

        空间复杂度也是一个数学表达式,是对一个算法在运行过程中临时占用存储空间的大小的量度。

        空间复杂度不是程序占用了多少Byte的空间,而是计算同一时间新开辟变量最多时的新变量个数,如果没有新开辟变量也是是O(1),因为空间是可以重复利用的。

        空间复杂度计算规则和时间复杂度类似,也使用大O渐进表示法

        其实空间复杂度和时间复杂度的判断都有一种感性的感觉,我们要去思考这个算法的思路是什么,而不是死磕代码里有几个for循环什么的

        

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

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

相关文章

2024美赛数学建模所有题目思路分析

美赛思路已更新,关注后可以获取更多思路。并且领取资料 C题思路 首先,我们要理解势头是什么。简单来说,势头是一方在比赛中因一系列事件而获得的动力或优势。在网球中,这可能意味着连续赢得几个球,或是在比赛的某个关…

【2024美赛】B题(中英文):搜寻潜水器Problem B: Searching for Submersibles

【2024美赛】B题(中英文):搜寻潜水器Problem B: Searching for Submersibles 写在最前面2024美赛翻译 —— 跳转链接 中文赛题问题B:搜寻潜水器你的任务是: 词汇表 英文赛题Problem B: Searching for SubmersiblesYour…

AI:122-基于深度学习的电影场景生成与特效应用

🚀点击这里跳转到本专栏,可查阅专栏顶置最新的指南宝典~ 🎉🎊🎉 你的技术旅程将在这里启航! 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带有在本地跑过的关键代码,详细讲解供…

详解 Prim 算法的实现

一、算法思路 Prim 算法是用来求最小生成树的,它的思想也有点类似于贪心——逐个将离当前集合最近的点加入到集合中,直至发现图不连通或所有点都被加到集合中,算法即宣告终止。它的具体做法是: step 1:初始时&#xf…

el-tree setChecked实现父子不联动

2024.1.29今天我学习了如何使用el-tree的setChecked用法,在使用el-tree的时候我们需要进行回显情况:如: [{id:1,name:张三, children:[{id:1-1,name:张三四},{id:1-2,name:张三五}]}, {id:2,name:李四}] 如果我们存id: [1,2]&a…

ArcGIS空间分析方法计算城市气体扩散

基于ArcGIS提供的空间分析方法,计算城市气体扩散涉及的密闭空间和开敞空间。 文章目录 一、实验描述二、实验过程1. 加载数据2.符号化3. 建立缓冲区4. 提取密闭空间(建筑)5.提取开敞区域6. 计算开敞空间面积三、注意事项一、实验描述 在对城市空间进行分析时,可将城市空间…

基于VMware和Unbuntu18.04编译 嘉立创·泰山派 Linux SDK

主机硬件要求 内存最少32G 硬盘腾出200-500G,虽然编译最终占了73G,但富余一些以后可以搞别的方便 操作系统win7/10/11 VMware 安装 1.去vmware官网下载:https://customerconnect.vmware.com/cn/downloads/info/slug/desktop_end_user_comp…

小红书种草商品笔记违规,有哪些原因?

发布小红书笔记之后迟迟没有流量,内容过关但是浏览量突然变低是什么原因?如果出现上述情况,就可能是商品笔记被限制了。那么该如何重新获得流量呢?今天我们就来分享下小红书种草商品笔记违规,有哪些原因? 一、怎样判断被限流了 …

网络原理-TCP/IP(4)

TCP原理 滑动窗口 之前我们讲过了确认应答策略,对发送的每一个数据段,都要给一个ACK确认应答,收到ACK后再发送下一个数据段. 确认应答,超时重传,连接管理这样的特性都是为了保证可靠运输,但就是付出了传输效率(单位时间能传输数据的多少)的代价,因为确认应答机制导致了时间大…

Qt实现类似ToDesk顶层窗口 不规则按钮

先看效果: 在进行多进程开发时,可能会遇到需要进行全局弹窗的需求。 因为平时会使用ToDesk进行远程桌面控制,在电脑被控时,ToDesk会在右下角进行一个顶层窗口的提示,效果如下: 其实要实现顶层窗口&#xf…

计算机设计大赛 深度学习 python opencv 火焰检测识别

文章目录 0 前言1 基于YOLO的火焰检测与识别2 课题背景3 卷积神经网络3.1 卷积层3.2 池化层3.3 激活函数:3.4 全连接层3.5 使用tensorflow中keras模块实现卷积神经网络 4 YOLOV54.1 网络架构图4.2 输入端4.3 基准网络4.4 Neck网络4.5 Head输出层 5 数据集准备5.1 数…

LeetCode 第23天

669. 修剪二叉搜索树 卡哥讲的两个遍历的方法不太听得懂,去题解找了一个和昨天的题类似的删除二叉树节点的方法,感觉好不错。但是还是挺难写出来的,需要判断的情况有点多,再加上递归,我有点泪目了。 class Solution {…

STL - list

1、list的介绍及使用 1.1、list的介绍 list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向 其前一个元…

计算机网络(第六版)复习提纲21

SS4.6 互联网的路由选择协议 1 关于路由选择协议的基本概念 A 理想的路由算法(路由选择协议的核心)157 1 算法是正确和完整的 2 计算上简单 3 能适应通信量和网络拓扑的变化(自适应性) 4 稳定性 5 公平性 6 应当最佳(特…

力扣hot100 对称二叉树 递归

Problem: 101. 对称二叉树 文章目录 思路Code 思路 👨‍🏫 参考 Code 时间复杂度: O ( n ) O(n) O(n) 空间复杂度: O ( n ) O(n) O(n) /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* …

深入解剖指针篇(3)

个人主页(找往期文章) :我要学编程(ಥ_ಥ)-CSDN博客 目录 二级指针 指针数组 指针数组模拟二维数组 字符指针变量 数组指针 数组指针初始化 二维数组传参的本质 函数指针 函数指针的使用 typedef关键字 函数指针数组 二级指针…

CDC 整合方案:Flink 集成 Confluent Schema Registry 读取 Debezium 消息写入 Hudi

本文介绍的整体方案选型是:使用 Kafka Connect 的 Debezium MySQL Source Connector 将 MySQL 的 CDC 数据 (Avro 格式)接入到 Kafka 之后,通过 Flink 读取并解析这些 CDC 数据,其中,数据是以 Confluent 的 Avro 格式存储的,也就是说,Avro 格式的数据在写入到 Kafka 以…

缓存击穿,商详页进不去了!!!

故事 对于小猫来讲,最近的一段日子是不好过的,纵使听着再有节拍的音乐,也换不起他对生活的热情。由于上一次“幂等事件”躺枪,他已经有几天没有休息好了。他感觉人生到了低谷。 当接手这个商城项目之后,他感觉他一直没…

视频怎么加水印?分享两个简单的加水印的方法

在数字媒体时代,视频已经成为信息传播的重要方式。许多人在创作视频是会加上自己独特的水印,防止视频被盗用。水印作为数字版权保护技术的一种,可以有效地防止视频被非法复制、传播或篡改,从而保护创作者的权益和利益。下面我分享…

关闭idea之后,项目还在运行,端口被占用

今天在写项目的时候,中途安装了一个插件,而且插件显示需要重启idea,重启的时候项目正在运行,重启之后发现idea没有显示有项目正在运行,当我要开启项目的时候,发现无法开启,显示端口被占用了&…