本类关于数据结构的知识总结主要针对期中期末考以及考研,其实是我自己想要让自己脑中的概念更加清晰所以想写写要点以及解决一些问题的代码,尽量写的通俗易懂(因为自用占比比较大,如果大家觉得有用的话可以收藏着看噢噢!)
本篇主要内容就是讲讲数据结构的基本概念、数据类型以及算法分析。一起看吧~
目录
术语
数据
能输入计算机中并能被计算机程序处理的符号的总称。
数据元素
即数据的基本单位。又称元素、记录等。如一名学生的信息(包括名字、学号、性别、电话号码、家庭住址等等)
数据项
组成数据元素的、有独立含义的、不可分割的最小单位。如某位学生的名字or学号or...
数据对象
性质相同的数据元素的集合。如所有学生的名字or学号or...不论数据元素集合是无限集(如整数集),或是有限集(如字母字符集),还是由多个数据项组成的复合数据元素(如学生表)的集合,只要集合内元素的性质均相同,都可称之为一个数据对象。
数据结构
逻辑结构
从逻辑关系上描述数据,与数据存储无关,是独立于计算机的。
要素:数据元素、关系
-
集合结构
关系:属于同一集合(比如一个班级可以看作一个集合)
-
线性结构
关系:一对一(比如一个学生对应自己一个学号)
-
树结构
关系:一对多(比如一个班级的班长管理全班同学)
-
图结构或网状结构
关系:多对多(比如班级中多为同学之间的朋友关系)
其中集合结构、树结构和图结构都属于非线性结构。
线性结构包括线性表、栈和队列、字符串、数组、广义表
非线性结构包括树和二叉树、有向图和无向图
现在不知道这些是什么的不用担心,后续慢慢都会讲到!
存储结构
-
顺序存储结构
所有元素一次存放在一片连续存储空间中
-
链式存储结构
无需存放在连续的存储空间,而是用指针(用于存放后继结点的首地址)连接起每个节点
数据类型和抽象数据类型
这些都是比较基础的就不赘述了(如果不明白的话可以参考这个博主写的
数据结构和抽象数据类型(ADT)简介_数据结构和抽象数据结构的特点-CSDN博客)
算法和算法分析
算法的特性
-
有穷性
一个算法必须总是在执行有穷步后结束,且每一步都必须在有穷时间内完成。
-
确定性
对于每种情况下所应执行的操作,在算法中都有确切的规定,不会产生二义性,使算法的执行者或阅读者都能明确其含义及如何执行。
-
可行性
算法中的所有操作都可以通过已经实现的基本操作运算执行有限次来实现。
-
输入
一个算法有零个或多个输入。当用函数描述算法时,输入往往是通过形参表示的,在它们被调用时,从主调函数获得输入值。
-
输出
一个算法有一个或多个输出,无输出的算法没有任何意义。当用函数描述算法时,输出多用返回值或引用类型的形参表示。
评价算法优劣的标准
正确性、可读性、健壮性、高效性、(低存储量)
算法原地工作的含义:算法需要的辅助空间相对于数据量为常数。
同一个算法,实现语言的级别越高,执行效率就越低
时间复杂度
分析时间复杂度的方法:首先,找出所有语句中语句频度最大的那条语句,其规模函数f(n),用O表示它的数量级即可。
举例:
{x++;s=0;} //T(n)=O(1) 只执行一次
for(i=0;i<100;i++)
{
x++;
s=0;
} //T(n)=O(1) 因为执行时间仍与n无关
for(i=0;i<n;i++)
{
x++;
s=0;
} //更改代码 T(n)=O(n)
for(i=0;i<=n;i++)
{
for(j=0;j<=n;j++)
{
final=a[i][j]; //1
}
} //此时两层循环 看到1代码的频度最大 T(n)=O(n^2)
for(i=0;i<n;i*=2)
{
x++;
s=i;
} //T(n)=O(log2 n)
常见的一些时间复杂度:
O(1) 常数阶
O(n) 线性阶
O(n^2) 平方阶
O(log n) 对数阶
O(1)<O(log n)<O(n)<O(nlog n)<O(n^2)<O(n^3)<O(2^n)<O(n!)<O(n^n)
最好、最坏和平均时间复杂度
-
最好时间复杂度
指的是算法计算量可能达到的最小值。最幸运的情况
-
最坏时间复杂度
指的是算法计算量可能达到的最大值。最悲惨的情况
-
平均时间复杂度
是指算法在所有可能情况下,按照输入实例以等概率出现时,算法计算量的加权平均值。
空间复杂度
定义
一个算法在运行过程中临时占用存储空间大小的量度 ,也就是额外占取的空间的大小。
空间复杂度算的是变量的个数
记作 S(n)=O(f(n))
例子
//题目: 将一维数组a中的n个数逆序存放到原数组中
//法一
for(i=0;i<n/2;i++)
{ t=a[i];
a[i]=a[n-i-1];
a[n-i-1]=t;
} // 仅需要另外借助一个变量t,与问题规模n大小无关,所以其空间复杂度为O(1)。
//法二
for(i=0;i<n;i++)
b[i]=a[n-i-1];
for(i=0;i<n;i++)
a[i]=b[i]; //要另外借助一个大小为n的辅助数组b,所以其空间复杂度为O(n)。
一般来说,我们主要关注时间复杂度,因为现在的运算空间都比较充足 !
本篇内容就是这些,如果哪里有误的请及时告知我噢!后续会持续更新...
(有什么建议也可以告诉我)
一起进步~