数据结构与算法
Will Jay
这个作者很懒,什么都没留下…
展开
-
数据结构与算法(23)—— 外部排序
外部排序需要将待排序的记录存储在外存上,排序时再把数据一部分一部分的调入内存进行排序。在排序过程中需要多次进行内存和外存之间的交换,对外存文件中的记录进行排序后的结果仍然被放到原有文件中。这种排序的方法就叫做外部排序。如何得到初始的归并段置换选择排序:解决排序段放入内存的问题如何减少多个归并段的归并次数最佳归并树:最少的归并次数(I/O次数)如何每次m路归并快速得到最小的关键字败者树:减少比较次数概要: 内存容量无法容纳大量数据#include <assert.原创 2020-05-31 17:35:58 · 258 阅读 · 0 评论 -
数据结构与算法(22)—— 选择类排序
选择类排序简单选择排序空间复杂度:需要额外的存储空间仅为交换元素时借助的中间变量,所以空间复杂度是O(1)时间复杂度:关键操作在于交换元素操作,整个算法由双重循环组成,外层循环从0到n-2一共n-2+1=n-1次,对于第i层外层循环,内层循环执行n-1-(i+1)+1=n-i-1次。当i=0,内层循环执行n-1次,当i=n-2,内层循环执行1次,所以是一个等差数列求和,一共为(1+n-1)(n-1)/2=n(n-1)/2 ,所以时间复杂度为O(n^2)稳定性:不稳定 原因就在于交换部分原创 2020-05-31 17:33:50 · 109 阅读 · 0 评论 -
数据结构与算法(21)—— 交换类排序
交换类排序冒泡排序假设待排序表长为n,从后往前(或从前往后)两两比较相邻元素的值,若为逆序(即A[i-1]>A[i]),则交换它们,直到序列比较完。我们称它为一趟冒泡,结果将最小的元素交换到待排序列的第一个位置。下一趟冒泡时,前一趟确定的最小元素不再参与比较,待排序列减少一个元素,每趟冒泡的结果把序列中的最小元素放到了序列的最终位置,……,这样最多做n-1趟冒泡就能把所有元素排好序。空间复杂度:交换时开辟了存储空间来存储中间变量,所以空间复杂度为O(1)时间复杂度稳定性:当两个关键字相等原创 2020-05-31 17:30:45 · 137 阅读 · 0 评论 -
数据结构与算法(20)—— 插入排序
插入类排序直接插入排序直接插入排序:首先以一个元素为有序的序列,然后将后面的元素依次插入到有序的序列中合适的位置直到所有元素都插入有序序列。时间复杂度为O(n)直接插入排序是稳定性是稳定的。 void InsertSort(SqList *L) { /* 对顺序表L作直接插入排序。算法10.1 */ int i,j; for(i=2;i<=(*L).length;++i) if LT((*L).r[i].key,(*L).r[i-1].key) /* "&l原创 2020-05-31 17:28:46 · 212 阅读 · 0 评论 -
数据结构与算法(19)——排序
排序的基本知识定义:排序就是将原本无序的序列重新排列成有序的序列。排序的稳定性如果待排序表中有两个元素Ri、Rj,其对应的关键字keyi=keyj,且在排序前Ri在Rj前面,如果使用某一排序算法排序后,Ri仍然在Rj的前面,则称这个排序算法是稳定的,否则称排序算法是不稳定的。关于各种算法的图解请看大佬的讲解总结:...原创 2020-05-31 10:57:16 · 110 阅读 · 0 评论 -
数据结构与算法(18)—— 散列表
散列表散列表:根据给定的关键字来计算出关键字在表中的地址的数据结构。也就是说,散列表建立了关键字和存储地址之间的一种直接映射关系。散列函数:一个把查找表中的关键字映射成该关键字对应的地址的函数,记为Hash(key)=Addr。散列函数可能会把两个或两个以上的不同关键字映射到同一地址,称这种情况为“冲突”,这些发生碰撞的不同关键字称为同义词。构造散列函数的tips:1)散列函数的定义域必须包含全部需要存储的关键字,而值域的范围则依赖于散列表的大小或地址范围。2)散列函数计算出来原创 2020-05-31 09:59:15 · 551 阅读 · 0 评论 -
数据结构与算法(17)—— B树和B+树
B树和B+树2-3树2-3树是一种多路查找树:2和3的意思就是2-3树包含两种结点1)2结点包含一个元素和两个孩子(或者没有孩子)。①左子树包含的元素小于该结点的元素值,右子树包含的元素大于该结点的元素值②2结点要不有两个孩子,要不就没有孩子,不允许有一个孩子2)3结点包含一大一小两个元素和三个孩子(或者没有孩子)。(两个元素按大小顺序排列好)①左子树包含的元素小于该结点较小的元素值,右子树包含的元素大于该结点较大的元素值,中间子树包含的元素介于这两个元素值之间。②3结点要不有三个孩子原创 2020-05-31 09:54:13 · 203 阅读 · 0 评论 -
数据结构与算法(16)—— 二叉排序树
二叉排序树二叉排序树(Binary Search Tree 也叫二叉搜索树)或者是一棵空树,或者是具有以下性质的二叉树①若左子树不空,则左子树上所有结点的值均小于它的根结点的值。②若右子树不空,则右子树上所有结点的值均大于它的根结点的值。③它的左右子树也是一棵二叉排序树。算法思想由于二叉排序树的特点(左子树<根结点<右子树),所以每次查找一个关键字,需要先和根结点进行比较:如果这个关键字小于根结点的值,则再到这个根结点的左子树进行同样的比较操作一直进行下去直到找到该关键字,表示原创 2020-05-31 09:37:38 · 295 阅读 · 0 评论 -
数据结构与算法(14)—— 最短路径
最短路径迪杰斯特拉一个源点到其余顶点的最短路径该算法设置一个集合S记录已求得的最短路径的顶点,可用一个数组s[]来实现,初始化为0,当s[vi]=1时表示将顶点vi放入S中,初始时把源点v0放入S中。此外,在构造过程中还设置了两个辅助数组:dist[]:记录了从源点v0到其他各顶点当前的最短路径长度,dist[i]初值为arcs[v0][i]。path[]:path[i]表示从源点到顶点i之间的最短路径的前驱结点,在算法结束时,可根据其值追溯得到源点v0到顶点vi的最短路径。.原创 2020-05-31 08:56:21 · 325 阅读 · 0 评论 -
数据结构与算法(13)—— 最小生成树
最小生成树普利姆(Prlm)①从图中找第一个起始顶点v0,作为生成树的第一个顶点,然后从这个顶点到其他顶点的所有边中选一条权值最小的边。然后把这条边的另一个顶点v和这条边加入到生成树中。②对剩下的其他所有顶点,分别检查这些顶点与顶点v的权值是否比这些顶点在lowcost数组中对应的权值小,如果更小,则用较小的权值更新lowcost数组。③从更新后的lowcost数组中继续挑选权值最小而且不在生成树中的边,然后加入到生成树。④反复执行②③直到所有所有顶点都加入到生成树中。概要:双重循环,.原创 2020-05-31 08:47:41 · 218 阅读 · 0 评论 -
数据结构与算法(12)—— 图的遍历
图的遍历深度优先遍历深度优先搜索(DFS:Depth-First-Search):深度优先搜索类似于树的先序遍历算法空间复杂度:由于DFS是一个递归算法,递归是需要一个工作栈来辅助工作,最多需要图中所有顶点进栈,所以时间复杂度为O(|V|)时间复杂度:1)邻接表:遍历过程的主要操作是对顶点遍历它的邻接点,由于通过访问边表来查找邻接点,所以时间复杂度为O(|E|),访问顶点时间为O(|V|),所以总的时间复杂度为O(|V|+|E|)2)邻接矩阵:查找每个顶点的邻接点时间复杂度为O(|V|),对原创 2020-05-31 08:27:54 · 479 阅读 · 0 评论 -
数据结构与算法(11)—— 图
第五章:图图的基本概念定义:树是N(N≥0)个结点的有限集合,N=0时,称为空树,这是一种特殊情况。在任意一棵非空树中应满足:1)有且仅有一个特定的称为根的结点。2)当N>1时,其余结点可分为m(m>0)个互不相交的有限集合T1,T2,…,Tm,其中每一个集合本身又是一棵树,并且称为根结点的子树。图G由顶点集V和边集E组成,记为G=(V,E)V(G)表示图G中顶点的有限非空集。用|V|表示图G中顶点的个数,也称为图G的阶E(G)表示图G中顶点之间的关系(边)集合。用|E原创 2020-05-31 08:23:39 · 648 阅读 · 0 评论 -
数据结构与算法(10)—— 哈夫曼树
哈夫曼树和哈夫曼编码算法的描述如下:1)将这N个结点分别作为N棵仅含一个结点的二叉树,构成森林F。2)构造一个新结点,并从F中选取两棵根结点权值最小的树作为新结点的左、右子树,并且将新结点的权值置为左、右子树上根结点的权值之和。3)从F中删除刚才选出的两棵树,同时将新得到的树加入F中。4)重复步骤2)和3),直至F中只剩下一棵树为止。哈夫曼树的特点没有度为 1 的结点n 个叶结点的哈夫曼树共有 2n-1 个结点哈夫曼树的任意非叶结点的左右子树交换后仍是哈夫曼树对同一组权值,可能原创 2020-05-31 08:11:47 · 463 阅读 · 0 评论 -
数据结构与算法(9)—— 平衡二叉树
平衡二叉树为何要使用AVL树?二叉搜索树的搜索效率与其树的深度相关,而二叉搜索树的组成又与其插入序列相关,在极端情况下,二叉搜索树退化为一条单链(比如插入序列是 1 2 3 … n),使得搜索效率大大降低,为了避免这种情况出现,我们采用二叉平衡树对插入结点进行调整,使得树的深度尽可能小定义平衡因子BF(T) = hL - hR,其中 hL 、hR 分别是左右子树的高度平衡二叉树(AVL 树)空树,或者任一结点左、右子树高度差的绝对值不超过 1,即 |BF(T)|≤1 的树平衡二叉树的调原创 2020-05-31 08:07:35 · 227 阅读 · 0 评论 -
数据结构与算法(8)—— 二叉搜索树
二叉搜索树定义二叉搜索树(BST)也称二叉排序树或二叉查找树二叉搜索树:一棵二叉树,可以为空;如果不为空,满足以下性质:非空左子树的所有键值小于其根结点的键值非空右子树的所有键值大于其根结点的键值左、右子树都是二叉搜索树查找查找从根结点开始,如果树为空,返回 NULL若搜索树不为空,则根结点键值和 X 进行比较,并进行不同处理:若 X 小于根结点键值,在左子树中继续查找若 X 大于根结点键值,在右子树中继续查找如 X 等于根节点键值,查找结束,返回指向此结点的指针查找最大和原创 2020-05-30 17:43:58 · 355 阅读 · 0 评论 -
数据结构与算法(7)—— 二叉树的遍历
二叉树的遍历树的表示typedef struct TreeNode *BinTree;struct TreeNode{ int Data; // 存值 BinTree Left; // 左儿子结点 BinTree Right; // 右儿子结点 };先序遍历:1)访问根结点;2)先序遍历左子树;3)先序遍历右子树。递归void PreOrderTraversal(BinTree BT){ if(BT){ printf("%d",BT->Data原创 2020-05-30 17:37:30 · 338 阅读 · 0 评论 -
数据结构与算法(6)—— 树
第四章:树树的基本概念树是递归定义的结构结点根节点:树只有一个根结点结点的度:结点拥有的子树的数量度为0:叶子结点或者终端结点度不为0:分支结点或者非终端结点分支结点除去根结点也称为内部结点树的度:树中所有结点的度数的最大值结点关系祖先结点根结点到该结点的唯一路径的任意结点子孙结点双亲结点根结点到该结点的唯一路径上最接近该结点的结点孩子结点兄弟结点有相同双亲结点的结点层次,高度,深度,树的高度层次:根为第一层,它的孩子为第原创 2020-05-30 15:29:14 · 450 阅读 · 0 评论 -
数据结构与算法(5)—— 队列
队列队列是只允许在一端进行插入,而在另一端进行删除的线性表队头(Front):允许删除的一端,又称为队首。队尾(Rear): 允许插入的一端。先进入队列的元素必然先离开队列,即先进先出(First In First Out)简称FIFO顺序队列用数组来实现队列,可以将队首放在数组下标为0的位置。循环队列把数组“掰弯”,形成一个环。Rear指针到了下标为4的位置还能继续指回到下标为0的地方。这样首尾相连的顺序存储的队列就叫循环队列入队:rear=(rear+1)%MaxSize出队:fr原创 2020-05-30 15:19:30 · 203 阅读 · 0 评论 -
数据结构与算法(4)—— 栈的应用
栈的应用1、括号匹配假设有两种括号,一种圆的(),一种方的[],嵌套的顺序是任意的。算法思想:若是左括号,入栈;若是右括号,出栈一个左括号判断是否与之匹配;检验到字符串尾,还要检查栈是否为空。只有栈空,整个字符串才是括号匹配的。代码#include<string>#include<stack>#include<iostream>using namespace std;bool MatchBrackets(char* pStr){ stack原创 2020-05-30 14:26:20 · 245 阅读 · 0 评论 -
数据结构与算法(3)—— 栈
栈栈(Stack):只允许在一端进行插入或删除操作的线性表。栈顶(Top):线性表允许进行插入和删除的那一端。栈底(Bottom):固定的,不允许进行插入和删除的另一端特点:1.栈是受限的线性表,所以自然具有线性关系。2.栈中元素后进去的必然先出来,即后进先出LIFO(Last In First Out)栈中元素后进去的必然先出来,即后进先出LIFO(Last InFirst Out)顺序栈栈是线性表的特例,那栈的顺序存储也是线性表顺序存储的简化。栈的顺序存储结构也叫作顺序栈。原创 2020-05-30 13:24:10 · 182 阅读 · 0 评论 -
数据结构与算法(2)—— 线性表
第二章:线性表线性表的逻辑结构定义:线性表是具有相同数据类型的n(n≥0)个数据元素的有限序列。其中n为表长。当n=0时 线性表是一个空表特点:线性表中第一个元素称为表头元素;最后一个元素称为表尾元素。除第一个元素外,每个元素有且仅有一个直接前驱。除最后一个元素外,每个元素有且仅有一个直接后继。线性表的顺序存储结构线性表的顺序存储又称为顺序表。它是用一组地址连续的存储单元(比如C语言里面的数组),依次存储线性表中的数据元素,从而使得逻辑上相邻的两个元素在物理位置上也相邻。建立顺序表原创 2020-05-30 13:09:31 · 131 阅读 · 0 评论 -
数据结构与算法(1)—— 数据结构基本概念
第一章:数据结构的基本概念定义在任何问题中,数据元素都不是孤立存在的,而是在它们之间存在着某种关系,这种数据元素相互之间的关系称为结构(Structure)。数据结构是相互之间存在一种或多种特定关系的数据元素的集合。数据结构包括三方面的内容:逻辑结构、存储结构和数据的运算。数据的逻辑结构和存储结构是密不可分的两个方面,一个算法的设计取决于所选定的逻辑结构,而算法的实现依赖于所采用的存储结构。逻辑结构逻辑结构是指数据元素之间的逻辑关系,即从逻辑关系上描述数据。它与数据的存储无关,是独立于计算机的原创 2020-05-29 21:45:50 · 309 阅读 · 0 评论