数据结构
文章平均质量分 54
zl908760230
遇到问题首先得学会自己找答案!
展开
-
(1)数据结构是什么?
数据结构是什么?当用计算机解决一个实际问题时,需要经过如下步骤:1)从具体问题抽象出数学模型,2)选择或设计数学模型的算法,3)编写程序得到最终结果。而数据结构是一门研究非数值计算程序设计问题中计算机的操作对象以及他们之间的关系和操作的学科,用以描述现实世界实体的数学模型(非数值计算)及其上的操作在计算机中的表现和实现。数据结构不仅涉及计算机硬件,而且和计算机软件有着密原创 2016-10-21 20:01:45 · 3280 阅读 · 0 评论 -
(19)哈夫曼树
哈夫曼树,又称最优二叉树,是一类带权路径长度最短的二叉树。(1)路径:从一个结点到另一个结点之间的分支序列。(2)路径长度:从一个结点到另一个结点所经过的分支数目。完全二叉树是路径长度最短的二叉树。(3)结点的权:在实际应用中,人们常常给树的每个结点赋予一个具有某种实际意义的数,如单价、出现频率等,称为这个结点的权。(4)结点的带权路径长度:在树形结构中,把从树根到某一结点的路径长原创 2017-03-28 23:35:25 · 254 阅读 · 0 评论 -
(20)顺序查找
顺序查找是经常使用的一种查找方法。这种方法既适用于顺序存储结构,又适用于链式存储结构。顺序查找的方法:对于给定的关键字k,从顺序表的一端开始顺序扫描表中元素,一次与记录的关键字域进行比较,如果某个记录的关键字等于k,则查找成功,否则查找失败。缺点:平均查找长度较大,特别是当查找元素很多时,查找效率低。优点:算法简单且适用面广。它对表的结构无任何要求,原创 2017-03-29 13:15:55 · 313 阅读 · 0 评论 -
(21)折半查找
折半查找又称为二分查找,它是一种 效率较高的查找方法。折半查找要求表有序,即表中元素an关键字有序,而且必须顺序存储。折半查找的思想:首先,将给定的关键字k与有序表的中间位置上的元素进行比较,若相等,则查找成功。否则,中间元素将有序表分成两个部分,前一部分中的元素均小于中间元素,而后一部分中的元素均大于中间元素。因此,k与中间元素比较后,若k小于中间元素,则应在前一部分中查找,否则原创 2017-03-29 14:13:27 · 1139 阅读 · 0 评论 -
(22)斐波那契查找
斐波那契查找原创 2017-03-31 19:01:00 · 311 阅读 · 0 评论 -
(23)插值查找
插值查找是根据数据的实际分布情况计算可能的位置,适合于数据分布均匀的情况。当预期的关键字值为均匀分布时,插值查找比折半查找更有效率;否则插值查找的效率会很差。记住mid的求解公式就可以了,这很简单。代码:#includeusing namespace std;int SearchInter(int num[],int key,int number) { int l原创 2017-04-01 11:15:20 · 266 阅读 · 0 评论 -
(17)二叉树
二叉树的概念 二叉树是另一种重要的树形结构,其递归形式的定义为:二叉树是n个结点的有限集合,该集合或者为空,或者是由一个特定的称之为根的结点和两个互不相交的称之为左子树和右子树的二叉树组成。 二叉树的特点是每个结点最多有两个孩子,分别称为该结点的左孩子和右孩子。也就是说,二叉树中不存在度大于2的结点,并且二叉树的子树有左右之分,其子树的次序不能颠倒,即使只有一颗子树,也必须原创 2017-02-25 22:24:45 · 448 阅读 · 0 评论 -
(28)单链表的两种反转方法
一.将原链表的节点按照顺序一个一个插入到新链表中。代码:Linkedlist Reversal(Linkedlist head) { Linkedlist newNode = NULL; for (Linkedlist p = head; p;) { Linkedlist temp = p->next; //保存前一结点 p->next = newNode;原创 2017-04-28 15:53:13 · 286 阅读 · 0 评论 -
(29)希尔排序
基本思想是:将待排序的记录划分成几组,从而减少参与直接插入排序的数据量,当经过几次分组排序后,记录的排序已经基本有序,再对所有的记录实施最后的直接插入排序。希尔对记录的分组,不是将相邻记录分为一组,而是将相隔一定距离的记录分为一组。希尔排序适合用于待排序数目较大的情况,而且希尔排序的性能与选定增量序列有关。代码:#includeusing namespace std;void原创 2017-04-28 19:48:38 · 198 阅读 · 0 评论 -
(24)直接插入排序
插入排序的主要思想是:将第一个元素看做有序,从第二个元素起将待排序的元素插入到有序的序列中,使有序的序列逐渐扩大,直到所有元素都插入到有序序列中。代码:#includeusing namespace std;void insertSort(int num[],int n) { int temp,j; //临时变量 for (int i = 1; i < n; i++)原创 2017-04-18 21:20:38 · 235 阅读 · 0 评论 -
(25)折半插入排序
直接插入排序的改进。 比较次数减少,移动次数增加,时间复杂度不变。代码:#includeusing namespace std;void BinSort(int num[],int n) { int low, high,temp,mid; for (int i = 0; i < n; i++) { low = 0; temp = num[i]; high = i -原创 2017-04-18 21:55:35 · 244 阅读 · 0 评论 -
(26)二路插入排序
#includeusing namespace std;void BinInsertSort(int num[],const int n) { int temp[12] = {0}, finl = 0, first = 0; temp[0] = num[0]; for (int i = 1; i < n; i++) { if (num[i] >= temp[0]) { //比有序数原创 2017-04-21 12:03:50 · 307 阅读 · 0 评论 -
(30)冒泡排序
冒泡排序是交换排序的一种,算法内容跟它的名字一样,值大的元素会经过交换不断的移向数列的前端,这个过程就像水底正在上浮的气泡一样。代码:#includeusing namespace std;void BubbleSort(int num[],int n) { for (int i = 0; i < n; i++) { for (int j = n - 1; j > i; j--)原创 2017-05-12 09:36:21 · 207 阅读 · 0 评论 -
(31)鸡尾酒排序
一种改进的冒泡排序,原理是对要排序的数组进行双向冒泡,双向冒泡排序又称鸡尾酒排序。原理是:大数向后排,小数向前排。代码:#includeusing namespace std;void CockTail(int num[],int n) { int tail = n - 1; int i; for ( i = 0; i < tail;) { //将最小的数排到前面 f原创 2017-05-12 10:11:31 · 254 阅读 · 0 评论 -
(27)表插入排序
#includeusing namespace std;#define LISTSIZE 13typedef struct { int value; int next;}LinkedList;void initList(LinkedList list[],int num[],int count) { //初始化循环链表 list[0].value = INT32_MAX; l原创 2017-04-22 15:49:26 · 535 阅读 · 0 评论 -
(18)线索二叉树
以这种结点构成的二叉链表作为二叉树的存储结构,称为线索链表,其中指向结点前驱和后继的指针,称为线索;加上线索的二叉树,称为线索二叉树,以某种次序遍历二叉树使其变为线索二叉树的过程,称为线索化。代码:原创 2017-03-27 20:39:18 · 234 阅读 · 0 评论 -
(11)串的模式匹配:朴素的模式匹配算法,KMP算法
子串的定位操作通常称为串的模式匹配,它是各种串处理系统中最重要的操作之一,例如很多软件,若有“编辑”菜单项的话,则其中必有“查找”子菜单项。子串定位算法即称为模式匹配算法。朴素的模式匹配算法我上一篇文章写的堆存储的串就是用的朴素的模式匹配算法。这种算法很简单,就是子串和主串进行对应位置的匹配,如果发生失配,那么主串和子串都进行回溯,主串回溯到开始匹配位置数目加一,子串回溯到零。代码如下原创 2017-03-06 10:08:21 · 1034 阅读 · 0 评论 -
(2)算法
算法:是对特定问题求解步骤的一种描述,是对指令的有限序列。算法与数据结构的关系紧密,在进行算法设计时首先要确定相应的数据结构。算法的特性:1.有穷性:算法只执行有限步,并且每步应该在有限的时间内完成。2.确定性:算法中的每一条指令必须有确切的含义,无二义性。3.可行性:算法中描述的操作都是可以通过已经实现的基本运算执行有限次来实现的。4.输入:算法具有零个或原创 2016-10-22 14:57:16 · 345 阅读 · 0 评论 -
(5)循环链表
将链表通过指针域首尾相接,即链表尾结点的指针域指向头结点形成的链表叫做循环链表。由单链表构成叫做单循环链表。单循环链表在任意一结点都可以访问其他节点,用指针是否为null判断是否到达链表尾。一般使用尾结点的指针来表示,提高效率。代码:原创 2016-11-03 22:17:33 · 432 阅读 · 0 评论 -
(3)线性表:顺序表
线性表: 是一个线性结构,它是一个含有n≥0个结点的有限序列,对于其中的结点,有且仅有一个开始结点没有前驱但有一个后继结点,有且仅有一个终端结点没有后继但有一个前驱结点,其它的结点都有且仅有一个前驱和一个后继结点。优点:逻辑上相邻的元素在屋里存储位置上也相邻,随机存取,运算简单。线性表由分为顺序表和链表两类。顺序表:在内存中用地址连续有限的一块存储空间顺序存放原创 2016-10-26 11:51:19 · 357 阅读 · 0 评论 -
(6)双链表
双链表:每个结点有一个指向前驱的指针域和指向后继的指针域是链表可以进行双向查找,用这种结点结构组成的链表称为双链表。双链表头尾相连构成双向循环链表。双链表的基本操作:1)Length(L) 返回表L的长度,即表中元素个数2)Prior(L,i) 取位置i的前驱元素3)Next(L,i) 取位置i的后继元素4)Locate(L,x) 这是一个函原创 2016-11-07 11:42:50 · 367 阅读 · 0 评论 -
(4)链表(单链表)
链表:单链表以链式结构存储结构的线性表称为线性链表。元素本身的信息和其后期信息组成数据元素的存储映像,称为结点;线性链表有三种:1)单链表2)双链表3)循环链表。对链表的任何操作都必须从第一个结点开始,第一个结点的地址存放在一个指针变量中,这个指针变量指向第一个结点,也就是链表最前面的结点,因此这个指针变量常称为头指针。我们在整个线性链表的第一个结点原创 2016-10-28 12:10:59 · 543 阅读 · 0 评论 -
(9)队列
队列是一种只允许在表的一端插入,在另外一段删除的存取受限的线性表。允许插入的一端称为队尾,允许删除的一端称为对头。像排队一样,先进入队列的元素先出队列。所以队列是一种先进先出的线性表。 除了栈和队列之外,还有一种限定性数据结构称为双端队列。双端队列是限定插入和删除操作在表的两端进行的线性表。实际使用中,还有输入受限的双端队列(一段输入,两端输出)和输出受限的双端队列(一端输出,两端输入)。原创 2016-12-10 20:59:17 · 348 阅读 · 0 评论 -
(7)静态链表
静态链表:用数组描述的链表。而且静态链表的表现形式即为结构体数组,结构体变量包括数据域data和游标CUR(我用的是next)data中存放的是储存的元素值。cur中存放的是下一元素的数组下标。我对静态链表的理解就是:静态链表表面上是一个结构体数组,但是逻辑上是两个数组,一个数组首元素的下标是0,它连接的是所有空闲的结点。另一个数组首元素下标是1,它表示的是正在使用的所有结点,静态原创 2016-11-23 21:47:39 · 424 阅读 · 0 评论 -
(8)栈
栈是只允许在表尾进行插入、删除的线性表。对栈来说,表尾有特殊的含义,我们将表尾称为栈顶,而表的另一端,即表头称为栈底。不含元素的空表称为空栈。由其定义可以看出先进入栈的元素最后才能出栈,所以栈又被称为后进先出的线性表。 若栈满,执行进栈则发生上溢。若栈空,执行退栈则发生下溢。栈分两种:1)利用顺序存储结构实现的栈称为顺序栈2)利用链式存储结构实现的栈称为链原创 2016-12-07 16:28:07 · 204 阅读 · 0 评论 -
(10)串
串是字符串的简称。它是一种在数据元素的组成上具有一定约束条件的线性表,即要求组成线性表的所有数据元素都是字符,所以,人们经常这样定义串:串是一个有穷字符序列。如: abcdef串的长度为6串中没有任何字符,其串的长度为0,通常称为空串。由空格字符组成的串,一班称为空格串。串中任意连续的字符组成的子序列称为该串的子串。包含子串的串又称为该子串的主串。子串在主串中第一次出现原创 2017-02-06 15:35:47 · 244 阅读 · 0 评论 -
(12)数组
数组是由类型相同的数据元素构成的有序集合。数组一般不进行插入删除操作,也就是说,数组建立之后,元素的个数和元素间的关系就不再发生变化。因此,对于数组的操作一般只有两类:给定下标,取数组元素的值和修改数组元素的值。二维数组有两种存储方式,一是以行序为主序的存储方式;二是以列序为主序的存储方式。C语言以行序为主序的存储方式。 设每个元素的占用L个存储单元,在C语言中假设已定义了一个二维原创 2017-02-10 15:20:48 · 322 阅读 · 0 评论 -
(13)稀疏矩阵的压缩-三元组表(转置)
若矩阵中的非零元素远远小于矩阵元素的个数,且分布没有规律,则称这个矩阵为稀疏矩阵。压缩存储是指对多个值相同的元素只分配一个存储空间,对零元素不分配空间。稀疏矩阵的压缩存储有两种方法:三元组的顺序存储(三元组表)和链式存储(十字链表)。现在主要讲三元组表,由于两个阶数不同的矩阵可能具有相同的非零元素,为了区别,在存储三元组时,同时还应存储该矩阵的行数、列数。通常为了运算的方便,也原创 2017-02-13 19:03:09 · 2329 阅读 · 0 评论 -
(14)稀疏矩阵的压缩-三元组(相乘)
(1)因为position[i]表示B的第i行第一个非零元素在B.data中的序号,position[i+1]-1就表示第i行最后一个非零元素在B.data中的序号。为了表示B的最后一行最后一个非零元素在B.data中的序号,需在向量position中增加一个分量,即B的第m2行第一个元素的位置,虽然B中无第m2行。(2)矩阵相乘的基本思想是:对A.data中的每一个元素A.data.e,找到原创 2017-02-15 16:19:36 · 934 阅读 · 0 评论 -
(15)稀疏矩阵的压缩-十字链表
利用三元组表表示稀疏矩阵时,若矩阵的运算使非零元素的个数发生变化,就必须对三元组表进行插入、删除,也就是说必须移动三元组表中的元素,由于三元组表是顺序存储结构,所以这些操作将花费大量的时间,十字链表可以克服三元组表的上述缺点。 在十字链表中,数组的每一行的非零元素结点构成一个带头结点的循环链表,每一列的非零元素结点也构成一个带头结点的循环链表,这种组织方法使同一非零元素结点既处在某一行的链表原创 2017-02-15 22:44:42 · 2123 阅读 · 0 评论 -
(16)树
定义: 树是由n个结点构成的有限集合T。如果结点为零,则称为空树。否则,任何一个非空树满足以下两个条件:(1)有且只有一个特定的称为根的结点。(2)除根结点以外的其它结点被分为m个互不相交的有限集合T1,T2,T3,, , , , Tm,其中每个集合又是一棵树,并称为根的子树。原创 2017-02-24 21:20:24 · 269 阅读 · 0 评论 -
(32)快速排序
基本思想:首先将待排序记录序列中的所有记录作为当前待排序区域,从中任选一个记录(通常可选取第一个记录),以它的关键字作为枢轴,凡其关键字小于枢轴的记录均移至该记录之前,反之,凡关键字大于枢轴的记录均移动至该记录之后,这样一趟排序之后,记录将无序序列分割成两部分,再在这两部分中分别重复上述操作。代码:#includeusing namespace std;void quickSort(i原创 2017-06-02 10:20:02 · 555 阅读 · 0 评论