Data Structure
拉风小宇
本人目前在做银行做软件开发工程师,有浙江大学应用数学以及阿姆斯特丹自由大学人工智能的双硕士学位。
欢迎各位参与探讨关于后端开发,图形学和人工智能的问题,也感谢各位帮我点赞收藏转发我的博客(*^▽^*) Many Thanks
展开
-
有理有条地绘制立体图(利用数据结构)
话题引入利用顶点表边表面表储存信息利用邻接矩阵表示利用邻接表表示话题引入之前我曾经绘制过立体图形,不过后来发现这东西和数据结构的关系是很密切的,几个点之间是有不同关系,有的之前相互有线相连,有的之间没有线相连接,不能简单通过肉眼绘制,这在点很多的时候会出很大的问题。关于图的数据结构的博文,在网上有很多很好的讲稿 http://blog.csdn.net/xiazdong/article/de原创 2016-05-05 21:47:16 · 1603 阅读 · 2 评论 -
关于二叉树的其他操作
对于二叉树,最重要的操作是遍历,在之前介绍的遍历的基础上,关于二叉树可以延伸出各种对于二叉树的其他操作,下面就为大家介绍1.输出二叉树的叶子结点只需要在之前前序遍历的基础上增加检测结点的“左右子树是否都为空”。 //输出二叉树的叶子结点 void PreOderPrintLeaves(Ptree BT){ if(BT) { if(!BT->lchild&&!BT-原创 2016-11-20 16:26:42 · 577 阅读 · 0 评论 -
判断两棵二叉树是否同构
首先这里说明一下这里同构是指:两课树可以通过有限次变换左右子树变为同一棵树,举例如下上图所示的两棵树就是同构的原创 2016-11-21 11:13:06 · 12846 阅读 · 9 评论 -
集合的并查
所谓集合的并查主要是指两种运算,并(把两个集合并在一起)和查(查找某个元素是属于什么集合的),这里有一个经典题目例子:有10台电脑{1,2,3,...,9,10},已知下列电脑之间已经实现了连接: 1和2,2和4,3和5,4和7,5和8,6和9,6和10问:2和7之间,5和9之间是否是联通的?解决思路:(1)将10台电脑看成10个集合{1},{2},{3}原创 2016-12-03 20:26:18 · 716 阅读 · 0 评论 -
小白专场——堆中的路径
这个题目是堆的一道训练题目:将一些列给定数字插入到一个初始为空的小顶堆H,随后对任意给定的下标‘i’,打印从H[i]到跟结点的路径,例如对于下面的例子其中刚开始输入两个数5和3,表示堆中有五个元素,需要输出3条路径然后输入五个元素进入堆中,最后输入三条路径的开始位置坐标这个程序还是比较简单的,就直接给出代码和执行结果了#include #include原创 2016-12-04 13:11:53 · 521 阅读 · 0 评论 -
哈夫曼树的创建和操作
哈夫曼树的引进是与带有权重的二叉树有关的 首先定义带权路径长度(WPL):设二叉树有n个叶子结点,每个叶子结点带有权值WkW_k,从根结点到每个叶子的长度为IkI_k,则每个叶子结点的带权路径长度之和就是:WPL=∑nk=1wklkWPL=\sum_{k=1}^n w_kl_k。 最优二叉树或哈夫曼树:WPL最小的二叉树那么如何创建一棵哈夫曼树呢,哈夫曼提出了一种方法,就是每次把权值最小的两棵二原创 2016-11-29 20:06:13 · 3827 阅读 · 0 评论 -
小白专场——是否同一棵二叉搜索树
给定一个插入序列就可以唯一确定一棵二叉搜索树。然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到。例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树,都得到一样的结果。于是对于输入的各种插入序列,你需要判断它们是否能生成一样的二叉搜索树。输入格式:输入包含若干组测试数据。每组数据的第1行给出两个正整数N (≤10)和L,分别是每个序列插入元素的个数原创 2016-11-26 15:01:23 · 3322 阅读 · 0 评论 -
小白专场——FileTransfer
题目的来源是给定了一些计算机,一边需要在不同的计算机之间连接网线,另一边还要可以检查两台计算机之间是否已经连接好了,可以进行文件的传输了,也就是检查两个元素是否已经在同一个集合中了,所以FileTransfer这道题目是一道非常典型的并查集的问题根据之前定义的结构,查找N次的最坏情况界是N^2,其实Data这个数据域是可以不要的,例如下图直接用整形数组表示集合之后我们就有了原创 2016-12-04 17:00:05 · 1374 阅读 · 0 评论 -
图的定义以及表示
什么是图表示“多对多”的关系包含 一组顶点:通常用V(Vertex)表示顶点集合一组边:通常用E(Edge)表示边的集合 边是顶点对:(v,w)∈E,其中v,w∈V有向边<v,w><v,w>表示从v指向w的边(单边线)不考虑重边和自回路抽象数据类型定义类型名称:图(Graph)数据对象集:G(V,E)由一个非空的有限顶点集合V和一个有限边集合E组成。操作集:对于任意图G∈Gra原创 2016-12-05 16:44:51 · 637 阅读 · 0 评论 -
图的深度优先搜索
在介绍完图的定义和基本操作之后,我们这里要介绍图的遍历,图的遍历最基本的就是两种方法,就是DFS(Depth-First-Search)和广度优先搜索,这篇博文先介绍深度优先搜索。 深度优先遍历图的方法从图中某顶点v出发:(1)访问顶点v;(2)依次从v的未被访问的邻接点出发,对图进行深度优先遍历;直至图中和v有路径相通的顶点都被访问;(3)若此时图中尚有顶点未被访问,则从一原创 2016-12-06 21:18:02 · 3335 阅读 · 2 评论 -
图的广度优先搜索
在上一篇博文中我们介绍了图的深度优先遍历,在这一篇博文中我们将介绍图的另外一种搜索方式——图的广度优先遍历(BFS),也称为宽度优先搜索,其英文全称是Breadth First Search图的广度优先搜索 已知图G=(V,E)和一个源顶点s,宽度优先搜索以一种系统的方式探寻G的边,从而“发现”s所能到达的所有顶点,并计算s到所有这些顶点的距离(最少边数),该算法同时能生成一原创 2016-12-07 11:06:01 · 1544 阅读 · 0 评论 -
二叉搜索树的操作
二叉搜索树问题主要是根据动态查找问题提出的,我们在考虑可不可以在遇到一个新的数据需要插入的时候,可不可以把它直接放到一棵二叉树里,这样就可以在查找的时候达到logN的复杂度了,在查找的时候如果比根节点大,去右子树查找,小的话去左子树去查找 二叉搜索树:一棵二叉树,可以为空;如果不为空,满足以下性质:1.非空左子树的所有键值小于其根节点的键值。2.非空右子树的所有键值大于其根原创 2016-11-22 10:34:54 · 537 阅读 · 0 评论 -
平衡二叉树结点的插入和调整
首先要说明为什么要引进平衡二叉树【例】搜索树结点按照不同的插入次序,将导致不同的深度和平均查找长度(ASL),例如下图第二种比较“均匀”,最平衡的方式是左右结点树相同,但是这个条件比较苛刻,可是适当放宽这个条件,因此引进了平衡二叉树“平衡因子”(Balance Factor,简称BF):BF(T)=hL-hR,其中hL和hR分别为T的左、右子树的高度平衡二叉树(Balanc原创 2016-11-24 10:58:47 · 6988 阅读 · 0 评论 -
无权图的单源最短路问题
最短路径问题的抽象在网络中,求两个不同顶点之间的所有路径中,边的权值之和最小的那一条路径这条路径就是两点之间的最短路径(Shortest Path)第一个顶点为源点(Source)最后一个顶点为终点(Destination)问题分类单源最短路径问题:从某固定源点出发,求其到所有其他顶点的最短路径(有向)无权图(有向)有权图多源最短路径问题:求任意两顶点间原创 2016-12-08 10:39:10 · 2271 阅读 · 0 评论 -
有权图的单源最短路算法
有权图的单源最短路亦被称为Dijkstra算法(单源最短路径),首先要声明这个算法无法解决含有负值圈的图算法步骤如下:G={V,E}1. 初始时令 S={V0},T=V-S={其余顶点},T中顶点对应的距离值若存在,d(V0,Vi)为弧上的权值若不存在,d(V0,Vi)为∞2. 从T中选取一个与S中顶点有关联边且权值最小的顶点W,加入到S中3. 对其余T中顶点的距离原创 2016-12-08 22:08:10 · 1708 阅读 · 0 评论 -
二叉树利用堆栈实现遍历的非递归算法
二叉树的遍历有三种不同的遍历方法,分别是前序遍历、中序遍历以及后序遍历遍历的实现我们在上一篇博客中已经用递归的方法实现了,那么可不可以不用递归实现呢,答案是可以的,在这一篇博客中我们会利用堆栈将遍历改为非递归原创 2016-11-18 16:16:36 · 5837 阅读 · 2 评论 -
二叉树利用队列实现层次遍历
这里先提一句为什么之前树的创建可以由前序遍历的方法搞定,原因是前序遍历的时候把所有的空节点都包含在内了,如果仅仅只有非空节点的前序遍历输入,是无法得到单一二叉树的,例如给出了一个前序遍历顺序AB那么有可能是两种情况,如下图所示 A 或者 AB B甚至给出它的后序遍历也不可以,如果得知两种遍历顺序希望获得唯一的二叉树,至原创 2016-11-20 13:26:36 · 27210 阅读 · 13 评论 -
三维形体的数据结构(1)半边数据结构
这其实是我学习图形学以来第一次真正接触数据结构的一篇博客,除了之前用markdown写的那篇文章,那个就是入个小门。为什么我开始接触数据机构,因为在我做第一次细分的时候就遇到了麻烦,比如DOO-SABIN细分,在每次细分的时候都需要知道这个点在哪个面上,这个点周围是哪几条边,如果按照点表边表面表,只能是按照顺序判断,这条边到了第几的位置,那么它就应该是那个点挨着的边。。这么搞显然。。后来我原创 2016-05-13 20:07:16 · 10881 阅读 · 7 评论 -
关于数据结构的内存分配问题
博主开始用的是实验室的电脑VS2013#include #include #include #include //static const GLfloat vertex_list[][3] = { // -0.5f, -0.5f, -0.5f, // 0.5f, -0.5f, -0.5f, // 0.5f,原创 2016-05-16 20:59:46 · 1264 阅读 · 0 评论 -
边界表示的数据结构
转自:http://netclass.csu.edu.cn/NCourse/hep089/Chapter3/CG_Txt_3_039.htm在实体造型技术的研究中,有不少边界表示的数据结构相继提出,比较著名的有半边数据结构、翼边数据结构、辐射边数据结构等。 其中翼边数据结构是在1972年,由美国斯坦福大学Baumgart作为多面体的表示模式而被提出来的,它是基于边表示的数转载 2016-05-30 17:57:58 · 6992 阅读 · 0 评论 -
单向链表的操作
上一篇博客解决了链表的建立和打印的问题,现在来解决单向链表里的其他操作原创 2016-10-31 18:47:57 · 480 阅读 · 0 评论 -
队列的链式建立和操作
之前完成了堆栈的建立和操作,现在开始实现队列队列是:具有一定操作约束的线性表其插入和删除操作:只能在一端插入,而在另一端删除数据插入:入队列数据删除:出队列先来先服务先进先出:FIFO(First In First Out)类型名称:队列(Queue)数据对象集:一个有0个或者多个元素的有穷线性表操作集,队列Q∈Queue,元素item∈ElementType原创 2016-11-03 21:52:56 · 6104 阅读 · 0 评论 -
堆栈的链式建立和操作
什么是栈结构(Stack)栈结构是从数据的运算来分类的,也就是说栈结构具有特殊的运算规则,即:后进先出。我们可以把栈理解成一个大仓库,放在仓库门口(栈顶)的货物会优先被取出,然后再取出里面的货物。而从数据的逻辑结构来看,栈结构起始就是一种线性结构。如果从数据的存储结构来进一步划分,栈结构包括两类:顺序栈结构:即使用一组地址连续的内存单元依次保存栈原创 2016-11-01 10:50:50 · 2442 阅读 · 0 评论 -
用单向链表计算多项式的加法
如果用数列表示多项式,可能会造成很大的空间浪费,我们这里利用单向链表表示多项式,并进行加法运算,其中多项式采用不带头结点的单向链表,按照指数递减的顺序排列各项原创 2016-11-06 21:47:27 · 1746 阅读 · 0 评论 -
利用单向链表计算多项式的乘法
这里继承了上一篇文章的计算多项式的加法,而又变化了输入格式和加入了计算多项式的乘法输入的格式为首先输入由几项组成,之后是每一项的系数和指数在读入的格式上需要修改一下上面一篇文章的格式如果没有刚开始那个临时的节点,那么在attach的时候就需要判断当前节点是否为空,如果为空,需要将P重新malloc并且插入节点,last值由指向NULL改为指向新加入的节点,如果last值不为NU原创 2016-11-07 21:26:31 · 982 阅读 · 0 评论 -
静态有序数组的查找两种方法
首先把需要查找的集合放到一个数组里。然后针对指定的元素在数组里进行查找,下面主要介绍两种方法1.顺序查找我们把需要存储的数据记录在如图所示的结构里用一个结构指向一个数组,其中结构的第一项指向数组,第二项记录数组中数据的个数原创 2016-11-10 11:11:40 · 824 阅读 · 0 评论 -
单向链表的建立(C语言)
貌似有段时间没有做原创文章了,聒噪的很,开始正式学习数据结构啦哈哈,今天先做单向链表的建立,希望和大家一起分享数组作为存放同类数据的集合,给我们在程序设计时带来很多的方便,增加了灵活性。但数组也同样存在一些弊病。如数组的大小在定义时要事先规定,不能在程序中进行调整,这样一来,在程序设计中针对不同问题有时需要30个大小的数组,有时需要50个数组的大小,难于统一。我们只能够根据可能的最大需求来原创 2016-10-31 11:10:53 · 2329 阅读 · 1 评论 -
单链表——单链表的逆转
最早据说是微软的一道题目,就是给出一个单链表和一个整数K,按照每K个个顺序进行逆转废话不多说,看函数代码//单链表的逆转,每k个逆转一下子PtrToNode Reverse(PtrToNode h,int K){ int cnt=0; int len=length(h); PtrToNode newNode; PtrToNode oldNode; int i; PtrToN原创 2016-11-28 19:17:55 · 1036 阅读 · 0 评论 -
堆的建立和操作
首先引进一个概念:优先队列(Priority Queue):特殊的“队列”,取出元素的顺序是依照元素的优先权(关键字)大小,而不是元素进入队列的先后顺序。可以考虑利用一般的数组、链表,有序数组、链表或者是二叉搜索树、AVL树等进行实现但是都会出现各种各样的问题,以下是对复杂度的分析如果用搜索二叉树,则很可能总是从一边删除,过若干次树就会变得很不均匀原创 2016-11-28 21:30:54 · 2052 阅读 · 0 评论 -
二叉树的链表建立和遍历
一般的树可以通过“父子-堂兄弟”关系转变为二叉树,如下图所示然后再旋转45度即可变为二叉树(真的好聪明2333)下面看一下二叉树的名片类型名称:二叉树数据对象集:一个有穷的结点集合若不为空,则由根节点和其左、右二叉子树组成操作集:BT∈BinTree,Item∈ElementType,重要操作有:1、Boolean IsEmpty(Bin原创 2016-11-17 21:12:56 · 11471 阅读 · 7 评论 -
半边数据结构(The_Half-Edge_Data_Structure)
翻译文章来自:http://www.flipcode.com/archives/The_Half-Edge_Data_Structure.shtml表示多边形网格(polygon mesh)的一个常用方式就是使用共享的顶点列表和面的列表(里面包含面所含的顶点)。这样的表示方法在许多情况下都非常方便和高效,但是在某些特定的领域,反而会效率比较低。举例来说,网格简化(mesh simplifi翻译 2016-05-28 13:06:40 · 22274 阅读 · 1 评论