数据结构作为软件工程师必备的知识之一,同时也是计算机考研的专业课程之一,在人人都在说着算法的今天,从头开始学习数据结构同时也写当作数据结构的复习笔记(本系列出现的代码和案例会在文章最后标注出,主要来自严蔚敏的《数据结构》,仅作为学习分享使用,不作商业用途)
by the way ,因为本人是考研党,所以在下文中会尽量将专业的名词单词都写出来,有意识的去学学这些专业单词我认为对英文还是有帮助的
数据结构第一个最重要的概念就是--复杂度!
复杂度分为时间复杂度 和空间复杂度,一般人们广泛用来判断一个算法效率的主要依据就是时间复杂度;
时间复杂度定义:在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级,记作T(n)=o(f(n)).
请看下面的例子
算法1: 一个简单的从1加到100的算法
int i ,sum = 0, n =100; // 执行1次
for(i=0;i<=n;i++) // 执行n+1次
{
sum =sum +i; // 执行n次
}
高斯算法:
int sum = 0, n = 100; // 执行1次
sum = (1+n)*n/2; // 执行1次
第一种算法CPU共执行了2n+2次运算,第二种算法CPU执行了2次运算,所以第二种算法明显是要优于第一种算法的,因为执行同样一个功能,第二种的时间复杂度仅o(1)。为什么执行了两次运算而时间复杂度却仅为1呢?
因为在计算算法的时间复杂度的时候,我们对于常数的复杂度统一忽略前面的系数,而只用计算它的最高项的次数。故第一种算法复杂度(文章下所有时间复杂度统称复杂度)为o(n).
那么同理,对于二维数组,需要嵌套循环执行的算法,它的复杂度为o(n^2).
既然是数据结构,那么数据都有哪些类型呢,大家都学过C语言,这也是编程梦开始的地方,在《C语言程序设计》这本书中,第一章就花费大篇幅进行数据类型的讲解。以C语言为例
1、原子类型:不可以在分解的类型,如整型、浮点型、字符型等
2、结构类型:由若干个类型组合而成,是可以再分解的,例如数组,字符串型等
--线性表(list):线性表是由零个或多个数据元素组成的有限序列。注意,这里的有限序列即代表了数据中的元素有先来
Initlist(*L)--初始化操作,创建一个空的线性表。
ListEmpty(L)--判断线性表是否为空,若空返回T,否返回F。
ClearList(*L)--将线性表清空。
GetElem(L , i ,*e)--将线性表中的第i个位置的元素返回给e。
LocatElem(L, e)--再线性表中查找与给定值相等的元素,如果查找成功返回1,查找失败返回0。
ListInert(*L , i ,e)--在线性表中第i个位置插入新元素e。
ListDelet(*L , i , *e)--删除线性表中的第i个位置的元素并用e返回
ListLength(L)--返回线性表的元素个数
--线性表:线性表是由零个或多个数据元素组成的有限序列
线性表的两种存储方式:1、顺序存储结构
2、链式存储结构
顺序存储结构:顾名思义是从起始位置以此排列的线性结构。
顺序存储的三个属性:1、存储空间的起始位置
2、线性表的最大存储容量
3、线性表的当前长度(length)
顺序存储的优点:1、无须为元素的逻辑关系开辟额外的存储空间。
2、可以快速的取表中的任意位置的元素
缺点:插入和删除需要移动大量元素
当线性表长度变化比较大时,难以确定存储空间容量
线性表的链式存储结构:1、除了存储其本身的信息之外,还需要存储一个指向下一个元素地址。也就是C语言中的指针,指向下一个。
2 、 把存储数据元素信息的域称为数据域,把存储后继位置的域称为指针域,这两部分加起来叫做结点。
图像来源:小甲鱼《数据结构和算法》
对于单链表一定有头有尾,第一个结点叫做头指针,最后一个叫做空(null)或^表示。
参考文献:
小甲鱼--《数据结构和算法》 网课地址:https://www.bilibili.com/video/BV1jW411K7yg?p=9
严蔚敏--《数据结构》-C语言版