数据结构与算法入门:从基础知识到时间复杂度
数据结构与算法入门:从基础知识到时间复杂度
什么是数据结构?有什么作用?
研究数据在内存当中是如何存储的结构叫做数据结构。简单来说,就是研究数据是以怎样的形式/结构被存储的。
什么是算法?
算法指的就是我们当前解决问题的方法。具体来说,就是实现增删改查等操作的一些方法。
进一步理解数据结构
数组和链表的简单举例
什么是数组?
数组(Array):一种基础的数据结构,用于存储具有相同数据类型的元素集合。
什么是链表?
链表(Linked List):由一系列节点组成,每个节点包含数据部分和指向下一个节点的指针(在双向链表中还会有指向前一个节点的指针)。节点在内存中不一定连续存储。
数组的基本特点
数组是一块连续的内存空间。
具体实例
- 查询操作
对于频繁的查询操作,如果数据量较大,链表会比数组慢得多。因为链表还有寻址时间。
数组:在内存中分配一块连续的空间来存储元素。每个元素的位置可以通过其索引直接计算出来。
链表:不支持随机访问,只能从头节点开始,逐个节点地顺序访问。
- 添加操作
链表更适合于那些需要频繁进行插入和删除操作的场景。
链表不像数组那样有固定的大小限制。它可以随着数据的插入和删除动态地增长和缩小,这意味着不需要预先分配一个固定大小的存储空间。在链表中插入一个新元素通常只需要改变几个指针的指向。即使在链表的头部或中间插入元素,也只需要找到正确的位置并修改指针,而不需要像数组那样移动其他元素。链表插入元素不需要连续的内存空间,因此不会出现数组中可能出现的因空间不足而需要重新分配内存和复制数据的情况。
比如,如果需要在9和4之间添加一个0,
对于数组来说,超出了本身分配的内存空间大小,所以需要重新分配一块连续的内存空间,然后再把数据放进去。
对于链表来说,只需要让9记录0的位置,0记录4的位置,即可。
结论
不同的数据结构对增删改查等一系列算法,所反应的具体时间是不同的。数据结构主要就是研究这个的。怎么能够更好地实现增删改查算法。
进一步理解算法
举例
情景题目:请你解答出 从1+2+3+4+5+...+10000 的结果。
方法一:累加。一直计算,逐一去加。
方法二:利用等差数列求和公式求解。
结论
算法,就是去研究怎么样去进行计算来解决实际问题的方法。
注意
数据结构没有优劣之分,但是算法有。上述例子,显然,求和公式更快于逐一累加,更高效。那么怎么评判算法的好与坏呢?根据什么认为一个算法不好、认为另一个算法好呢?
时间复杂度和空间复杂度。
时间复杂度和空间复杂度
是什么
时间复杂度和空间复杂度,本质上是一种数学算法。或者说,它们是抽象而来的一种数学问题。本质上说,时间复杂度是由时间抽象而来的,空间复杂度是由空间抽象而来的。粗略地来说:一个算法,最终解决问题所消耗的时间段,好算法;一个算法,实际占用的空间少,好算法。
哪个更占主导
在评判一个算法好坏时,主要是时间复杂度。空间复杂度,说白了,就是内存条,可以花钱来弥补。但是时间复杂度并不是,比如打开手机app,一直刷新,无法出现页面,用户体验感极差,不好用。
思考一下
时间复杂度为什么不用算法的真实时间?算法所用的具体时间能不能作为评价算法的标准?
不能。
算法执行完毕的真实事件,受很多方面的影响。比如:一个好算法处理的数据量非常多,那么所用时间就长;一个坏算法能够处理的数据量很少,用时也短。不能仅靠实际处理完毕的消耗时间来评判好坏。
时间复杂度并不等同于算法所用的真实时间。时间复杂度其实是算法所用时间的一个映射。
时间复杂度的得出是一个数学问题。把评价算法好坏的标准抽象成数学问题。