
数据结构与算法
MooMLu
go with heart,and fight with fear
展开
-
HDU1257 最长递增公共子序列问题
最少拦截系统Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other)Problem Description某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能超过前一原创 2017-02-17 09:45:40 · 389 阅读 · 0 评论 -
如果
如果我是一首歌我会化作音符环绕在你的四周从你的发丝绕到你的耳边再晃晃悠悠的蹭来蹭去看你气呼呼得样子而你碰不到我的我的自得其乐如果我是一阵风我想呼啦啦的赶着你跑把你的头发全都往后吹让你的脸正对着我让你的发丝在空中肆意飞扬那么活力的你我想可能会恶作剧将你的头发全吹到你的脸上让你口吞到你发梢然后抱怨埋汰着我如果我是窗前的橡树会默默的注视着你可以一直一直就那样看着原创 2017-05-05 18:59:11 · 495 阅读 · 0 评论 -
链表操作一【合并链表】【严蔚敏】
struct SqList { ElemType *elem; // 存储空间基址 int length; // 当前长度 int listsize; // 当前分配的存储容量(以sizeof(ElemType)为单位) };void MergeList(SqList La,SqList Lb,SqList &Lc) // 算法2.2 { // 已知线性表原创 2017-04-24 22:03:46 · 705 阅读 · 0 评论 -
顺序表基本操作【严蔚敏】
注:【属于配套书籍的源代码】链表的基本操作:创建,添加结点,删除结点,输出等 struct SqList { ElemType *elem; // 存储空间基址 int length; // 当前长度 int listsize; // 当前分配的存储容量(以sizeof(ElemType)为单位) }; Status InitList(SqList &L) //原创 2017-04-24 22:12:10 · 788 阅读 · 0 评论 -
数组的顺序表示和实现【严蔚敏】
代码为数据结构【严蔚敏】书籍配套纯c代码//数组的顺序存储表示 #include // 标准头文件,提供宏va_start,va_arg和va_end, // 用于存取变长参数表 struct Array { ElemType *base; // 数组元素基址,由InitArray分配 int dim; // 数组维数 i原创 2017-04-25 11:15:38 · 1239 阅读 · 1 评论 -
稀疏矩阵的创建【严蔚敏】
// c1.h (程序名) #include #include #include // malloc()等 #include // INT_MAX等 #include // EOF(=^Z或F6),NULL #include // atoi() #include // floor(),ceil(),abs() #include //cout,cinusin原创 2017-04-25 11:27:30 · 3213 阅读 · 0 评论 -
广义表操作【严蔚敏】
注:与《数据结构》【严蔚敏】配套纯c代码 //广义表的扩展线性链表存储表示 enum ElemTag{ATOM,LIST}; // ATOM==0:原子,LIST==1:子表 typedef struct GLNode { ElemTag tag; // 公共部分,用于区分原子结点和表结点 union // 原子结点和表结点的联合部分 { AtomType原创 2017-04-25 12:05:36 · 1397 阅读 · 0 评论 -
Deletion from BST (Binary Search Tree)
#include <bits/stdc++.h>using namespace std;// Data structure to store a Binary Search Tree nodestruct Node { int data; Node *left, *right;};// Function to create a new binary tree node havi转载 2017-05-17 12:13:12 · 488 阅读 · 0 评论 -
动态存储管理之一【严蔚敏】
用户请求系统分配内存:(两种策略)1)系统继续从高地址的空闲块中进行分配,不理会已分配的内存区是否已经空闲,直到无法满足分配请求时,系统再去回收用户不再使用的空闲块。2)用户执行完结束,立马分配过的空闲块释放,用户请求分配时,遍历整个内存区,找合适空闲块分配。可利用空间表实现内存分配方法:表中包含所有可分配的空闲块,每一块是链表中一个节点。1)所有用户请求分配存储量大小相同。原创 2017-04-26 18:52:55 · 752 阅读 · 0 评论 -
查找表【严蔚敏】
查找表:同一类型元素或记录构成的集合。对查找表的常用操作:1)查找某个元素是否在表中;2)检查某个元素的各个属性;3)插入一个新数据元素;4)删除某个数据元素。静态查找表:只有前面两种查找操作的查找表;动态查找表:除了静态功能之外在查找过程中可以插入不存在的元素或者删除已存在的数据元素。关键字:数据元素或记录中某个数据项的值。若关键字标识具有唯一性,则称为主关键字。原创 2017-04-26 19:35:21 · 748 阅读 · 0 评论 -
查找表查找方式【严蔚敏】
顺序查找(线性查找)顺序查找(Sequential Search)又称为线性查找,是一种最简单的查找方法。查找过程如下:从线性表的一端开始顺序扫描线性表,依次将扫描到的结点关键字和给定值进行比较。若当前扫描到的结点关键字与给定值相等,则查找成功;若扫描结束后,仍未能找到关键字等于给定值的结点,则查找失败。int Search_Seq(SSTable ST,KeyType原创 2017-04-26 21:50:46 · 1030 阅读 · 0 评论 -
次优查找树的实现【严蔚敏】
考虑查找成功时的情况:查找性能最佳的判别树是带权路径之和PH的值。最优查找树:用数学公式来表示就是:使得的PH值最小的树为该数组的静态最优查找树。其中i为节点标号,为节点i的带权路径长度,,它等于结点i的查找路径长度c,乘以该结点被查找的概率p;h表示节点i在搜索树中的高度。通俗点来说,就是权值越大的结点,越放到靠近根结点的位置。可能查找概率大,需要的比较次数(折半查找中的次数)多原创 2017-04-26 22:54:44 · 6235 阅读 · 1 评论 -
huffman树【严蔚敏】
huffman树(最优二叉树)的基本操作及其定义假设有n个权值,则构造出的哈夫曼树有n个叶子结点。 n个权值分别设为 w1、w2、…、wn,则哈夫曼树的构造规则为:(1) 将w1、w2、…,wn看成是有n 棵树的森林(每棵树仅有一个结点);(2) 在森林中选出两个根结点的权值最小的树合并,作为一棵新树的左、右子树,且新树的根结点权值为其左、右子树根结点权值之和;(3原创 2017-04-27 16:26:14 · 1116 阅读 · 1 评论 -
图的基本操作【严蔚敏】
图的基本操作:ADT Graph{ 数据对象V:V是具有相同特性的数据元素的集合,称为顶点集。 数据关系R:R={VR} VR={<v,w>|v,w∈V且P(v,w),<v,w>表示从v到w的弧, 谓词P(v,w)定义了弧<v,w>的意义或信息} 基本操作: CreateGraph( &G, V, VR ) 初始条件:V是图的顶原创 2017-04-27 18:30:24 · 4096 阅读 · 0 评论 -
栈的基本操作【严蔚敏】
typedef struct SqStack { SElemType *base; /* 在栈构造之前和销毁之后,base的值为NULL */ SElemType *top; /* 栈顶指针 */ int stacksize; /* 当前已分配的存储空间,以元素为单位 */ }SqStack; /* 顺序栈 */Status InitStack(SqStack *原创 2017-04-22 17:28:26 · 962 阅读 · 0 评论 -
队列的基本操作【严蔚敏】
typedef struct QNode { QElemType data; struct QNode *next; }QNode,*QueuePtr; Status InitQueue(LinkQueue *Q) { /* 构造一个空队列Q */ (*Q).front=(*Q).rear=(QueuePtr)malloc(sizeof(QNode)); if(原创 2017-04-22 17:22:45 · 1511 阅读 · 1 评论 -
【动态规划】棋盘分割问题
描述将一个8*8的棋盘进行如下分割:将原棋盘割下一块矩形棋盘并使剩下部分也是矩形,再将剩下的部分继续如此分割,这样割了(n-1)次后,连同最后剩下的矩形棋盘共有n块矩形棋盘。(每次切割都只能沿着棋盘格子的边进行) 原棋盘上每一格有一个分值,一块矩形棋盘的总分为其所含各格分值之和。现在需要把棋盘按上述规则分割成n块矩形棋盘,并使各矩形棋盘总分的均方差最小。 均方差,其中平均值,x原创 2017-03-29 21:06:49 · 3096 阅读 · 0 评论 -
【广度遍历】图像有用区域
图像有用区域时间限制:3000 ms | 内存限制:65535 KB难度:4描述“ACKing”同学以前做一个图像处理的项目时,遇到了一个问题,他需要摘取出图片中某个黑色线圏成的区域以内的图片,现在请你来帮助他完成第一步,把黑色线圏外的区域全部变为黑色。 图1原创 2017-03-30 15:26:06 · 588 阅读 · 0 评论 -
【栈的简单使用】括号配对问题
括号配对问题时间限制:3000 ms | 内存限制:65535 KB难度:3描述现在,有一行括号序列,请你检查这行括号是否配对。输入第一行输入一个数N(0输出每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No样例输入3[(])(])([[]()])样例输出NoNoYes原创 2017-04-10 14:26:22 · 938 阅读 · 0 评论 -
【神搜递归】统计问题
统计问题Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 8713 Accepted Submission(s): 5163Problem Description在一无限大的二维平面中,我们做如下假设:原创 2017-04-13 18:33:39 · 477 阅读 · 1 评论 -
图的遍历
DFS 基本思想:首先从图中某个顶点v0出发,访问此顶点,然后依次从v0相邻的顶点出发深度优先遍历,直至图中所有与v0路径相通的顶点都被访问了;若此时尚有顶点未被访问,则从中选一个顶点作为起始点,重复上述过程,直到所有的顶点都被访问。可以看出深度优先遍历是一个递归的过程。BFS 基本思想:首先,从图的某个顶点v0出发,访问了v0之后,依次访问与v0相邻的未被访问的顶点,然后分别从这些顶点出发,原创 2017-04-28 20:47:37 · 567 阅读 · 0 评论 -
开门人关门人
题目描述: 每天第一个到机房的人要把门打开,最后一个离开的人要把门关好。现有一堆杂乱的机房签到、签离记录,请根据记录找出当天开门和关门的人。输入: 测试输入的第一行给出记录的总天数N ( N> 0 ),下面列出了N天的记录。 每天的记录在第一行给出记录的条目数M (M > 0 ),下面是M行,每行的格式为 证件号码 签到时间 签离时间 其中时间按“小时:分原创 2017-04-29 19:19:14 · 426 阅读 · 0 评论 -
二叉搜索树之一
二叉查找树(BinarySearch Tree,也叫二叉搜索树,或称二叉排序树Binary Sort Tree)或者是一棵空树,或者是具有下列性质的二叉树:(1)、若它的左子树不为空,则左子树上所有结点的值均小于它的根结点的值; (2)、若它的右子树不为空,则右子树上所有结点的值均大于它的根结点的值; (3)、它的左、右子树也分别为二叉查找树。 二叉搜索树的基本操作:原创 2017-05-01 19:57:41 · 413 阅读 · 0 评论 -
二叉搜索树之二
二叉查找树的删除情况(1) 结点p无左右子树,则直接删除该结点,修改父节点相应指针(2)结点p有左子树(右子树),则把p的左子树(右子树)接到p的父节点上(3) 左右子树同时存在,则有三种处理方式 1>找到结点p的中序直接前驱结点s,把结点s的数据转移到结点p,然后删除结点s,由于结点s为p的左子树中最右的结点,因而s无右子树,删除结点s可以归结到情况(2)。2> 找到结点p的中序直接后继结原创 2017-05-02 21:17:19 · 404 阅读 · 0 评论 -
排序算法之快速排序
快速排序的基本思想 快速排序使用分治的思想,通过一趟排序将待排序列分割成两部分,其中一部分记录的关键字均比另一部分记录的关键字小。之后分别对这两部分记录继续进行排序,以达到整个序列有序的目的。快速排序的三个步骤 1) 选择基准:在待排序列中,按照某种方式挑出一个元素,作为 “基准”(pivot); 2) 分割操作:以该基准在序列中的实际位置,把序列分成两个子序列。此时,在基准左边的元素都比该原创 2017-05-03 00:49:58 · 496 阅读 · 0 评论 -
B树,B-树,B+树
B树 即二叉搜索树: 1.所有非叶子结点至多拥有两个儿子(Left和Right); 2.所有结点存储一个关键字; 3.非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树; 如: B树的搜索,从根结点开始,如果查询的关键字与结点的关转载 2017-05-03 13:47:13 · 301 阅读 · 0 评论 -
AVL树(平衡二叉查找树)
转载来至:http://blog.youkuaiyun.com/collonn/article/details/20128205AVL树的旋转操作 图解 最详细各大教课书上讲的都是左旋与右旋,其实这样很容易理解错误,我们换一种叫法。我们称呼左旋为:逆进针旋转。我们称呼右旋为:顺进针旋转。老规矩,直接上图。如果再看不懂AVL树的旋转,我就无能为力了。。。如果图中有错误转载 2017-05-03 15:16:36 · 364 阅读 · 0 评论 -
二叉树的基本操作(严蔚敏)
二叉树是一种树形结构,它的特点是每个结点至多只有两棵子树(即二叉树中不存在度大于2 的结点),并且,二叉树的子树有左右之分,其次序不能颠倒。二叉树的链表 。 typedef struct BiTNode { TElemType data; struct BiTNode *lchild,*rchild; /* 左右孩子指针 */ }BiTNode,*BiTree;原创 2017-04-22 16:53:33 · 2410 阅读 · 1 评论 -
排序总结
冒泡排序 for(int j = 0; j < n - 1; j++) // 每次最大元素就像气泡一样"浮"到数组的最后 { for (int i = 0; i < n - 1 - j; i++) // 依次比较相邻的两个元素,使较大的那个向后移 { if (A[i] > A[i + 1])翻译 2017-05-20 10:20:12 · 482 阅读 · 0 评论