
数据结构与算法
_taylorZ
抱歉了各位,很早就没做开发了,所以很长时间都没登陆
展开
-
带头节点的单链表
欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦:Markdown和扩展Markdown简洁的语法代码块高亮图片链接和图片上传LaTex数学公式UML序列图和流程图离线写博客导入导出Markdown文件丰富的快捷键快捷键加粗 Ctrl + B 斜体 Ctrl + I 引用 Ctrl原创 2016-05-14 13:07:11 · 438 阅读 · 0 评论 -
实现哈夫曼树
hufTreeNod.h#pragma once# include<iostream>//权重就直接用整型吧class hufTreeNode{public: hufTreeNode(int t=0) :weight(t) {} int weight; hufTreeNode *lChild=NULL; hufTreeNode *rChild=NULL;原创 2017-04-12 18:47:22 · 470 阅读 · 0 评论 -
十字链表存储有向图
十字链表是邻接表和逆邻接表的一种结合,顶点结点和弧结点如图: 这样,求一个顶点的出度,入度都比较方便,一般用来存储有向图,下面便是实现部分了,大体和之前几种存储方式差不多,只是由于存储方式的不同而略有不同而已 crossedList.h#pragma once# include<iostream># include"vertex.h"typedef struct _arcNode//弧结点原创 2017-05-02 12:51:02 · 1882 阅读 · 0 评论 -
关于邻接多重表
对于邻接表存储无向图,结点的个数是边数的两倍,如图: 该图有5条边,用邻接表存储: 结点是边数的2倍,而且对边进行操作时(比如删除,插入等)要对两个顶点操作,比较麻烦,所以书上又介绍了邻接多重表: 对于这张图G1的邻接多重表的图,我就纳闷了,比如用邻接多重表创建无向图时,输入序列(权值暂且不考虑,为0): 0 1 0 0 3 0 1 2 0 1 4 0 2 3 0 2 4原创 2017-05-02 22:51:41 · 16222 阅读 · 3 评论 -
prim算法实现最小生成树
如何根据给定的图,来求其最小生成树呢?先介绍prim算法准备工作: v表示图中所有顶点的集合,e为图中所有边的集合; 定义两个新的集合u和t,u存放最小生成树中的顶点(初始时只有一个顶点,然后一步一步加入顶点),t存放最小生成树的边(初始时为空) prim算法,大致过程是这样的: 从集合u和集合v-u中选出边的权值最小的顶点a和b(a属于u,b属于v-u),将a加入u原创 2017-05-03 18:12:48 · 683 阅读 · 0 评论 -
kruskal算法实现最小生成树
之前写了prim算法实现最小生成树,接下来看看kruskal算法 对于给定的图G,令其最小生成树T初始时为G到n个顶点(边为0),然后将G的边上权重从小到大排序,每次选取最小到边,如果选中的边的两个顶点是连通的,则删除该条边,选取下一条边,如果选中的两个顶点不连通,那么该边加入到T中,如此重复,直到所有顶点都连通 看图: 好了,接下来就是画思想为实践了,不妨先定义一个定位权重的函数原创 2017-05-04 13:21:40 · 769 阅读 · 0 评论 -
Dijkstra算法实现从一个源点到其他各点的最短路径
最短路径问题与现实生活中的问题息息相关,所以最短路径问题一定要掌握,这是书上的介绍 怎么理解呢?还是给个例子会比较清楚,比如下面这个图: 初始时,集合s={a}(假设a为源点),t={b,c,d,e} 然后从t中选取到a路径长度最短的顶点: a-b ->6 a-c ->2 a-d ->无穷大(a和d之间不能直接连接) a-e原创 2017-05-05 12:22:26 · 17554 阅读 · 2 评论 -
Floyd算法实现每一对顶点之间的最短路径
之前介绍了Dijkstra算法求某个顶点到其他每个顶点之间的最短路径,那么求每一对顶点的最短路径呢?对,可以重复调用Dijkstra算法,Dijkstra算法的时间复杂度是O(n*n),调用n次,所以总的时间复杂度是O(n*n*n),接下来介绍Floyd算法,时间复杂度也是O(n*n*n)下面是书上介绍的 怎么理解呢?无非就是对每一对顶点,循环n次(n为图的顶点个数),每次比较(比如当前顶点编号原创 2017-05-06 19:52:07 · 6132 阅读 · 0 评论 -
邻接矩阵存储带权值的无向图
vertex.h#pragma onceclass vertex{public: char data;//节点用字符表示 vertex(char c=' '); bool isVisited;//是否被访问过 void visited();};vertex.cpp#include"vertex.h"# include<iostream>using names原创 2017-04-26 12:52:21 · 8508 阅读 · 0 评论 -
邻接表存储无向图
adjacentList.h#pragma once//邻接表存储的无向图# include<iostream># include"vertex.h"typedef struct _listNode//表节点{ int iAdjaVeretex;//邻接点编号 int info;//边上信息 struct _listNode*next=NULL;}listNode原创 2017-04-27 18:51:54 · 3368 阅读 · 1 评论 -
数据结构课程设计
期末了,没错,基本上都会有课程设计的,这次是数据结构的课程设计, 分到的课题还好,不是很麻烦课程设计任务书题目4查找与排序算法时间性能的实验研究设计内容对各种查找算法(顺序查找、折半查找、插值查找、斐波拉契查找、二叉排序树查找、哈希查找)的时间性能进行实验研究对各种排序算法(直接插入排序、折半插入排序、希尔排序、冒泡排序、快速排序、选择排序、堆排序、归并排序)的时间性能进行实验研究。设计原创 2017-06-19 22:19:55 · 1818 阅读 · 0 评论 -
模式匹配之KMP算法
前面讲到过BF算法,虽然简单,但是效率比较低,KMP算法对此做了很大改进,该算法是由Knuth,Morris,Pratt同时设计的,所以简称KMP算法 为什么说BF算法效率低呢?比如s="34343434345",t="345",在位置3时,s中字符为‘3’,t中为'5',不匹配,所以又重新从s中第2个位置,t中第1个位置开始匹配,匹配失败,又从s中第3.... 可以看到,在s中后面子串原创 2017-04-01 17:20:56 · 1170 阅读 · 0 评论 -
模式匹配之BF(Brute Force)暴力算法
模式匹配即子串定位,是查找子串在主串中第一次出现的位置的过程,查找成功则返回改位置,否则返回-1 匹配过程是怎么样的呢? 首先比较主串和子串中第一个位置的字符(i,j分别表示主串,子串中的位置),所以初始化i=1,j=1;如果该字符相等,则继续比较两串中下一位置的字符,否则i回溯到上次开始比较的位置的下一位置,j回溯到1,继续进行上面的比较,当扫描其中任何一个串时则结束循环,如果j=t[0原创 2017-04-01 10:03:42 · 7840 阅读 · 0 评论 -
其他形式的链表
1: 带尾指针的单循环链表 2:带尾指针的双循环链表其中双链表值得注意,双链表的节点不仅有后向指针域,还有前向指针域,因 此访问前驱,后继方便(单链表访问前驱就不方便了),缺点是占用内存更多; 双链表也可以是循环的,就说说双循环链表的一些运算吧 双循环链表: 1)节点结构 typedef struct Node { ElementType dat原创 2016-05-14 14:47:55 · 354 阅读 · 0 评论 -
栈
栈,也是线性表(n个元素e1,e2….en组成的有限序列),顺序表,链表都是线性表,不过栈只能在一端(栈顶)插入和删除,称为”入栈”和“出栈”,(早期教材叫做“压栈”和“弹栈”);这就好比弹夹装子弹,栈 又分为顺序栈和链栈 1:顺序栈 1)结构 typedef struct sStack { ElementType data[MAXLEN]; //栈元素 in原创 2016-05-14 16:25:19 · 318 阅读 · 0 评论 -
回文
今天数据结构上机,内容是队列,栈的一些基本操作,输入字符串,并判断是否是回文,我以为回文就是字符串首位字母相等,擦,居然看错了了,回文是第i个字母和倒数第i个字母相等(比如abcba,abccba都是回文,),所以不得不重新编写下程序; 判断是否是回文。顺序栈比较简单,而链队列也只是稍微麻烦点了,这里用双链表比较合理,即节点有不仅有next指针,还有prior指针,依次从两边往中间遍历就好了# i原创 2016-05-18 18:30:01 · 382 阅读 · 0 评论 -
最大子列和问题(一)
看了看中国大学MOOC,很有感触,真心感谢网络上这么多资源,学习方便多了,步入正题,最大子列和问题,就是给定n个整数的序列,求最大的连续子列的和(如果是负数就返回0),举个简单例子来说吧 int arr[]={-5,4,6}; 最直接的就是算出所有连续子列的和,即: arr[0];//结果是0 arr[0]加到arr[1]//结果是0 arr[0]到arr[2原创 2016-09-12 17:02:30 · 2895 阅读 · 0 评论 -
线性表(带头结点的单链表)
node.h#pragma oncetemplate<typename T>class node{public: node() = default;//默认构造函数 node(T x) :elem(x),next(NULL) {}; T elem; //节点元素 node *next;};linkList.h#pragma once# include"nod原创 2017-03-11 12:32:31 · 1095 阅读 · 0 评论 -
顺序表(线性结构)
类模版不能分别在.h和.cpp文件中定义,所以只能都放在.h文件里seqList.h# pragma//类模版template<typename T>class seqList{public: seqList(int size=30); //默认构造函数,容量默认为30吧 ~seqList(); //析构函数 void push_ba原创 2017-03-11 10:25:06 · 410 阅读 · 0 评论 -
合并两个顺序表
要求是这样的,给定两个顺序表a,b。取a,b的并集到a,并使之有序, 比如a中元素为:2,4,7 b中元素为:3,4,5 那么合并之后a为:2,3,4,5,7main.cpp# include<iostream># include"seqList.h"using namespace std;template <typename T>void mergeSeq(seqList原创 2017-03-11 13:28:29 · 2681 阅读 · 0 评论 -
一道算法题,动态规划(dp: dynamic planning)
在牛客网刷题,无奈自己水平太菜,碰到这一题,弄了半天才弄懂…./*[编程题] 双核处理一种双核CPU的两个核能够同时的处理任务,现在有n个已知数据量的任务需要交给CPU处理,假设已知CPU的每个核1秒可以处理1kb,每个核同时只能处理一项任务。n个任务可以按照任意顺序放入CPU进行处理,现在需要设计一个方案让CPU处理完这批任务所需的时间最少,求这个最小的时间。输入描述:输入包括两行:原创 2017-03-30 19:28:50 · 3483 阅读 · 1 评论 -
二叉树的实现
binTreeNode.h#pragma once# include<iostream>template <typename T>class binTreeNode{public: binTreeNode() = default; binTreeNode(const T&t):data(t),lChild(NULL),rChild(NULL) {} T dat原创 2017-04-09 20:02:36 · 637 阅读 · 0 评论 -
按层次建立二叉树
很多建立二叉树都是用先序,中序或者后序建立,不过这就要求输入时要自己先想出相应的序列,比如下面的树(括号左边代表序号,里面是元素,0表示节点为空): 1(a) 2(b) 3(c) 4(0) 5(d) 6(e) 7(f)建立此树时,比如按中序建立,要得出其中序序列,这里就是0bdaecf,这样建立不太方便,因为要按照中序输入,比如一棵树深度比原创 2017-04-09 13:21:12 · 9440 阅读 · 1 评论 -
堆排序
堆排序是将输入序列建成堆,然后不断取出堆顶元素(一般是将堆顶元素放在后面),然后不断的对取出堆顶元素的堆进行调整,然后再取出堆顶元素,直至整个堆被取出。这样说可能有点不太明白,先说堆吧,就是完全二叉树,不过分为小根堆和大根堆,所有非叶子节点的值均不大(小)于其左右孩子的值,满足这一条件的堆为小(大)根堆 如图,比如输入序列3,2,8,9,5,1,4 现在用数组存储该输入序列,按从小到大排序,原创 2017-06-14 07:54:29 · 436 阅读 · 0 评论