数据结构
文章平均质量分 67
zy010101
会写一点代码
展开
-
优先队列(堆)
优先队列:顾名思义,这个队列中的元素是有优先级的,它和普通的先进先出(FIFO)不一样。我们在很多场合可能都需要用到这种特殊的队列(例如,操作系统的进程调度)。可以看出来,优先队列(priority queue)的核心操作有两个,分别是插入和删除。插入是显而易见的,删除就是找出这个队列中优先级最高的那个元素(可以是最大的,也可是最小的)。一些简单的想法:我们可以采用一个简单的链表来实现,表...原创 2018-10-29 10:13:27 · 1233 阅读 · 1 评论 -
伸展树(splay tree)
对于二叉查找树而言,每次操作的最坏时间复杂度是O(N)。(当树退化为链表的时候)。为了解决这个问题,我们给树附加了一个平衡条件。平衡条件限制了任何节点的深度都不能过深。其中一种限制条件是:一颗二叉查找树的左子树和右子树的高度差不能超过1,这个条件限制产生了AVL树。二叉查找树的最坏操作是O(N)。但是这样的操作并不常见。所以累加起来的时间就变得比单次操作时间的最坏情形要重要的多。但是二叉查找树...原创 2018-10-16 17:02:03 · 2789 阅读 · 1 评论 -
AVL树(平衡二叉树)
AVL树这样一棵搜索二叉树,它的左右子树的深度之差不超过1。因此,他是带有条件的搜索二叉树。这个条件保证了AVL树的深度是O(log n).最简单的想法是左右两棵子树保持相同的高度。但是这种条件过于苛刻,难以使用。AVL只要求深度之差不超过1。AVL解决了二叉搜索树带来的不平衡问题。但是要求变成了我们必须在每次操作后进行调整,以使得AVL树保持平衡。另一种较新的方法是放弃平衡条件,允许树有任意的深...原创 2018-10-15 22:33:18 · 1523 阅读 · 1 评论 -
二叉搜索树
二叉搜索树(Binary Search Tree)也叫做二叉排序树或者二叉查找树。顾名思义,它是一种对排序和查找都很有用的特殊二叉树。二叉查找树满足以下性质:(假设二叉查找树中每个节点元素都是不同的,它也可以为空)非空左子树的所有键值小于其根节点的键值; 非空右子树的所有键值大于其根节点的键值; 左,右两棵子树都是二叉搜索树二叉搜索树本质上还是一棵二叉树,只不过对它做了限定,就行队列...原创 2018-10-14 11:45:59 · 291 阅读 · 0 评论 -
二叉表达式树
表达式树:表达式树的叶节点是操作数,其他节点是操作符。假设所有的运算符都是双目运算符,那么刚好形成一颗二叉树。我们可以通过递归计算左子树和右子树的值,从而得到整个表达式树的值。这就是一颗表达式树,在这棵树中,只有叶节点是操作数,其他节点都是操作符。 我们先来遍历一下这棵树。前序遍历这棵树将会得到这样一个表达式:++a*bc*de;(这样的表达式,我们称之为前缀表达式,操作符位于操作数之前。...原创 2018-10-13 14:16:44 · 14149 阅读 · 7 评论 -
树
树的一些定义和基本性质:一棵树只有唯一的根节点。 子树的个数没有限制,但是它们一定是互不相交的。(一对多的关系,不能是多对多的关系) 1个N节点的树有N-1个边。 节点的度:节点的子树个数(度为0的节点称为叶子节点)。 树的度:树中节点度最大的值。 m棵树(一个森林)一共有k条边,那么该森林一共有m+k个节点。(假设每棵树有Ki条边,那么k1+k2+...+km = k。并且每棵树有...原创 2018-10-12 12:02:48 · 313 阅读 · 0 评论 -
一元多项式的乘法与加法运算
直接上代码:#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>typedef struct Node List;struct Node{ int m; int n; List * next;};List *CreatList(); //创建链表List *...原创 2018-09-20 23:48:28 · 6715 阅读 · 9 评论 -
合并两个有序链表
合并两个有序链表,使得合并后的结果仍然是有序的,直观的做法就是从两个链表的首节点开始比较,将其中小的那个链接到新链表之中,(如果不想破坏原链表,那么需要将该节点拷贝一份,然后链接到新链表之中。)然后将该节点对应的原链表的遍历指针向后移动(p = p->next)一直这样比较下去,直到其中某个被遍历完,这时将剩余的那个链表直接链接到新链表后面即可。当然,对于不带头结点的链表而言,需要判断原...原创 2018-09-15 14:02:17 · 488 阅读 · 0 评论 -
Catalan数列及其应用
问题引入:现在有1,2,3,...,n个数字,按照顺序入栈,不同的堆栈操作(Push ,Pop)顺序可能会得到不同的堆栈输出序列。请问n个数字共有多少种不同的输出序列。解决过程:由于必须先入栈,才能出栈。对一个空栈的Pop是非法的操作。因此K次连续的出栈,在它之前必有K次入栈。一个简单的想法是看看能否找到它的递推公式。很遗憾,愚钝的我通过前几项(1,2,5,14)根本无法找出递推公式。上网找了...原创 2018-09-17 18:51:35 · 894 阅读 · 0 评论 -
栈(stack)的应用
栈(stack)通常也被称之为“堆栈”。它的本质是线性表。堆(heap)通常我们也称它为优先队列,本质是树。此处讲述一些stack的应用。 平衡符号 编译器在检查(){}这样成对出现的符号所造成的语法错误时,通常并不需要去设计一个很复杂的程序去判断。而是使用一个简单的算法,这个算法用到一个栈。算法描述如下:做一个空栈,从这串代码的开始读到末尾。如果读到的字符是一个开放字符——左括号,...原创 2018-09-27 23:11:04 · 2578 阅读 · 1 评论 -
深度优先搜索
深度优先搜索:在一个图中,从某一个节点开始访问该图(作为顶点),然后标记该节点为已访问。接着去访问它的邻接未访问的节点,这个过程一直持续,直到遇到一个终点——该节点的所有邻接节点都是已访问。此时,回退到上一个节点,并尝试从这里访问未访问的节点。直到回退到起始点,并且起始点邻接的节点都是已访问。这个时候该算法结束,这个时候该节点所在的连通子图所有的节点都被访问过了。如果还有其他未访问的节点存在,那么...原创 2018-08-25 20:37:00 · 256 阅读 · 0 评论 -
图的存储方式
图是多对多的关系,它的存储通常有两种办法。邻接矩阵和邻接表。一般而言,对于稀疏图使用邻接表来存储,对于稠密图使用邻接矩阵来存储。下面给出邻接矩阵实现图的代码。#include <iostream>#include <cstdlib>using namespace std;#define MAX 100typedef struct{ char V[MAX...原创 2018-08-24 20:00:07 · 308 阅读 · 0 评论 -
散列表(哈希表)
散列表散列表:通常,我们称散列的实现为散列表。散列是一种支持常数时间执行插入,删除,查找的技术,但是散列不支持排序操作。因此,FindMax,FindMin诸如此类的操作都将不支持。看到这里,我相信大家都明白我们为什么需要散列表了吧。(它能实现常数时间执行插入,删除,查找的技术)理想的散列表数据结构是一个包含有关键字的具有固定大小的数组。关键字就是含有某个相关值的字符串(在这里把数字也当做...原创 2018-11-13 17:30:37 · 3280 阅读 · 1 评论