数据结构——时间复杂度和空间复杂度

初始数据结构

**1.**什么是数据结构?

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

2.什么是算法?

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

3.数据结构和算法的重要性

如果经历过校园招聘的笔试或者有过了解的小伙伴们会知道,当前校园招聘笔试一般采用Online Judge形式, 一般都是20-30道选择题,3-4道编程题。而在笔试的题目中,你会发现有很多都是考察你数据结构方面的知识,几乎所有的题目都会与算法扯上一点关系! 在一些企业网上招聘的笔试题中,现在的大公司一般都是考察五道编程题,都和算法有关。中小型公司一般采用选择题+算法编程题的网上笔试形式。因此,数据结构的掌握程度如何,对于大学毕业生找offer的影响是非常大的。所以,我们在大学期间,一定要静下心来,挤出多一点的时间好好学习数据结果的知识~

4.如何才能学好数据结构呢?

1.首先要先掌握好数据结构的相关知识点和原理。如果你大学的数据结构老师讲课水平还不错的话(一般来说,大学老师讲课都很拉胯,可以自行到b站上或其他渠道找一些网课来学习),可以选择认真听讲他的课程,然后下来之后再消化一遍。

2.多敲代码,多刷题。这里所说的刷题不是盲目的刷,而是在掌握一部分的数据结构的知识点后,要根据自己学习的进度,找一些自己学过相关知识点的题目来练习巩固。这样不仅可以巩固自己所学的知识,还可以提高自己的编程能力和无形中提高自己的算法思维。刷题软件其实有很多,这里首推的还是LeetCode**

3.注意画图和思考。在数据结构的学习中,一定要学会画图。因为很多数据结构的题目都是和算法关联的,单靠自己大脑想象解题思路是不够的,还需要画图辅助理解,推演出解题算法,然后解决问题。

5.数据结构和算法书籍及资料推荐

关于数据结构书籍资料的推荐,其实在我们学习数据结构初期是不用花太多的时间或者根本就没必要去看数据结构方面的书籍。因为你对于数据结构的知识掌握不太够,是很难消化数据结构方面的书籍的,而且看书本知识学习的效率也不是很高。很容易从入门到放弃~ 而当自己将数据结构学习的差不多了,再去找基本优质的数据结构的书籍来学习,会起到很好的效果。这里推荐的书籍和资料有 《剑指offer》和《程序员代码面试指南》,里面的试题可以做一下,都是非常经典的面试题目.

初识时间复杂度和空间复杂度

1.算法效率

1.1 如何衡量一个算法的好坏?

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

cpp 复制代码
int Fib(int N)
{
	if (N < 3)
		return 1;

	return Fib(N - 1) + Fib(N - 2);
}

int main()
{
	int n = 0;
	scanf("%d", &n);
	int ret = Fib(n);
	printf("%d", ret);
	return 0;
}

斐波那契数列的递归实现方式非常简洁,但简洁一定好吗?那该如何衡量其好与坏呢?

1.2 算法的复杂度

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

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

2.时间复杂度

2.1时间复杂度的概念

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

Func1 执行的基本操作次数 :

F(n) = N^2+2*N+10

N = 10     F(N) = 130

N = 100    F(N) = 10210

N = 1000    F(N) = 1002010

实际中我们计算时间复杂度时,我们其实并不一定要计算精确的执行次数,而只需要大概执行次数 ,那么这里我们使用大O的渐进表示法, 用大O渐进表达式表达的结果为:O(N) = N^2。

3.空间复杂度

空间复杂度的概念

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

3.空间复杂度不是程序占用了多少bytes的空间,因为这个也没太大意义,所以空间复杂度算的是变量的个数

3.空间复杂度计算规则基本跟时间复杂度类似,也使用大O渐进表示法。

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

THE END

这是今日份关于数据结构的一些分享,希望可以帮助到大家!如果有什么不足的地方也请家人们给小叶一些好的建议,我会不断优化文章的!那就让我们一起加油吧!哈哈哈哈哈

相关推荐
ChoSeitaku2 小时前
链表交集相关算法题|AB链表公共元素生成链表C|AB链表交集存放于A|连续子序列|相交链表求交点位置(C)
数据结构·考研·链表
偷心编程2 小时前
双向链表专题
数据结构
香菜大丸2 小时前
链表的归并排序
数据结构·算法·链表
jrrz08282 小时前
LeetCode 热题100(七)【链表】(1)
数据结构·c++·算法·leetcode·链表
@小博的博客2 小时前
C++初阶学习第十弹——深入讲解vector的迭代器失效
数据结构·c++·学习
泉崎4 小时前
11.7比赛总结
数据结构·算法
你好helloworld4 小时前
滑动窗口最大值
数据结构·算法·leetcode
JSU_曾是此间年少5 小时前
数据结构——线性表与链表
数据结构·c++·算法
sjsjs116 小时前
【数据结构-合法括号字符串】【hard】【拼多多面试题】力扣32. 最长有效括号
数据结构·leetcode
blammmp6 小时前
Java:数据结构-枚举
java·开发语言·数据结构