12.11
昨天12.10通过了实验室的第一次面试,今天开始进行数据结构和算法的学习。资料《大话数据结构》。
这本书的讲解方式很新颖,是把学生带到一个模拟上课的真实情景中来学习。先了解了数据结构的起源,接着正式介绍了一些相关概念。
由这些概念,从而得到数据结构的定义:数据结构是相互之间存在一种或多种特定关系的数据元素的集合。不同的结构从不同的角度,方向来讨论,有不同的分类。
逻辑结构:数据对象中数据元素之间的相互关系,分四种:
1.集合结构,与数学中集合的概念类似,集合中的各个元素都是一样的,不存在优劣。
2.线性结构:元素之间是一对一的关系。
3.树形结构:一对多的层次关系。
4.图形结构:多对多的关系。
逻辑结构是针对具体问题的,为了解决某个问题,选择一个合适的数据结构表示数据元素之间的逻辑关系。
物理结构:数据的逻辑结构在计算机中的存储形式,即如何把数据元素存储到计算机的存储器中。分两种
1.顺序存储结构:把数据存放在地址连续的存储单元里
2.链式存储结构:把数据放在任意的存储单元里,存储单元可以连续,也可以不连续,需要通过指针查找
逻辑结构面向问题,物理结构面向计算机,基本目标是把数据及其逻辑关系存储到计算机的内存中。
抽象数据类型(ADT)
数据类型:指一组性质相同的值的集合及定义在此集合上的一些操作的总称。分为两类:原子类型:不可以再分割的基本类型。结构类型:由若干个类型组合而成,可以继续分解。
抽象数据类型:指一个数学模型及定义在该模型上的一组操作。定义仅仅取决于它的一组逻辑特性,与其在计算机内部如何表示和实现无关。
标准格式如下
12.12
今天看的是第二章算法。
算法定义:什么是算法?算法是解决特定问题求解步骤的描述,在计算机中为指令的有限序列,并且每条指令表示一个或多个操作。
算法特性:有穷性,确定性,可行性,输入输出。
算法设计的要求:正确性,可读性,健壮性,高效率和低储存量等要求。
算法的度量方法:事后统计方法(不科学,不准确),事前分析估算方法。
函数的渐近增长:
算法时间复杂度:
推导大O阶方法:
常见的时间复杂度所耗时间大小排列
12.13线性表
线性表:零个或多个数据元素的有限序列
当线性表的元素的个数n定义为线性表的长度,n=0时,称为空表。
线性表的抽象数据类型:
线性表的顺序存储结构:指的是用一段地址连续的存储单元依次存储线性表的数据元素。
这里可以得到描述顺序存储结构需要三个属性:
存储空格的起始位置数组data,他的存储位置就是存储空间的存储位置。
线性表的最大存储容量:数组长度MaxSize。
线性表的当前长度:length。
数组长度与线性表长度区别:
数组长度是存放线性表的存储空间的长度,存储分配后这个量一般是不变的。线性表的长度是线性表中元素的个数,这个量是变化的。在任意时刻,线性表的长度小于数组长度。
地址计算方法:
数据元素的序号和存放它的数组下标之间存在对应关系,
由于线性表可能会进行插入和删除操作,所以数组长度要大于线性表长度。
LOC表示获得存储位置的函数。
对于第i个元素ai的存储位置可以推算出来,得到通项公式。
顺序存储结构的插入和删除
获得元素操作:
插入操作:
代码不难理解,但想要写出来确实不容易。
删除操作:
插入和删除的时间复杂度都是o(n)。
线性表顺序存储结构的优缺点:
线性表的链式存储。
特点:用一组任意的存储单元存储线性表的数据元素,存储单元可以是连续的也可以是不连续的。
把存储数据元素信息的域称为数据域,把存储直接后继位置的域称为指针域。指针域中存储的信息称作指针或链。这两部分信息组合数据元素的存储映像,称为结点。n个结点链接成一个链表,即线性表的链式存储结构。
把链表中第一个节点的存储位置叫做头指针,线性链表的最后一个结点指针为空指针用NULL或者^表示
头结点:头结点的数据域可以不存储任何信息,头结点的指针域指向第一个节点的指针
头结点与头指针的区别
线性表链式存储结构代码描述
1.若为空表,则头结点的指针域为空
这张图很形象的标明了各个概念之间关系。
单链表中,可以用C语言的结构指针来描述
单链表的读取
思路如下:
即从头开始找,直到第i个结点为止
时间复杂度为o(n),核心思想“工作指针后移”。
单链表的插入与删除:
单链表的插入:假设存储元素e的结点为s,要实现结点p,p-nxet和s之间的逻辑关系变化,只要把结点s插入到结点p和p-next之间即可
即把p的后继结点改成s的后继结点,再把结点s变为p的后继结点
单链表表头表尾的操作是相同的
单链表第i个数据插入结点的算法思路:
代码如下:
单链表的删除:设存储元素ai的结点为q,要实现将结点q删除单链表的操作,其实就是将他的前继结点的指针绕过,指向它的后继结点
单链表中第i个数据删除结点的算法思路:
代码
这段代码使用的时插队的方法,始终让新结点在第一的位置,这种算法简称为头插法,也有尾插法
这些代码能看懂,但目前无法自己写出来