数据结构基础学习笔记(1)——
一. 绪论
数据结构的内容:逻辑结构、存储结构、运算集合。
数据类型:一个值的集合和定义在此集合上的一组操作的总称。
抽象数据类型:abstract data type,用户经行软件设计时从问题的数学模型中抽象出来的逻辑数据结构和逻辑数据结构上的运算,而不考虑计算机具体存储结构和运算的具体实现算法。此模块包含定义、表示和实现。也就是数据对象的定义、数据关系的定义、基本操作的定义。
算法特征:有穷性、确定性、可行性、输入、输出
算法设计的要求:正确性、可读性、健壮性、高效率和低存储的要求。
时间复杂度,空间复杂度。给一个程序要会算,常考。
二. 线性表
(笔试面试重点 :
笔试选择题经常出,要牢记顺序表和链表的定义、性质、优缺点,考题很活但不难;
编程题面试笔试都会有:有头结点和无头结点的链表的反转、2个链表或数组的合并、3个数组归并……)
定义:一个线性表示具有n个数据元素的有限序列
特点:同一性、有穷性、有序性
顺序表特点:
· 无需为表示元素间的逻辑关系而增加额外的存储空间
· 可随机取表的任一个元素
· 插入或删除元素,需平均移动表的一半元素。
· 存储分配只能预先进行分配
· 将2个各有n个元素的有序表归并为一个有序表,其最少的比较次数是:n
线性表链式存储结构的特点:
· 任意的存储单元存储元素,不要去逻辑上相邻的元素在物理位置上也相邻。
· 插入删除时不需要移动大量元素
· 失去顺序表可随机存取的优点
静态链表(数组表示和实现)
· 在单链表中,不能从当前结点出发访问到任一结点。
· 删除某一结点,必须找到该结点的前驱结点
· 此结构是一种顺序存取的存取结构,不具有随机访问任一元素的特点。
· 设置头结点的作用,使用在链表的第一个位置上的操作和表中其他位置上的操作一致,无需进行特殊处理,对空表和非空表的处理统一。
其他链表: 循环链表、双链表要了解
三. 限定性线性表——栈和队列
(笔试面试重点 :
笔试选择题经常出,一般都是从队列的进出顺序上做文章;
编程题一般出在笔试,相对难一点:如迷宫、深搜、广搜 )
3.1 栈
· 栈是一种具有线性结构的数据结构,是操作受限的线性表
· 栈的特点是后进先出,只能在栈顶进行插入和删除操作,入栈、出栈
· 顺序栈中,栈空标志:S.top=S.base;
栈满标志:S.top-S.base>=S.stacksize;
· 链栈中,不设头结点,头结点就是栈顶指针,栈空S=NULL。
· 用于:数值转换,括号匹配检验、行编辑程序,迷宫问题、算数表达式求值(2个栈),递归的实现
递归(算法设计方法):后调用先返回
特点:分而知之、把复杂问题分解为简单问题的求解方法;时间效率低。
3.2 队列
· 一种具有线性结构的数据结构,是操作受限的线性表;
· 先进先出,只能在队尾插入元素和队头删除元素,称为入队列和出队列;
队满标志:(Q.rear+1)%MAXOQSIZE==Q.front
· 链队列中,队空标志:Q.front=Q.rear
空间范围内不会出现队满的情况。
· 其他,了解定义:双端队列、输出受限的双端队列,输入受限的双端队列
四. 串
(笔试重点 :
笔试选择题:好像有算子串的个数吧,方正不多;
编程题笔试偏多偏简单,算送分题多,就是那种一版会编程的读了题就能做的,eg,字符串局部位旋转,单词颠倒等)
串(字符串):是零个或多个字符组成的有限序列,一般记为S=‘a1a2…..an’,属于取值受限的线性表
子串:串中任意个连续的字符组成的子序列称为该串的子串。“ ϕ”为任意串的子串。
主串:包含子串的串相应地称为主串
位置:字符在串中的序号称为该字符在串中的位置。
串相等:只有两个串的长度相等,且每个对应的字符都相等时才相等。
空格串:由一个或多个空格组成的串,非空串。
存储:
· 定长顺序串:存储分配是在编译时完成的,用一组地址连续的存储单元存储串的字符序列。(开始下标:0,;结束标志字“\0”)
· 堆分配存储(堆串),用称为“堆”的自由存储空间,并可用malloc()和free()函数完成动态存储管理。
· 串的块链存储表示(链表)
串的模糊匹配算法:朴素模式匹配算法(Brute-Force算法,简单匹配算法)、KMP算法
五 . 数组和广义表
(见过相关的选择题,出的不多,了解概念就好)
数组定义:n(n>1)个相同类型数据元素a0,a1,…,an-1构成的有限序列,且该有限序列存储在一块地址连续的内存单元中。是线性表在元素上的扩展。
矩阵的压缩存储:特殊存储(对称矩阵、三角矩阵、对角矩阵)
广义表
定义:是线性表的推广,是由零个或多个单元素或子元素所组成的有限序列
广义表的长度:表中所含元素的个数n
广义表的深度:广义表展开后所含的括号的最大层数
表头:非空时,称第一个元素a1为广义表的表头,可能是原子,也可能是广义表;
表位:其余元素组成的表(a2,a3…….an)称为广义表的表尾,一定是广义表。
存储:头尾链表存储表示、扩展线性存储表示、
六. 树
(笔试重点 :
笔试选择题:考题种类多,主要集中在遍历方法和二叉树上;
编程题笔试多,遍历树,构建二叉树,早最长路径,找公共祖先,找叶子结点等,多刷刷leetcode就好)
6.1 树
定义:n(n>0)个结点的有限制,n==0为空树;非空树满足(有且只有一个特定的称为root的结点,其余n-1个结点可以划分成m个互不相交的有限集,没一部分又是一棵树)
表示方法:树形表示法;文氏图表示法;凹入表示法;括号表示法(广义表表示法)
基本术语:结点,结点的度,树的度,叶子,分支结点,孩子、双亲、兄弟、堂兄弟,路径与路径长度,结点的祖先和子孙,层次与高度,有序树和无序树,森林。
存储:双亲表示法、孩子表示法、孩子兄弟表示法
遍历方法:
前序遍历(访问根节点再访问左子树和访问右子树之前)、
中序遍历(访问根节点在访问左子树和访问右子树两者之间)、
后序遍历(访问根节点在访问左子树和访问右子树之后)。
6.2 二叉树
要求:每个结点的度都不大于2,每个结点的孩子结点次序不能任意颠倒。
深度: 定义一棵树的根节点所在的层次为 1 ,其他节点所在的层次等于它的父节点所在的层次加1 ,树的最大层次称为树的深度。深度包括本身的层次结构
性质:
· 二叉树的第i层至多有2i-1个结点
· 深度为k的二叉树至多有2k-1个结点
· 对任意一个二叉树,若终端结点数为n0,度为2的结点数为n2,则n0=n2+1。
· 具有n个结点的完全二叉树的深度为
特殊树:满二叉树,完全二叉树
完全二叉树:设二叉树的深度为h,除第 h层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h层所有的结点都连续集中在最左边
满二叉树:深度为k且有2^k-1个结点的二叉树称为满二叉树
二叉排序树的任意节点,左小右大,
存储:顺序存储,链式存储结构
6.3 森林——(多颗树组成森林)
6.3.1 遍历方法:先根遍历、后跟遍历
6.3.2 哈夫曼树:最小带权路径长度的二叉树称为哈夫曼树。
ps:哈夫曼树是特殊的二叉树,每个结点上加上权值
6.3.3 路径长度:一个结点到另一个结点之间的分支数目称为路径长度。
树的路径长度(树根到每个结点的路径长度之和),结点的权,带权路径长度
树的带权路径长度WPL:树中所有叶子结点的带权路径长度之和。
注意:
· 给定树的先根遍历序列和后根遍历序列可唯一画出一棵树。
· 给定森林的先序遍历序列和中序遍历序列可唯一确定一森林
· 任何n个不同结点的二叉树,都可以由它的中序序列和先序序列(中序和后序)唯一地确定
七. 图
(笔试重点 :
笔试选择题:考题种类多,像遍历、拓扑结构,关键路劲等;
面试中被问过概念:关键路径和最短路径的区别
编程题很少有,记得在微软的上机笔试中见过,)
定义:两个集合V、E组成,记为G=(V,E),其中V是顶点的有限集合,E是连接V中两个不同顶点(顶点对)的边的有限集合,记为E(G)。
基本术语:完全图、稀疏图、稠密图、子图、顶点的度(入度、出度)、权与网、路径和图、连通图、强连通图(来回都连通)、连通分量等
存储结构:邻接矩阵表示法(数组表示法)、邻接表存储方法,邻接多重表
、十字链表(有向图的邻接表和逆邻接表结合在一起)、
遍历:深度优先搜索、广度优先搜索
最小生成树:
- prim(普里姆)算法,从点出发,每次遍历,在连通的边中寻找权值最小的边。到最后回归起始点
- Kruskal(克鲁斯卡尔)算法,从边出发,每次寻找权值最小的且不会生成图的边。时间复杂度O(eloge)
AVO网:用顶点表示活动,边表示活动的顺序关系的有向图称为AOV网。
拓扑排序:在一个有向图中找一个拓扑序列(当且仅当该顶点序列满足: 若<vi,vj>是图中的弧,则在序列中顶点vi必须排在顶点vj之前)的过程称为拓扑排序。
关键路径:从源点(唯一的入度为0的点)到汇点(出度为0的点)的最长路径路径的长度即为完成整个工程任务所需的时间,该路径叫做关键路径。
最短路径:
- Dijkstra(迪杰斯特拉),贪心算法,按路径长度递增的次序产生最短路径。
- Floyd(弗洛伊德) D(k)[i][j] = Min { D(k-1)[i][j], D(k-1)[i][k] + D(k-1)[k][j] }, k = 0,1,…, n-1
八. 动态存储管理
新用户请求分配内存:一,系统继续从地址的空闲中分配地址,直到无法分配,才回收不在使用的空闲块。二,运行结束,就把它所占的内存释放成空闲块。
分配策略:首次拟合发,最佳拟合法(适用最广),最差拟合法。
九. 查找
(面试笔试重点 :
笔试选择题、简答题都有,要会画查找的哈希表、会计算平均查找时间;
面试编程:折半查找;
面试经常考:可能因为我研究生的方向是与数据查询有关的,经常被问到解决哈希冲突的方法,问的细了,还问各个的优缺点,一般何时用)
基本术语:文件,记录、字段(数据的最小单位)、关键字、主关键字、次关键字
静态查找表:查询某个特定的元素是否在表中;检索某个特定的元素的各种属性。查找方法为 顺序查找、折半查找、索引顺序表查找
动态查找表:若在查找的同时对表做修改运算(如插入和删除)
· 二叉排序树,有序表,和折半查找类似;中序遍历此树得到有序序列
· 平衡二叉树,二叉排序树中每个结点的左、右子树的高度至多相差1。
· B树:多路平衡查找树,一种组织和维护外存文件系统非常有效的数据结构。B-树的查找过程是一个顺指针查找结点和在结点的关键字中进行查找交叉进行的过程。B+树是B-树的一种变形,应用更普遍。
平均查找长度ASL:确定数据元素在表中的位置,需和给定值进行比较的关键字个数的期望值 。
哈希表:
· 别名:散列法,杂凑法或关键字地址计算法等,称为哈希表或散列表。
· 基本思想,p=H(key),H称为哈希函数,是从关键字空间到存储地址空间的一种映射。
· 构造方法:直接定地址法、数字分析法、平方取中法、折叠法、除留余数法、伪随机数法
· 处理冲突的方法:开放地址法(线性探测再散列,二次探测再散列,随机探测在散列)、在hash法、建立公共溢出区、链地址法
十 . 排序
(面试笔试重点,重中之重呀!!!!! :
笔试选择题:一般偏概念,要熟练各个排序算法的步骤、时间复杂度、空间复杂度、稳定性、会算移动次数等;
面试经常考:现场编程,让写过递归与非递归的快排、递归与非递归的归并排序、堆排序,所以这章真的真的很重要)
概念:将一组杂乱无章的数据按一定的规律顺序排列起来,使之按关键字递增(0或递减)有序排列。了解稳定排序的意义
排序时间开销:算法执行中关键字比较次数和记录移动次数来衡量。
内部排序:待排序记录存放在计算机随机存储中进行的排序过程。
外部排序:待排序记录数量大,在排序过程中尚需对外存进行访问的排序过程。
方法分类:
插入排序:将待排序记录按其关键字大小插入到前面已经排好序的子表中的适当位置,知道全部插入完全为止。包括:直接插入排序、折半插入排序、2-路插入排序、表插入排序、希尔排序(缩小增量排序,多趟)。主要应用“比较”和“移动”。
交换排序:通过不断比较相邻元素大小,进行交换来实现排序。冒泡排序、快排。
选择排序:每一趟都选出一个最大或最小的元素,并放在合适的位置。有简单选择排序、树形选择排序、堆排序。
归并排序:将2个或两个以上的有序表合成一个新的有序表。
基数排序:通过“分配”和“收集”过程来实现排序,是一种借助于多关键字排序的思想对单关键字排序的方法。包括多关键字排序,链式基数排序,
各个排序算法比较: