![](https://img-blog.csdnimg.cn/20190909231819967.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
数据结构与算法
step by step, 人生并非一帆风顺,但是总是有所期待,存在希望,生活并没有我们想的那样糟糕,很多时候我们没有意识到,但是事情总会慢慢好起来的,所以不必惊慌,不要放弃,脚踏实地,拥抱生活
—— 2020考研,中山大学大四
Ice星空
要开始奔跑了!!!
偶尔请记得回头呼唤自己的灵魂
展开
-
数据结构基本概念
1.1 数据结构的基本概念1.1.1 基本概念和术语1.数据数据是信息的载体,是描述客观事物属性的数、字符以及所有能输入到计算机中并被计算和程序识别和处理的符号的 集合2.数据元素3.数据对象4.数据类型5.抽象数据类型6.数据结构1.1.2 数据结构三要素三要素:数据的逻辑结构数据的存储结构数据的运算逻辑结构描述元素之间的逻辑关系,与数据存储无关,是独立于计算机...原创 2019-08-15 14:17:44 · 165 阅读 · 0 评论 -
关于中位数的问题 implemented with C++
文章目录中位数一个序列的中位数两个序列的中位数中位数对于一个有序序列来说,很简单,如果长度为 nnn 的话,那么中位数就是序列中 n/2n/2n/2 位置的数组元素了一个序列的中位数如果:这是一个有序的序列,那么非常简单,不再多说如果这不是一个有序序列,那么我们自然会这样想:先对序列进行排序再找到中位数,而这样的算法的复杂度其实就是排序算法的复杂度了(可以考虑快速排序,或者是用一个大...原创 2019-08-19 21:54:44 · 150 阅读 · 0 评论 -
顺序表&算法 Implemented with C++
文章目录Sequence List 顺序表Basic Operation 基本操作Insert 插入Delete 删除Locate 查找一些算法问题Reverse 逆置Merge 合并有序顺序表Delete by value 按值删除删除给定值的所有元素删除给定值范围内的所有元素duplicate removal 去重Sequence List 顺序表也就是线性表的顺序存储,即用一组地址连续的...原创 2019-08-20 15:26:48 · 279 阅读 · 0 评论 -
链表&算法 Implemented with C++
文章目录链表Basic Operation 基本操作Create 创建链表Insert 插入Delete 删除Find By Index 按序号查找Find By Value 按值查找链表所谓链表,就是线性表的链式存储——相对于顺序存储来说,链式存储不要求数据元素存储在物理位置连续的内存上,而是通过指针指向下一个元素的地址,这就是链表,通常具有这样的结构:typedef struct Nod...原创 2019-08-21 15:46:53 · 121 阅读 · 0 评论 -
比较:顺序表和链表
文章目录比较存取方式逻辑结构和物理结构查找、插入和删除空间分配选取存储运算环境比较存取方式顺序表的优点就是可以随机存取,而链表只能从表头开始顺序存取元素逻辑结构和物理结构链表的逻辑关系是通过指针指向下一个结点的地址实现的,而顺序表的逻辑关系和物理位置关系一致,逻辑相邻的元素物理位置也相邻查找、插入和删除链表的插入删除更加方便,数组需要频繁的移动元素。查找上,链表只能顺序查找,顺序表...原创 2019-08-22 15:29:32 · 271 阅读 · 0 评论 -
栈 Implemented with C++
文章目录栈 Stack栈 Stack原创 2019-08-25 14:26:19 · 170 阅读 · 1 评论 -
队列 Implemented with C++
文章目录Queue 队列ArrayQueue 队列的连续存储isEmptyisFullpush_backpop_frontfreeLinkedQueue 队列的链式存储循环队列Queue 队列队列和栈(Stack)一样,都是一种操作受限的表。队列允许从一端入队,另一端出队,即我们日常所熟悉的排队的规则——先进先出(First In First Out, FIFO),其中:队头(Front)...原创 2019-08-27 22:45:59 · 162 阅读 · 0 评论 -
特殊矩阵的压缩存储
压缩存储为多个值相同的元素只分配一个存储空间,对零元素不分配存储空间,以节省存储空间特殊矩阵拥有很多相同元素或者零元素的矩阵,并且分布有一定规律性,例如:对称矩阵,上三角矩阵等特殊矩阵的压缩存储方法找出特殊矩阵中值相同的矩阵元素的分布规律,把那些呈现规律性分布的、值相同的多个矩阵元素压缩存储到一个存储空间中对称矩阵如果一个 n×nn\times nn×n 矩阵中任意一个元素 ai,j...原创 2019-08-31 16:57:01 · 311 阅读 · 0 评论 -
二叉树 Implemented with C++
文章目录Tree 树Definition 定义Some Important Terminology 一些重要的概念Tree 树Definition 定义树是 n(n≥0)n(n\ge0)n(n≥0) 个结点的有限集合,当 n=0n=0n=0 时,称为空树。对于任意一棵树都有:有且仅有一个根结点(root)从根节点到其他结点有且只有一条路径(这是图论中对于树的定义,事实上,树是有向图的...原创 2019-09-02 13:57:12 · 104 阅读 · 0 评论 -
二叉排序树的插入删除操作
文章目录InsertDelete我们这样规定:当我们插入一个新的结点时,这个结点的关键字(也就是我们常说的结点的值)如果小于当前所在位置的结点,则插入到这个结点的左侧,否则插入到这个结点的右侧,这样构建出来的二叉树,总会有:一个结点的左子树的所有结点的值总是大于右子树所有结点的值Insert插入一个结点非常简单,我们只需要在插入的时候比较值的大小插入即可,这个插入结点是一个叶子结点Dele...原创 2019-09-05 15:47:48 · 333 阅读 · 0 评论 -
二叉树的遍历以及遍历序列构建二叉树
文章目录二叉树的遍历NLR 前序遍历LNR 中序遍历LRN 后序遍历通过遍历序列构造二叉树中序 + 后序中序 + 前序结点结构:typedef struct Node{ ElementType value; Node* left; Node* right; Node(ElementType value_, left_ = NULL, right_ = NULL) :value(va...原创 2019-09-05 16:31:43 · 367 阅读 · 0 评论 -
线索二叉树
文章目录Definition构造线索二叉树遍历线索二叉树的方法Definition线索二叉树实际上就是在遍历二叉树的时候,对二叉树进行线索化:在遍历的过程中,检查当前结点的左右指针是否为空,若为空,则将它们改为指向前驱结点或后继结点的线索,比如,我们可以这样规定:若左子树为空,让左指针指向当前结点的前驱结点若右子树为空,让右指针指向当前结点的后继结点因此,我们需要在结点结构中添加两个...原创 2019-09-06 22:31:28 · 188 阅读 · 0 评论 -
插入排序 Implemented With C++
Definition从第二个元素开始,每次都将当前的元素插入前面的有序序列中,使得前面的序列依然有序,重复上述过程,直到最后一个元素完成插入,对于一个含有 nnn 个元素的序列来说,总共需要 n−1n-1n−1 趟,最好的情况下每趟的比较次数为 111 次,最差的情况下需要 i−1i-1i−1 次,平均情况下时间复杂度为 O(n2)O(n^{2})O(n2),最好的情况可以达到 O(n)O(n)...原创 2019-09-27 15:28:15 · 122 阅读 · 0 评论 -
希尔排序 Implemented With C++
文章目录DefinitionImplementationPerformanceDefinition又称为缩小增量排序,是对插入排序的一种改进(建立在插入排序对基本有序的排序表和数据量不大的排序表上较好的performance上):取一个小于 nnn 的步长 d1d_{1}d1 ,把表中元素分为 d1d_{1}d1 份对每一组进行插入排序缩小步长 d1d_{1}d1 的值,重复上述...原创 2019-09-21 16:00:36 · 118 阅读 · 0 评论 -
冒泡排序 Implemented With C++
Definition交换排序通过对比两个元素的关键字,对患者两个记录在序列中的位置,这样的排序称为交换排序冒泡排序从后往前扫描,每次都和这个元素相邻的前一个元素进行比较,如果小于前面的元素,则两个元素交换位置,直到扫描到序列的开头为止,每次确定一个最小的元素,最终得到一个有序序列。这样的从尾到当前确定的第 kkk 个最小元素的位置 i=k−1i=k-1i=k−1 的一次扫描,称为一趟冒泡排...原创 2019-09-23 15:25:34 · 114 阅读 · 0 评论 -
快速排序 Implemented With C++
快速排序 Quick Sort1. Definition对冒泡排序进行的改进,贯彻的是一种分治的思想:随机设定输入序列中的一个元素为基准元素(pivot),通过一趟复杂度为 O(n)O(n)O(n) 的排序操作,将序列分为以基准元素为分界的两部分,使得左边的所有元素的值都小于基准元素,右边所有的值都大于基准元素,这个过程就是一趟快速排序。不断重复这样的操作,直到当前部分为空或者只剩下一个元素,...原创 2019-09-20 21:51:36 · 185 阅读 · 0 评论 -
简单选择排序 Implemented With C++
Definition在每一趟排序中,从剩下的元素中找到最小的元素,放在最前的位置,重复上述过程,直到到达最后一个元素为止,假如序列的元素个数为 nnn,则整个过程的比较次数为:N=n−1+n−2+⋯+1=n(n−1)2(0)N=n-1+n-2+\cdots+1=\frac{n(n-1)}{2}\tag{0}N=n−1+n−2+⋯+1=2n(n−1)(0)总共需要 n−1n-1n−1 趟...原创 2019-09-27 14:17:33 · 117 阅读 · 0 评论 -
堆排序 Implemented With C++
Definition一种树形选择排序,即:在排序过程中,将整个序列看成一颗完全二叉树的顺序存储结构。两个步骤:构造初始堆,满足:每个分支结点对应的值总是大于(小于)后继结点对应的值,这样的堆称为大顶堆(小顶堆)将堆顶(即根结点)出堆,得到最大值(最小值),将序列的最后一个元素放到堆顶,调整堆,使得依然满足大顶堆(小顶堆)重复上述过程,直到堆内剩下一个元素,这时我们便得到了整个排序序...原创 2019-09-23 21:37:27 · 152 阅读 · 0 评论 -
二路归并排序 Implemented With C++
Definition对于一个长度为 nnn 的表,我们可以把这张表看成是由 nnn 个长度为 111 的表组成的集合,然后我们对这些表两两合并——也就是所谓的归并,然后再对归并后得到的长度为原来的两倍(具体情况和 nnn 是偶数还是奇数有关)的新表中的元素进行排序,这样,我们就得到了 n/2n/2n/2 个长度为 222 的表。重复上述过程,最终可以归并得到完整的长度为 nnn 的有序表,这就是...原创 2019-09-25 15:29:30 · 143 阅读 · 0 评论 -
外部排序
Definition我们熟悉的排序算法,例如:冒泡排序,快速排序等,都是在内存中进行的排序算法。但是当我们需要对于一个非常大的文件进行排序时,这个文件可能包含有数十万条记录,我们无法将这样庞大的文件复制到内存中进行排序。这时,我们需要将排序的记录存储在外存上(例如磁盘和磁带),然后一部分一部分读取进入内存进行排序之后,再存放回外存,这样的排序涉及到了多次的内存和外存之间的数据交换,这样的排序方...原创 2019-09-28 19:12:04 · 285 阅读 · 0 评论 -
B树和B+树
Definition又称为多路平衡查找树,所有结点的孩子数量的最大值称为 BBB 树的阶,通常用 mmm 表示,一棵 mmm 阶 BBB 树,要么是一棵空树要么,是一棵满足如下条件的 mmm 叉树:结点至多有 mmm 棵子树(即 m−1m-1m−1 个关键字)若根结点不是终端结点,那么至少有两棵子树除根结点之外的所有结点至少有 ⌈m/2⌉\lceil m/2\rceil⌈m/2⌉ 棵子树...原创 2019-10-10 20:38:58 · 148 阅读 · 0 评论 -
散列(哈希)表
Definition散列(哈希)函数通过一个**散列函数(哈希函数)**将关键字映射到对应的关键字的地址的函数记为:Hash(key)=AddrHash(key)=AddrHash(key)=Addr其中,地址 AddrAddrAddr 既可以是数组下标也可以是索引或者内存地址冲突因为映射的值域是有限的,通常远小于定义域,也就是说,散列表可能会把两个或两个以上的关键字映射到同一个地...原创 2019-10-11 14:36:24 · 165 阅读 · 0 评论 -
串 string Implemented with C++
Definition由零个或者零个以上的字符组成的有序序列,记为:S=′a1a2⋯an′(n≥0)S='a_{1}a_{2}\cdots a_{n}'\qquad (n\ge 0)S=′a1a2⋯an′(n≥0)其中,SSS 是串名,aia_{i}ai 可以是字母,数字或者是其他的字符,包含的字符的总个数 nnn 称为串的长度,为 000 时表示空串。一个串中任意个连续的字符组成...原创 2019-10-12 20:08:47 · 118 阅读 · 0 评论 -
图 Graph: Basic Concept
文章目录原创 2019-10-14 19:24:38 · 174 阅读 · 0 评论 -
图的存储和基本操作 Graph: Storage & Basic Operation
文章目录Storage1.邻接矩阵法1.1 Definition1.2 Characteristic2.邻接表法3.十字链表4.邻接多重表Basic OperationStorage1.邻接矩阵法1.1 Definition即:用一个一维数组存储图的顶点信息用一个二维数组存储图的边的信息(即顶点和顶点之间的邻接关系),这个矩阵就是邻接矩阵对于一个结点数目为 nnn 的图 G(V,...原创 2019-10-16 14:16:12 · 244 阅读 · 0 评论 -
图的遍历 Graph: Traverse
文章目录Traverse1 BFS1.1 Explanation1.2 Performance2. DFS2.1 Definition2.2 PerformanceTraverse通常有两种方式:广度优先搜索(BFS,Breadth-First-Search)深度优先搜索(DFS,Depth-First-Search)1 BFS1.1 Explanation这是一种层次遍历的方法...原创 2019-10-16 20:40:27 · 844 阅读 · 0 评论 -
最小生成树 Graph: Minimum-Spanning-Tree MST
文章目录最小生成树DefinitionCharacteristicDeterminationPrim 算法ProcessProofPerformanceKruskal 算法ProcessProofPerformance最小生成树Definition是图的极小连通子图,包含所有顶点以及尽可能少的边Characteristic对于一棵最小生成树来说:对于一个图来说,其最小生成树不是唯一的...原创 2019-10-18 14:20:08 · 390 阅读 · 0 评论 -
Dijkstra算法 Graph: min-path
文章目录DefinitionDijkstra 算法DefinitionPerformanceProblemFloyd算法Definition对于无权图来说,我们可以用广度优先搜索方法(BFS, Breadth-First-Search)查找最短路径,但是当图是带权图时,带权路径长度为:从一个顶点到其余任意一个顶点的一条路径所经过的边上的权值之和,带权路径最短的即为最短路径Dijkstra 算...原创 2019-10-18 17:01:37 · 447 阅读 · 0 评论 -
拓扑排序 Graph: Topological Sort
文章目录DefinitionDAG 有向无环图AOV 网Topological Sort 拓扑排序PerformanceDefinitionDAG 有向无环图若一个有向图中不存在环,则称为有向无环图(DAG,Directed-Acyclic-Graph)AOV 网若用有向无环图表示一个工程,其顶点表示活动,用有向边 <Vi,Vj><V_{i},V_{j}><...原创 2019-10-19 13:53:52 · 308 阅读 · 0 评论 -
关键路径 Graph: Key Path
文章目录AOE NetworkDefinitionCharacteristicKey PathDefinitionSome Important Parameters1.事件的最早发生时间2.事件的最迟发生时间3.活动的最早开始时间4.活动的最迟开始时间5.时间余量AOE NetworkDefinition在带权有向图中,用顶点表示时间,以有向边表示活动,以边上的的权值表示完成该活动的开销(例...原创 2019-10-19 15:52:14 · 343 阅读 · 0 评论