一、数据结构的分类
从上图可以看到,整个数据结构与算法研究的知识体系也就这么多。还记得刚刚提到的时间效率与空间效率嘛?逻辑结构与存储结构都是为其服务的。而数据的运算是时间效率和空间效率的表现形式。
二、数据结构的分析
数据之间的相互关系称之为逻辑结构。比如集合、线性结构(一对一)、树形结构(一对多)、图形结构(多对多)。
数据在计算机中的存储形式称之为存储结构。
- 顺序存储:他是用数据元素在存储器中的相对位置来表示数据元素之间的逻辑关系
- 链式存储:在每一个数据元素中增加一个存放地址的指针,用指针表示元素之间的逻辑关系。
三、时间复杂度与空间复杂度
在文章一开始就描述了时间效率和空间效率,那么他们两个该怎么使用数据去量化呢?或者说是我们该怎么去衡量时间效率和空间效率呢?这就用到了时间复杂度和空间复杂度。
1、首先看时间复杂度:
想要了解时间复杂度,就需要先了解时间频度。一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。一个算法中的语句执行次数称为语句频度或时间频度。记为T(n)。
接下来就引入了时间复杂度的概念。看一下比较官方的定义吧:一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n)),称O(f(n)) 为算法的渐进时间复杂度,简称时间复杂度。是不是比较难以理解,说白了时间复杂度就是描述时间的规模,比如说时间频度是T(n),时间复杂度就是O(n)。时间频度是T(n+n)的时候,时间复杂度还是O(n)。也就是他的时间规模就是n这个层次了。
常见的算法的时间 复杂度之间的关系为:
O(1)<O(logn)<O(n)<O(nlog n)<O(n2)<O(2n)<O(n!)<O(nn)
举个例子吧:
a=0; //(1) for(i=1;i<=n;i++) //(2) for(j=1;j<=n;j++) //(3) a++; //(4)
语句(1)执行1次,
语句(2)执行n次
语句(3)执行n2次
语句(4)执行n2次
T(n) = 1+n+2n2= O(n2)
2、空间复杂度
空间复杂度就比较容易理解了,空间复杂度是对一个算法在运行过程中临时占用存储空间大小的一个量度,同样反映的是一个空间规模,我们用 S(n) 来定义。
空间复杂度比较常用的有:O(1)、O(n)、O(n²)