数据结构前言(代码片段)

任我驰骋° 任我驰骋°     2023-02-02     597

关键词:

前言

什么是数据结构?

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

什么是算法?

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

一、算法效率

如何衡量一个算法的好坏呢?比如对于以下斐波那契数列:

long long Fib(int N) 
 if(N < 3)
 return 1;
 
 return Fib(N-1) + Fib(N-2);

算法的复杂度:

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

  时间复杂度主要衡量一个算法的运行快慢,而空间复杂度主要衡量一个算法运行所需要的额外空间。在计算机发展的早期,计算机的存储容量很小。所以对空间复杂度很是在乎。但是经过计算机行业的迅速发展,计算机的存储容量已经达到了很高的程度。所以我们如今已经不需要再特别关注一个算法的空间复杂度。

二、时间复杂度

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

void Func1(int N) 

int count = 0;
for (int i = 0; i < N ; ++ i) 
 for (int j = 0; j < N ; ++ j)
 
 ++count;
 

 
for (int k = 0; k < 2 * N ; ++ k) 
 ++count; 
int M = 10;
while (M--) 
 ++count; 

printf("%d\\n", count);

Func1 执行的基本操作次数 :

N = 10 F(N) = 130
N = 100 F(N) = 10210
N = 1000 F(N) = 1002010
  实际中我们计算时间复杂度时,我们其实并不一定要计算精确的执行次数,而只需要大概执行次数,那么这里我们使用大O的渐进表示法。

大O的渐进表示法:

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

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

使用大O的渐进表示法以后,Func1的时间复杂度为O(N2)。

N = 10 F(N) = 100
N = 100 F(N) = 10000
N = 1000 F(N) = 1000000
通过上面我们会发现大O的渐进表示法去掉了那些对结果影响不大的项,简洁明了的表示出了执行次数。
另外有些算法的时间复杂度存在最好、平均和最坏情况:
最坏情况:任意输入规模的最大运行次数(上界)
平均情况:任意输入规模的期望运行次数
最好情况:任意输入规模的最小运行次数(下界)
例如:在一个长度为N数组中搜索一个数据x
最好情况:1次找到
最坏情况:N次找到
平均情况:N/2次找到

在实际中一般情况关注的是算法的最坏运行情况,所以数组中搜索数据时间复杂度为O(N)。

三、空间复杂度

空间复杂度也是一个数学表达式,是对一个算法在运行过程中临时占用存储空间大小的量度 。
空间复杂度不是程序占用了多少bytes的空间,因为这个也没太大意义,所以空间复杂度算的是变量的个数。
空间复杂度计算规则基本跟实践复杂度类似,也使用大O渐进表示法
注意:函数运行时所需要的栈空间(存储参数、局部变量、一些寄存器信息等)在编译期间已经确定好了,因此空间复杂度主要通过函数在运行时候显式申请的额外空间来确定。

四、常见复杂度对比


《剑指offer——树的子结构》代码(代码片段)

树的子结构前言一、示例二、代码解析1.新建.cpp文件代码如下(示例):前言//============================ 查看详情

新手小白java前言(代码片段)

欢迎各位同学加入CGB课程Java大数据的班级😃讲师:程晓宇–泡泡老师代码/资料下载网址:网址:http://code.tarena.com.cn账号:tarenacode密码:code_2017进入后选择我们的课程方向“CGBCode”,再选择对应的班级即可一阶段学... 查看详情

编写c语言版本的卷积神经网络cnn之一:前言与minst数据集(代码片段)

原创文章转载请注册来源http://blog.csdn.net/tostq前言    卷积神经网络是深度学习的基础,但是学习CNN却不是那么简单,虽然网络上关于CNN的相关代码很多,比较经典的是tiny_cnn(C++)、DeepLearnToolbox(... 查看详情

数据结构之队列详解(代码片段)

数据结构之队列详解文章目录数据结构之队列详解前言一、队列的概念及结构二、队列的实现1.基本结构2.基本操作(1)初始化和销毁(2)出队入队(3)判空(4)获取元素三、循环队列总结前言在... 查看详情

pandas优化(代码片段)

目录前言使用Datetime数据节省时间pandas数据的循环操作使用itertuples()和iterrows()循环Pandas的.apply()方法矢量化操作:使用.isin()选择数据还可以做的更好吗?使用Numpy继续加速使用HDFStore防止重新处理结论前言当大家谈到数据分析时... 查看详情

数据结构-栈(代码片段)

目录前言一、栈的概念与结构二、C语言-栈的基本操作与实现1.栈的创建2.栈的初始化3.入栈4.出栈5.获取栈顶元素6.获取栈中有效元素个数7.检测栈是否为空8.销毁栈三、栈的经典使用1.问题叙述2.解题方法3.代码实现前言本文均基于... 查看详情

数据结构之栈(代码片段)

...习了单双链表,然后到达了现在,而此次博主要讲解的便是数据结构中的栈,栈是什么样子的呢?它又具有哪些特性?可以做哪些事情呢?等一系列问题,博主将会在下面意一一进行解答.栈是 查看详情

数据结构之队列(代码片段)

...顺序表,单链表,双链表以及栈.今天,博主更新的内容就是数据结构中的队列.1.何为队列队列:只允许在一端进行插入数据 查看详情

python数据类型详细分析(附代码)(代码片段)

目录前言1.列表2.元组3.集合4.字典前言相关链接python之numpy详细分析(附代码)python之pandas详细分析(附代码)python之Matplotlib详细分析(附代码)直奔主题:Python四种集合数据类型:列表(List&#x... 查看详情

apachehudi数据湖概述(代码片段)

文章目录前言hudi是什么hudi实现更新的基本原理基础文件增量日志文件文件组文件的版本COW表数据的更新MOR表数据的更新MOR表的compacthudi不同表格式的读取方式COW表数据的读取MOR表数据的读取不同表格式的特性Hudi的应用mysqlcdc分... 查看详情

tomcat底层原理(代码片段)

目录前言Tomcat底层架构组成1、Context——servlet容器2、Host——servlet容器3、Engine——servlet容器4、Wrapper——servlet容器5、Pipiline管道Tomcat的请求处理流程Tomcat架构平视图JavaSocket底层实现Connector组件1、BIO的方式取数据2、NIO的方式取... 查看详情

security权限控制(代码片段)

目录前言数据库和dimain静态页面配置文件web.xml引入service校验方法用户名的获取不同角色访问控制权限jsp页面后台前言spring自带角色权限控制框架用户-角色数据库和dimain数据库--用户表CREATETABLEsys_user(idintauto_incrementPRIMARYKEY,username... 查看详情

javase程序逻辑控制(代码片段)

目录前言顺序结构分支结构if语句悬垂elseswitch语句循环结构输入输出方式输出到控制台 从键盘输入猜数字游戏前言本章主要讲解:Java中程序的逻辑控制语句Java中的输入输出方式顺序结构按照代码书写的顺序一行一行执行分... 查看详情

jdbc原理之层次结构(代码片段)

目录JDBC的层次结构前言Collection角色Statement角色ResultSet角色JDBC工作的基本流程JDBC的层次结构前言JDBCAPI提供了以下接口和类:DriverManager:这个类管理数据库驱动程序的列表。确定内容是否符合从Java应用程序使用的通信子协议正确... 查看详情

java数据结构——队列(代码片段)

文章目录前言一、队列1.概念2.Java当中的队列3.实例化对象4.双端队列(Deque)5.队列的常用方法二、Java实现简单队列三、循环队列设计循环队列循环队列的具体实现前言  最近博主在学习JavaWeb的过程中,讲到了具体线程的知... 查看详情

java数据结构——队列(代码片段)

文章目录前言一、队列1.概念2.Java当中的队列3.实例化对象4.双端队列(Deque)5.队列的常用方法二、Java实现简单队列三、循环队列设计循环队列循环队列的具体实现方法一方法二前言  最近博主在学习JavaWeb的过程中,讲到了... 查看详情

zookeeper集群部署(代码片段)

...、Zookeeper定义2、Zookeeper工作机制3、Zookeeper特点4、Zookeeper数据结构5、Zookeeper应用场景6、Zookeeper选举机制第一次启动选举机制非第一次启动选举机制二、部署Zookeeper集群准备3台服务器做Zookeeper集群1.安装前准备2.安装Zookeeper前言... 查看详情

opencv实战——opencv核心数据结构(代码片段)

OpenCV实战(2)——OpenCV核心数据结构0.前言1.cv::Mat数据结构1.1cv::Mat简介1.2cv::Mat属性1.3完整代码示例2.探索cv::Mat数据结构2.1cv::Mat对象的创建2.2OpenCV输入和输出数组小结系列链接0.前言cv::Mat类是用于保存图像(以及其他矩阵... 查看详情