数据结构基础


用程序解决问题时,往往需要将具体问题抽象为数学模型,再用具体算法进行解决,这个抽象数学模型的过程即位分析问题的过程。程序描述数学模型不再是数学方程式,而是采用数据结构。

一、数据结构的基本相关概念
什么是数据结构?数据结构是基本元素,及其之间存在的一种或多种特定关系的集合。

根据不同的数据关系,可以采用不同的数据结构,数据关系的特性分类:
--集合:除了属于某同一集合,并无其他特定关系;
--线性:数据之间存在一对一的关系;
--树:数据之间存在一对多的关系;
--图或网:数据之间存在多对多的关系;

数据类型分类:
--基本数据类型:原子类型、结构类型;原子类型是不可再分解的数据类型;
--抽象数据类型:包括:数据对象、数据关系、基本操作
--多形数据类型:指存在相同关系,但元素值得成分类型不确定;
抽象数据类型分为:
--原子类型;
--固定聚合类型:变量数目和值的成分确定;
--可变聚合类型:变量数目或值得成分不确定;
数据关系:
数据元素之间的关系计算机中有两种不同的表示方法:顺序映像和非顺序映像,由此得到两种不同的存储结构:顺序存储和链式存储。

二、算法效率的度量(运行时间/存储空间复杂度的大O表示)
T(n)=O(f(n))
S(n)=O(f(n))
表示算法执行时间或空间的增长率和f(n)的增长率相同;常见的f(n)有常量阶、线性阶(如f(n)=n)、平方阶(f(n)=n^2)、对数阶(logn)、指数阶(2^n)等;通常我们不希望用指数阶。

三、线性结构
1、线性表
--连续存储顺序表示[原子类型数组];
--链式表示:线性链表(单链表)、循环链表、双向链表......(结点、头/尾结点);链表采用非指针表示,而采用数组标号的方式,称为静态链表。

2、栈LIFO
--同样有两种表示方式(静态/链式、表尾即栈顶、栈底),典型:括号匹配、迷宫问题、算式求解等问题;
--问题简化:如迷宫问题简化为最简单的场景考虑,扩展到整体情形;
--递归与迭代:自上而下/自下而上解决问题;递归函数:通过一系列自己调用自己的函数。

3、队列FIFO
--队头/队尾;双端队列、输出受限双端队列(两端输入一端输出)、输入受限双端队列(两端输出一端输入);
--循环队列:典型共享buffer/读写指针方式;

4、串
--字符串:是由零个或多个字符组成的有限序列;
--连续存储: 定长顺序存储、堆分配存储、链式存储、块链式存储(差别:结点里存储多个字符);
--模式匹配的优化算法KMP;

5、广义数组和广义表
--十字链表:需要标志位标志原子或子表;

四、树结构
--基本定义:根、子树、叶子、孩子、兄弟、双亲... ...数的集合叫森林、层次;
--有序树:各个子树丛左到右有次序,不能互换的树,否则为无序树;
--树的存储法:(数组+index、链表)双亲表示法,孩子表示法,孩子兄弟表示法;

二叉树
--每个节点最多只有两个子树;
--顺序表示:按照次序:从上至下、从左至右连续空间存储;
--链式表示:链表方式
--遍历二叉树:先序、中序、后序(树根的顺序不同:根->左->右;左->根->右;左->右->根);
--线索二叉树:带有"线索标志"如果左孩子没有,指向其前驱;右孩子没有,指向其后继;

最优二叉树(huffman树)
--树的长度(根到每个节点的路径和,路径长度:根到结点分支数目和)最短的树(结点权重*结点深度);
--huffman编码:概率越大路径越短;(试探/回溯=>递归)

平衡二叉树(BalancedBinary Tree 或 Heigh-Balanced Tree)
--所有结点的平衡因子(BF:BalanceFactor)为-1、0和1;
--结点的平衡因子的定义:结点的左子树的深度减去右子树的深度;

五、图结构
基本定义:
每个元素为顶点;有向图:弧、起始点为弧尾,终点为弧头;有向图与无向图,有向完全图;稀疏图与稠密图;子图;无向图连接的两个顶点互为邻接点;弧/边上的数称为权;相关的边为度(入度/出度);

最后一个顶点和第一个顶点相同的路径称为回路或环;顶点不重复出现的路径为简单路径;除了第一个顶点和最后一个顶点其他都不相同的回路称为简单回路或简单环。

任意顶点都有路径,则这两个顶点是连通的;任意两点都连通的图叫连通图;非连通图有多个连通分量,连通分量是无向图中的极大连通分量。有向图中相应称为强连通图和强连通分量。

生成树是一个极小的连通子图,包含图中的所有顶点,但足以构成一颗树含(n-1)条边。

图的存储结构:
--数组表示法/矩阵;
--邻接表:以各个顶点为头结点的单链表组成;
--十字链表:有向图,邻接表加逆邻接表;一个结点包含邻接表和逆邻接表两个链表;
--邻接多重表:类似十字链表,每个节点表示边的信息,分别存储该节点相关的两个顶点各自的下个相关的边的信息;

图的遍历:深度优先与广度有先

最小生成树(带边权值求和最小的树):Prim及Kruskal,两种算法差别:Prim采用已经在生成树中的顶点寻找下一条边,而Kruskal一直取最小边来判断;

拓扑排序/关键路径(基于有向无环图)
--拓扑排序,AOV(Activity On Vertex Network顶点表示活动,而弧表示优先关系的有向无环图)。处理在有向图中选一个没有入度的顶点输出,从图中删除所有以此顶点为尾的弧;
--关键路径(Critical Path),AOE(Activity on Edge)即边表示活动的网络。AOE网是一个边带权值的有向无环图,AOE网可以用来估算工程耗费的时间。零入度的顶点叫源点,出度为零的顶点叫汇点。零点到汇点之间的最长路径叫关键路径。因此非关键活动并不能加快工程进度。

最短路径问题
--某一源点到其他终点的最短路径;(Dijkstra算法,按路径长度递增)。
--每一顶点之间的最短路径;(重复执行Dijkstra 多次/Floyd算法,不停迭代n^3... ...);

六、动态内存管理
基本概念
--已经分配给用户使用内存称为"占用块";未曾分为用户使用的内存块"空闲块"或"可利用空间块";
--记录"空闲块"链式结构的可利用空间表;
--可利用空间表根据不同分配方式的三种结构形式:1、固定相同存储空间大小;2、受限可变(即存在多种固定的大小);3、完全不固定大小可变;[存储块与存储池]
--分配算法:首次拟合法、最佳拟合法、最差拟合法;

边界标识法
--在每个存储空间的头部和尾部增加标识信息,表识当前块信息、链表信息以及是否使用;
--相邻存储区域连续都不使用的时刻可以进行合并;
--循环链表法可以没有固定的链表头,依据不同的分配算法;

伙伴系统
--空间大小为2^k次方,当需要分配的空间没有空闲表时,可以从大的空间拆分得来,m类空间大小,需要m可用空间链表指针,内存块带有标识头信息;
--只有互为伙伴的(即从一块内存分配出来的)内存才可以在释放的时候合并,亦即连续空间不一定可以做合并;
--优点:简单、速度快;缺点:容易产生内存碎片;

无用单元收集两个途径
--引用(使用)记数器:只有当记数器值为0时,才可以释放该空间;
--直到可利用空间表为空时,中断程序执行,将所有未使用的空间重新链接成新的可使用空间表;

存储压缩
可用空间表为连续存储空间(堆?);对于释放出空间碎片需要进行存储压缩,一般两种方式:
--一旦用户释放即可进行压缩;
--指示可用空间指针一直往上增加,只有没有剩余可用空间时再进行压缩。
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值