数据结构与算法学习之(一):基本概念介绍

在日常的开发中,代码效率是一个重要的指标。在近期的科研中由于测试量的庞大,为了缩短测试时间,需要提升效率,在科研之余,借助书籍和视频教程把数据结构这一重要知识重新梳理一遍,在提高自我的同时,也算是做一个教程,方便有需要的人学习,文字也会尽量避免枯燥乏味的概念定义,如有不足之处敬请指正,谢谢!

配套的书籍可以参考知乎大神的推荐, https://www.zhihu.com/question/34390525 根据自身功底和阅读习惯选择适合自己的书籍。视频是网上购买的,为尊重卖家利益,不公开下载地址,需要的可以私信。

本篇博客主要介绍数据结构和算法的对应概念,以及代码的时间复杂度(TI)和空间复杂度(SI)。

1.数据结构的概念
首先说说数据结构定义,官方的话是这么说的。



而用言简意赅的方法来说,就是研究数据元素 相互之间的特定关系
而数据结构分为逻辑结构和物理结构。
逻辑结构:数据对象中数据元素之间的相互关系。(重要)
物理结构:数据的逻辑结构在计算机中的存储形式。

逻辑结构又分为4种:集合结构(从属同一集合)、线性结构(一对一)、树形结构(一对多)以及图形结构(多对多)
 
数据结构与算法学习之(一):基本概念介绍_第1张图片        

而物理结构研究的实质上就是数据元素的存储,分为顺序存储结构和链表存储结构
顺序存储结构:相当于数组,每个元素依次排列。
链表存储结构:把数据元素存放在任意的存储单元中,在这种情况下每一个元素需要一个 具体的地址用以访问这个元素。

2.算法的概念
算法与数据结构的关系是密不可分的,先用一个例子来阐述算法的优越性。
在计算1+2+……+100时,很多时候用的是for循环,如下图左;但是如果使用以下算法,运算速度将会快很多,如下图右所示。

数据结构与算法学习之(一):基本概念介绍_第2张图片    

由上例引出算法的定义:算法是解决特定问题求解步骤的描述, 从实用角度来看就是减少复杂度的一些技巧。

算法有如下几个特性:输入、输出、有穷性、确定性和可行性。分开进行阐述。
输入:算法有0个或者多个输入。
输出:算法至少有1个或多个输出。
有穷性:在执行有限步骤后,自动结束,不会无穷执行。
确定性:每个步骤都有确定的含义。
可行性:每一步都是可行的。

在开发过程中,算法需要满足一些具体的要求,分为4个阶段,逐级递增。也是对算法是否完备的检验。
没有语法错误。
对于合法输入能产生满足要求输出。
对于非法输入能产生提示说明。
对于各种输入都有满足要求的输出结果。

3.时间复杂度和空间复杂度
在算法设计中,需要考虑时间效率和空间效率,即 时间效率高(执行快)以及 存储量低(冗余小),这就涉及到TI(时间复杂度)和SI(空间复杂度),这也是很多学科中涉及到的效率指标。

3.1时间复杂度
时间复杂度:在这里用简单的方法解释一下。就是随着输入的增多,执行时间的增长速率。增长速率最慢的算法为最优算法。时间复杂度用O(n)表示。
例如下图中的三个算法的时间复杂度分别为:
蓝色:O(1)
红色:O(n)
黑色:O(n^2)

数据结构与算法学习之(一):基本概念介绍_第3张图片

在分析时间复杂度时,可以运用简化思想。
在下图左中,虽然执行了7条语句,但都是单语句,无循环嵌套等功能,复杂度是O(1)
在下图右中,在for循环语句块中执行了n次,总的执行次数是n+1次,在衡量复杂度时, 只需考虑最高阶,最高阶前的系数可以忽略,因此复杂度为O(n)

数据结构与算法学习之(一):基本概念介绍_第4张图片        

在下图左中,由于加入了嵌套循环,总执行次数是n^2+1次,复杂度为O(n^2)
在下图右中,每次执行后i的值变为原来的2倍,因此只要2^x>=n即可,解出n=log2n(2为底数),因此复杂度为O(logn)
    
数据结构与算法学习之(一):基本概念介绍_第5张图片

常用的时间复杂度表以及对应关系如下。
  
数据结构与算法学习之(一):基本概念介绍_第6张图片

3.2 空间复杂度
空间复杂度与时间复杂度的关系是相互矛盾的,其中一个提高的结果会使另一个的效果降低,因此如何平衡也是一个具体运用中需要权衡的点。
空间复杂度的定义如下:

数据结构与算法学习之(一):基本概念介绍_第7张图片

举个简单的例子,在判断某一年是否是闰年的时候,可以采用普通的算法进行判断 ;也可以新建一个上千个元素的数组,把所有年份是否是闰年的结果存储在数组中。
前者节约了空间复杂度,但是每次查询都要经过计算,空间复杂度增大。
后者只需要提供一个数组的索引值即可返回判断结果,虽然空间复杂度大,但是时间复杂度小。

你可能感兴趣的:(数据结构与算法)