
数据结构
文章平均质量分 59
L-M-Y
健康和自由至上
展开
-
数据结构之哈夫曼编码
要做课设啦!!疯狂赶DDL!!冲!文本压缩文本压缩是一项非常重要的技术,压缩和解压来处理文件可以减少文档在磁盘上的空间,从而使保存和传递都更加有效。简单来说,压缩就是对文本进行重新编码,以减少不必要的空间。哈夫曼编码就是一种最基本的压缩编码的方法。哈夫曼树所谓哈夫曼编码节约空间、时间的原理在我看来就是:给出现频率多的字符较短的编码,给出现频率低的字符较长的编码,以此减少编码长度。来看两张图,第一张是一棵普通二叉树,第二张是一棵哈夫曼树。我们通常将,带权路径最小的二叉树称为哈夫曼树。构造哈原创 2022-01-01 12:54:54 · 2034 阅读 · 0 评论 -
拓扑排序 Topological Sort
文章目录AOV网介绍拓扑排序拓扑排序算法举栗AOV网介绍在一个表示工程的有向图中,用顶点表示活动,用弧表示活动之间的优先关系,这样的有向图为顶点表示活动的网,我们称AOV网(Activity On Vertex Network).如图:设G(V,E)是一个具有n个顶点的有向图,V中的顶点序列v1,v2,…vn,满足若从顶点vi到vj有一条路径,则在顶点序列中顶点vi必在顶点vj之间。则我们称这样的顶点序列为一个拓扑序列。拓扑排序拓扑排序,就是对一个有向图构造拓扑序列的过程。构造时,会出现两种原创 2021-12-12 11:15:57 · 693 阅读 · 0 评论 -
常见排序算法总结
衡量算法优越性的规则时间性能。在我的理解里,计算机产生的最大功能和意义就是“以空间换时间”。因此,一个算法的时间开销是衡量其好坏的最终的标志。而搞笑的排序算法应该是具有尽可能少的关键字比较次数和记录移动次数。空间需求:执行一个算法往往需要一些辅助存储空间,好的算法往往需要的辅助存储空间也相对少冒泡排序1)两两比较相邻元素a[i]和a[i+1],如果a[i]>a[i+1],则交换a[i]和a[i+1]的位置2)对剩下的n-1个元素,再两两进行比较,按同样规则交换它们的位置,经过n-2次边角原创 2021-11-20 14:39:43 · 1358 阅读 · 2 评论 -
快速排序 QuickSort
产生原因排序方法千千万,算法不断在更新进步。可以说,希尔排序是插入排序的升级版;堆排序是选择排序的升级版。而快速排序,是冒泡排序的升级版。我们知道,冒泡排序通过不断比较和移动交换来实现排序,每次至多移动相邻两个元素的位置,像泡泡一样,一点点往上升。而快速排序,则是通过增大元素的移动距离,使较大的元素从前面直接移动到较后的位置,较小的值直接移动到较前面的位置。从而大大减小了时间复杂度。原理通过一趟排序将待排记录分割成独立的两部分,其中一部分元素值均比另一部分元素值小,则可分别堆这两部分进行排序(原创 2021-11-18 21:32:57 · 831 阅读 · 0 评论 -
二叉查找树之红黑树(RBTree)
红黑树概念红黑树是一种含有红黑两种结点并且能够自平衡的二叉查找树。划重点:红黑结点,自平衡,二叉查找树。红黑树也是二叉查找树的一种,实现这一点并不难,它主要困难在自平衡的处理。红黑树的性质:(它在每个节点增加了一个存储位来记录节点的颜色,red或black)每个节点要么是黑色,要么是红色。根节点是黑色每个叶节点是黑色每个红色结点的两个子节点一定都是黑色(不会出现连续的两个红色结点)任意一结点到每个叶节点的路径上都包含数量的黑结点如果一个节点是黑节点,那么它一定有两个子节点红黑原创 2021-11-13 17:24:06 · 653 阅读 · 0 评论 -
优先队列 priority queue
优先队列概念优先队列(priority queue)是一种特殊的数据结构。队列中每一个元素都被分配到一个优先权值,出队顺序按照优先权值来划分。一般有两种出队顺序:高优先权出队或低优先权出队。priority queue至少要有两个最基本的ADT:进队,出队(按照高优先权或低优先权)产生原因:同样是为了提高数据处理的效率。试想,要实现优先队列对应的功能,若使用链表或者数组,那么要么先排序再插入,要么先插入再查找最大最小元素。这样一来,入队出队的时间复杂度至少为O(N)。优先队列出队和入队的时间原创 2021-11-10 18:28:07 · 2568 阅读 · 0 评论 -
哈希表(hash table)
哈希表出现的原因经过一段时间对数据结构的学习,我们应该知道:常用的数组和链表各自存在一定的优缺点。具体如下:数组:查找容易,插入和删除数据困难链表:查找苦难,插入和删除数据容易那有没有一种数据结构能结合二者的优点呢?当然,这便是哈希表出现的原因。它是一种寻址容易、插入删除也容易的数据结构。哈希表概念首先呢,哈希表就是通过将关键字值(key)映射到数组的某个确定的下标值。如此,可以通过数组下标直接访问数据,而不必遍历所有数据。哈希表查找的平均期望时间复杂度为O(1)举个栗子吧~我去原创 2021-11-06 16:03:10 · 453 阅读 · 0 评论 -
二叉树之伸展树(Splay Tree)
普通二叉查找树的局限二叉查找树(Binary Search Tree)有着许多应用,但是二叉查找树的基本操作时间与树的高度成正比,如果一棵树为n个结点的线性链表,则查找的时间复杂度会达到O(N).由此产生了AVL树等改进版的二叉查找树,以维护查找的时间复杂度一直保持O(log N).二叉伸展树二叉伸展树也是一种改进的二叉搜索树,但与AVL不同,它不用每一步都保持二叉树的平衡,而是每次查找到节点之后,对树进行重构(把被查找到的节点换到根节点的位置),这种二叉树的查找时间复杂度也可以一直保持O(log原创 2021-10-29 17:25:58 · 247 阅读 · 0 评论 -
二叉树之AVL树
AVL树的概念AVL树是带有平衡条件的二叉查找树。这个平衡条件必须要容易保持,而且它必须保证树的深度是O(log N)。AVL树的性质具有二叉查找树的全部特性每个节点的左子树和右子树的高度差至多等于1如图,只有左边的树是AVL树AVL树的查找有着二分查找的思想,优点是,能够很快地找到目的节点,时间复杂度仅为O(log N)AVL树的维护过程AVL树的特点就是,随着节点的插入,可能会造成AVL树结构的破坏,下面是其维护过程:我把可能出现的情况总结成四种第一种情况,为右右型,进行左旋原创 2021-10-29 16:32:56 · 189 阅读 · 0 评论 -
C++冒泡排序
最近什么树啊图啊的,学的晕晕乎乎,于是决定先学点简单的呜呜呜~概念1)两两比较相邻元素a[i]和a[i+1],如果a[i]>a[i+1],则交换a[i]和a[i+1]的位置2)对剩下的n-1个元素,再两两进行比较,按同样规则交换它们的位置,经过n-2次边角,将最大值交换到a(n-1)的位置3)继续上述操作,经过n-1的“冒泡处理”,每次进行n-i次比较时间复杂度n*n代码模板void bubbleSort(int a[], int n){ for (int i = n - 1原创 2021-08-16 09:58:59 · 137 阅读 · 0 评论 -
二叉树的基本操作(C++实现)
基本概念二叉树由结点的有限集合构成。这个有限集合要么是空集,要么是一个根节点及两棵互不相交、分别称为这个跟的左子树和右子树的二叉树组成的集合。二叉树的特点每个结点最多有两棵子树,所以二叉树中不存在度大于2的结点。左子树和右子树是有顺序的,次序不能随意颠倒。及时树中某结点只有一颗子树,也要区分它是左子树还是右子树。二叉树的五种基本形态空二叉树只有一个根节点根节点只有左子树根节点只有右子树根节点既有左子树,又有右子树相关概念边(edge):两个结点(node)的有序对(ord原创 2021-08-09 16:29:41 · 30075 阅读 · 17 评论 -
C++二分查找总结
二分查找是一种非常快速的查找方法,又称折半查找。二分查找定义二分查找(Binary Search)技术。它的前提是线性表中的记录必须是关键码有序(通常为升序),线性表必须采用顺序存储。二分查找的基本思想:在有序表中,取中间记录作为比较对象,若给定值与中间记录相等,则查找成功;若给定值小于中间记录的关键字,则在中间记录的左半区继续查找;若给定值大于中间记录的关键字,则在中间记录的右半区继续查找。不断重复,直至查找成功,或所有查找区域无记录查找失败为止。代码示例//by lmy#include原创 2021-08-03 10:43:37 · 224 阅读 · 0 评论 -
栈的应用之计算四则表达式
计算原理在四则运算之中,括号都是成对出现的,即使是多重符号,也都是嵌套匹配的。所以,正好可以用栈这种数据结构来实现运算。具体规则如下:只要遇到左括号,就将左括号进栈(不管表达式中有多少重括号),遇到右括号,就让栈顶的左括号出栈,期间让数字运算。栈的应用栈的一个重要应用就是用来做简单的计算机程序。想要计算机具有计算四则表达式的能力,我们只需要需要两步操作1.将中缀表达式转化为后缀表达式2.将后缀表达式进行运算得出结果到这里肯定不懂什么是中缀表达式,什么是后缀表达式啦~没关系,下面就来解释喔定原创 2021-07-30 13:11:25 · 444 阅读 · 0 评论 -
串(String)
定义串(string),也称字符串,是由零个或多个字符组成的有限序列。一般的记法:string s=“a1a2a3…an”1.s是串的名称,用双引号或单引号括起来的字符序列是串的值,注意,单引2.号或者双引号不是串的内容3.串中的字符数目n成为串的长度4.零个字符的串成为空串(NULL string)5.相邻字符之间具有前驱和后继的关系。一些概念的相关解释:1.空格串,是只包含一个或多个空格的串,它不是空串,它有自己的长度2.子串和主串,串中任意个数连续序列的子序列成为该串的子串,相原创 2021-07-30 13:10:47 · 538 阅读 · 0 评论 -
KMP模式匹配算法
概念串(string)的最重要的操作之一就是串的模式匹配。说的这么高级,其实就是在一个主串里面找某一个子串的位置。而KMP是一种很快速的字符串查找方法。既然提到KMP的高效性,就不得不拿出朴素模式匹配算法来进行对比一下子。朴素的模式匹配算法若是在长度为m的主串里找一个长度为n的子串时间复杂度:O(m*n)举个小栗子吧~图片:虽然这个栗子可能看起来并不是特别复杂,但是实际上,计算机处理的并不仅仅只是单单的字符,而是二进制0和1的串,一个ASCII码是一个8位的二进制01串,所以,比一个字符原创 2021-07-28 15:21:53 · 287 阅读 · 0 评论 -
顺序栈的实现
栈的顺序存储结构栈的顺序存储其实也是顺序表实现的,简称顺序栈。线性表是用数组实现的一般情况下,用数组下标为0的一端作为栈底。之后,我们定义一个top变量来指示栈顶元素在数组中的位置,这个top可以变大变小,但是不能超出数组的最大容量。即Stacksize当栈存在一个元素时,top等于0,因此通常把空栈的判定条件定为top等于-1栈的声明这里注意一下下哈,我也是看了书上和很多网站上的定义,发现往往在建立栈时,也会定义几个固定的变量,来使得代码更加清晰明了,栗子如下啦~const int MAX原创 2021-07-28 10:13:48 · 795 阅读 · 0 评论 -
单链表元素的删除(迭代法)
链表元素的删除方法方法一:递归方法二:迭代(哈哈哈哈,刚开始学,觉得迭代法更好理解一点点,就先学了迭代法,递归待会儿在总结吧~)迭代法删除链表元素举个小栗子吧:对于一个存放整形数据的链表,删除其中值为a的结点思路:1.遍历链表找到所有值为a的结点2.将值为a的结点的上一个结点直接指向这个结点的下一个结点(temp->next=temp->next->next)未释放内存的版本:void remove_element(mynode *lhead, int a)原创 2021-07-21 13:03:57 · 1301 阅读 · 7 评论 -
数据结构之图的相关名词
图 graph1.G=(V,E)表示*V是定点(vertex)集合*E是边(edge)的集合2.完全图(complete graph)3.稀疏图(sparse graph)4.密集图(dense graph)无向图 undirected graph边涉及定点的偶对无序(unordered pair)实际上是双通有向图 directed graph边涉及定点的偶对是有序的(ordered pair)带权图 weighted graph定点的度(degree)入度indegree出原创 2021-07-17 12:05:47 · 571 阅读 · 0 评论 -
单链表的基本操作(singly linked list)
单链表的实现原创 2021-07-16 12:21:36 · 293 阅读 · 0 评论 -
数据结构概论
产生原因:原创 2021-07-15 09:24:25 · 161 阅读 · 0 评论