数据结构--读书笔记
Y_mmmmmmm
这个作者很懒,什么都没留下…
展开
-
0. 基本概念
数据结构是指具有某种联系的数据元素以及元素之间所构成的各种关系组成的集合静态数据结构:在创建时大小固定,如数组动态数据结构:大小是可变的,因而它可以在任何时候扩大或者缩小每一种数据结构都需要有插入、删除、查找等操作来处理包含在其中的数据数据的逻辑结构可分为线性结构、树结构和图结构线性结构的一般定义:除第一个和最后一个数据元素外,每个数据元素只有一个前驱数据元素和一个后继数据元素。该结构的数原创 2017-06-29 21:32:54 · 219 阅读 · 0 评论 -
14. 图--最小生成树
最小生成树Minimum Spanning Tree定义是一棵树 无回路V V 个顶点一定有V−1 V-1 条边是生成树 包含全部顶点V−1 V-1 条边都在图里边的权重和最小注:向生成树中任加一条边都一定构成回路最小生成树存在 ↔ \leftrightarrow 图连通生成算法最小生成树算法是贪心算法的应用。什么是“贪”:每一步都要最好的什么是“好”:权重最小的边需要原创 2017-07-16 12:44:17 · 280 阅读 · 0 评论 -
15. 图--拓扑排序
拓扑排序定义拓扑序:如果在图中从V V 到W W 有一条有向路径,则V V 一定排在W W 之前。满足此条件的顶点序列称为一个拓扑序。拓扑排序:获得一个拓扑序的过程。AOV(Activity On Vertex)网络如果有合理的拓扑序,则必定是有向无环图(Directed Acyclic Graph,DAG)基本算法每次输出入度为0的顶点,输出以后将该顶点的邻接点的入度减一实现采用队列存储原创 2017-07-16 12:46:05 · 284 阅读 · 0 评论 -
16. 排序--简单排序
排序方法模板void X_Sort(ElementType[] A, int N)大多数情况下,为简单起见,讨论从小到大的整数排序N是正整数,表示数组的长度前提只讨论基于比较的排序(例如通过 > = < 进行比较)只讨论内部排序(所有数据加载入内存中)稳定性:任意两个相等的数据,排序前后的相对位置不发生改变没有一种排序是任何情况下都表现最好的简单排序冒泡排序算法原理从后往前开始遍历:原创 2017-07-16 19:42:20 · 246 阅读 · 0 评论 -
17. 排序--希尔排序
希尔排序希尔排序是插入排序的改进,增加了间隔排序(间隔排序算法与插入排序相似),最后进行插入排序算法原理定义增量序列DM>DM−1>...>D1=1 D_M > D_{M-1} > ... >D_1 = 1 对每个Dk D_k 进行”Dk− D_k- 间隔“排序(k=M,M−1,...,1 k=M,M-1,...,1 )注意:”Dk− D_k- 间隔“有序的序列,在执行”Dk−1− D_{k-原创 2017-07-17 11:00:22 · 371 阅读 · 0 评论 -
18. 排序--堆排序
堆排序堆排序的前身–选择排序void Selection_Sort(ElementType[] A, int N) { for (int i = 0; i < N; i++) { // 从A[i]到A{N-1}中找到最小元,并将其位置赋给MinPosition MinPosition = ScanForMin(A, i, N - 1); // 将原创 2017-07-17 11:01:29 · 254 阅读 · 0 评论 -
19. 排序--归并排序
归并排序将已有序的子序列合并,得到有完全有序的序列核心:有序子列的归并// LeftStart=左边数组的起始位置,RightStart=右边数组的起始位置,RightEnd=右边数组的结束位置void Merge(ElementType[] A, ElementType[] TmpA, int LeftStart, int RightStart, int RightEnd) { Left原创 2017-07-17 16:43:00 · 316 阅读 · 0 评论 -
20. 排序--快速排序
快速排序算法概述从数组中选出一个数作为主元,然后把数组一分为二,左边是小于主元的,右边是大于主元的。重复这个过程,直到划分的子集长度为1伪码描述void Quick_Sort(ElementType[] A, int N) { pivot = 从数组A中选出一个主元; 将 S = {A[] \ pivot}分成2个独立子集: A1 = {小于等于pivot} 和原创 2017-07-17 20:20:15 · 517 阅读 · 0 评论 -
21. 排序--表排序
表排序又称间接排序,排序时不调整元素的实际位置,而是定义一个额外的数组作为“表”(table)。根据元素的关键字大小来调整元素对应下标在表中的位置。例初始 A [0] [1] [2] [3] [4] [5] [6] [7] key f d c a g b h e table 0 1 2 3 4 5原创 2017-07-18 12:26:56 · 798 阅读 · 1 评论 -
7. 树--平衡二叉树
平衡二叉树平衡二叉树(Balanced Binary Tree),又称AVL树定义 空树,或者任一结点左、右子树高度差的绝对值不超过1,即|BF(T)|≤1 \left| BF(T) \right| \leq 1 “平衡因子”(Balance Factor,简称BF):BF(T)=hL−hR BF(T) = h_L - h_R ,其中hL h_L 和hR h_R 分别为T T 的左、右子树的高度原创 2017-07-10 11:06:17 · 405 阅读 · 0 评论 -
22. 排序--排序算法的比较
排序算法的比较 排序方法 平均时间复杂度 最坏时间下复杂度 额外空间复杂度 稳定性 简单选择排序 O(N2) O(N^2) O(N2) O(N^2) O(1) O(1) 不稳定 冒泡排序 O(N2) O(N^2) O(N2) O(N^2) O(1) O(1) 稳定 直接插入排序 O(N2) O(N^2) O(N2)原创 2017-07-18 22:06:05 · 290 阅读 · 0 评论 -
13. 图--最短路径问题
最短路径问题问题抽象在网络中,求两个不同顶点之间的所有路径中,边的权值之和最小的那一条路径这条路径就是两点之间的最短路径(Shortest Path)第一个顶点为源点(Source)最后一个顶点为终点(Destination)问题分类单源最短路径问题:从某固定源出发,求其到所有其他顶点的最短路径 (有向)无权图(有向)有权图多源最短路径问题:求任意两顶点间的最短路径单源最短路算法无原创 2017-07-16 12:41:06 · 367 阅读 · 0 评论 -
12. 图--图的遍历
图的遍历深度优先搜索Depth First Search,DFS伪代码void DFS(Vertex V) { visited[V] = true; for (V 的每个邻接点 W) { if (!visited[W]) DFS(W); }}若有N个顶点、E条边,时间复杂度是用邻接表存储图,为O(N+E) O(N+E) 用邻接矩阵存原创 2017-07-14 10:25:13 · 403 阅读 · 0 评论 -
1. 线性结构--线性表
线性表定义 由同类型数据元素构成有序序列的线性结构。表中元素个数称为线性表的长度线性表没有元素时,称为空表表起始位置称表头,表结束位置称表尾抽象数据类型描述类型名称:线性表(List) 数据对象集:线性表是n(≥0) n(\geq0) 个元素构成的有序序列(a1,a2,...,an) (a_1, a_2, ..., a_n) 操作集:线性表$ L \in List $,整数$ i原创 2017-06-29 21:32:18 · 424 阅读 · 0 评论 -
2. 线性结构--栈
栈定义 具有一定操作约束的线性表,只在一端(栈顶、Top)做插入、删除插入数据:入栈(Push)删除数据:出栈(Pop)后入先出:Last In First Out(LIFO)抽象数据类型描述类型名称:栈(Stack)数据对象集:一个有0个或多个元素的有穷线性表操作集:长度为MaxSize的栈S∈Stack S \in Stack ,堆栈元素item∈ElementType item原创 2017-06-29 21:42:22 · 348 阅读 · 0 评论 -
3. 线性结构--队列
队列定义 具有一定操作约束的线性表,只能在一端插入,而在另一端删除数据插入:入队列(AddQ)数据删除:出队列(DeleteQ)、先来先服务先进先出:FIFO抽象数据类型描述类型名称:队列(Queue)数据对象集:一个有0个或多个元素的有穷线性表操作集:长度为MaxSize的队列Q∈Queue Q \in Queue ,队列元素item∈ElementType item \in E原创 2017-06-30 15:48:21 · 310 阅读 · 0 评论 -
4. 树--树的表示
查找 根据某个给定关键字K,从集合R中找出关键字与K相同的记录静态查找:集合中记录是固定的,没有插入和删除操作,只有查找动态查找:集合中记录是动态变化的,除查找,还可能发生插入和删除静态查找顺序查找int SequentialSearch(StaticTable *Tbl, ElementType K) { int i; for (int i = 0; i < Tbl->Le原创 2017-07-01 22:16:41 · 343 阅读 · 0 评论 -
8. 树--堆
堆优先队列(Priority Queue)定义 特殊的“队列”,取出元素的顺序是依照元素的优先权(关键字)大小,而不是元素进入队列的先后顺序如何组织优先队列采用数组或者链表实现优先队列数组 插入:元素总是插入尾部,Θ(1) \Theta(1) 删除: 查找最大(或最小)关键字,Θ(n) \Theta(n) 从数组中删去需要移动元素,O(n) O(n) 链表 插入:元素总是插入链表原创 2017-07-11 20:17:49 · 260 阅读 · 0 评论 -
6. 树--二叉搜索树
二叉搜索树二叉搜索树(BST, Binary Search Tree),也称二叉排序树或二叉查找树定义二叉搜索树:一棵二叉树,可以为空;如果不为空,满足以下性质: 1. 非空左子树的所有键值小于其根结点的键值 2. 非空右子树的所有键值大于其根结点的键值 3. 左、右子树都是二叉搜索树二叉搜索树操作的特别函数Position Find(ElementType X, BinTree BST):原创 2017-07-04 11:06:02 · 259 阅读 · 0 评论 -
5. 树--二叉树的表示及其遍历
二叉树定义一个有穷的结点集合这个集合可以为空若不为空,则它是由根结点和称为其左子树TL T_L 和右子树TR T_R 的两个不相交的二叉树组成。二叉树具体五种基本形态 二叉树的子树有左右顺序之分特殊二叉树斜二叉树(Skewed Binary Tree)满二叉树(Full Binary Tree)又称完美二叉树(Perfect Binary Tree)完全二叉树(Complete Binar原创 2017-07-02 17:29:55 · 479 阅读 · 0 评论 -
9. 树--哈夫曼树
哈夫曼树(Huffman Tree)定义带权路径长度(WPL):设二叉树有n n 个叶子结点,每个叶子结点带有权值wk w_k ,从根结点到每个叶子结点的长度为lk l_k ,则每个叶子结点的带权路径长度之和为:WPL=∑nk=1wklk WPL = \sum_{k=1}^n w_kl_k 最优二叉树或哈夫曼树:WPL最小的二叉树哈夫曼树的构造假设有n n 个权值结点,则构造出的哈夫曼树有n原创 2017-07-12 11:04:01 · 579 阅读 · 0 评论 -
10. 树--并查集
并查集定义 并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题。常常在使用中以森林来表示。存储实现逻辑结构:使用树结构表示集合,树的每个结点代表一个集合元素物理结构:采用数组存储,使用双亲表示法(孩子指向双亲)例有三个整数集合: * S1={1,2,4,7} S1=\{1,2,4,7\} * S2={3,5,8} S2=\{3,5,8\原创 2017-07-12 19:56:31 · 592 阅读 · 0 评论 -
11. 图--图的表示
图(Graph)定义表示“多对多”的关系包含 一组顶点:通常用V(Vertex) V(Vertex) 表示顶点集合一组边:通常用E(Edge) E(Edge) 表示边的集合 边是顶点对:(v,w)∈E (v,w) \in E ,其中v,w∈V v,w \in V 有向边<v,w> <v,w> 表示从v v 指向w w 的边(单行线) 不考虑重边和自回路 抽象数据定义类型名称:图(Gr原创 2017-07-13 20:40:10 · 576 阅读 · 0 评论 -
23. 散列表
散列表查找的本质已知对象找位置有序安排对象:全序、半序直接“算出”对象位置:散列散列查找散列查找法的两项基本工作:计算位置:构造散列函数确定关键词存储位置解决冲突:应用某种策略解决多个关键词位置相同的问题时间复杂度几乎是常量:O(1) O(1) ,即查找时间与问题规模无关抽象数据类型定义类型名称:符号表(SymbolTable)数据对象集:符号表是“名字(Name)— 属性(Att原创 2017-07-19 21:05:04 · 1817 阅读 · 0 评论