![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
angry_youth
一名正在努力学习计算机类科学的小白,目前本职工作是一名unity3D游戏前端开发工程师,在技术的道路上,我会一直坚守本心,不断学习专研领域知识,向着自己所期待的方向勇往直前,做出更多更好玩的游戏!
展开
-
最短路径之Dijkstra算法--简单易懂
最短路径:任意A点到B点所经历的最短距离。主要算法有:Dijkstra算法(迪杰斯特拉算法),Floyd算法(弗洛伊德算法),A*算法等。今天开始逐步介绍下他们的算法思想核心:1.Dijkstra算法(迪杰斯特拉算法)这个算法的思想我觉得和Prim算法相似,但是Prim算法是求最小生成树,求的一个图中连接所有点的最小权值,但是Dijkstra算法是求的图中任意两点的最短路径,所以二者在保存最小权值数据的方式不同,Prim主要获取的是邻接点的最小权值(两点必须是相邻的),Dijkstra获取的是点到原创 2020-05-30 12:54:03 · 538 阅读 · 1 评论 -
最小生成树图之-Prim算法和Kruskal算法
最小生成树算法:结合上一章学习了解了图的基本概念,接下来了解一下最小生成树的两种算法。Prim算法(普里姆算法):思想:找到所有最短的权值连接的顶点集合,所组成的树是最小生成树。从某一顶点为起点,逐步找各个顶点上的最小权值的边来构建最小生成树。首先,从根节点A开始,我们发现A到对所有顶点的权值信息如下:找到最小权值,权值必须有意义,我们这里的有意义暂定为:权值要大于0,且不能为无穷大。找到第一个最近的顶点B后,同时更新A点到各个顶点的距离,此时B点已经访问过了,我们需要标识它防止下一次它再原创 2020-05-25 01:51:45 · 1430 阅读 · 0 评论 -
数据结构--图
图的定义:图是有顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E),其中G表示一个图,V是图中顶点的集合,E是图中边的集合。图的分类:无向图:任意两个顶点之间的边都是无向边,组成的图叫无向图。无向边:顶点到顶点之间的边没有方向,则称这条边为无向边。有向图:任意两个顶点之间的边是有向边,组成的图叫有向图。有向边:顶点到顶点之间的边有方向,则称这条边为有向边。无向完全图:在无向图中,如果任意两个顶点之间都存在边,则称改图为无向完全图。含有N个顶点的无向完全图,肯定有(N*(N -原创 2020-05-20 23:14:16 · 358 阅读 · 0 评论 -
对队列的简单介绍
1.队列原创 2020-05-17 00:19:53 · 355 阅读 · 0 评论 -
栈的分析和详解
栈原创 2020-05-13 01:21:14 · 710 阅读 · 0 评论 -
搜索二叉树
概念:搜索二叉树是一种特殊有序的二叉树,如果一棵树不为空,并且如果它的根节点左子树不为空,那么它左子树上面的所有节点的值都小于它的根节点的值,如果它的右子树不为空,那么它右子树任意节点的值都大于他的根节点的值,它的左右子树也是二叉搜索树。由此可见,如果对二叉搜索树进行中序排列(左中右),那么会得到一个从小到大的序列。上图中序排列(左中右)后的顺序应该是:5,6,8,9,10,15,16,1...原创 2020-05-05 00:24:00 · 4327 阅读 · 0 评论 -
搜索二叉树---之狸猫换太子的删除方法
搜索二叉树:性质: 1) 每个节点都有一个作为搜索依据的关键码(Key),所有节点的关键码都不同; 2) 左子树上所有节点的关键码(Key)都小于根节点的关键码(Key); 3) 右子树上所有节点的关键码(Key)都大于根节点的关键码(Key); 4) 左右子树都是二叉搜索树; 特点:搜索二叉树进行中序遍历(左根右)的时候是一组升序的数列;应用: 字典;公司发水果给员工等问题;代原创 2017-07-29 13:41:12 · 322 阅读 · 0 评论 -
Huffman树---之文件压缩项目
HuffmanTree哈夫曼树:又称最优二叉树,是加权路径长度最短的二叉树; 如何建树,思想如下:以此类推最终将其构建成以下的样子:代码如下:#include"heap_review.h"//自己实现的堆模板类,见上篇堆文章#include<queue>template <class T>struct HuffmanTreeNode{ T _data; HuffmanTre原创 2017-07-29 01:43:51 · 347 阅读 · 0 评论 -
图--最小生成树之解
**Graph:** (应用:地图,社交关系等) 图是一种非线性结构,由顶点集合以及顶点间的关系集合组成的一种数据结构; 1) 完全图:如果一个N个顶点组成的无向图中有N*(N-1)/2条边,则为无向完全图(即任意两个顶点间都有边相连) 2) 权重:边具有与之相关的数值,则称为权重; 3) 临接顶点:if(u,v)是图中的一条边,则u和v互为临接顶点; 4) 度:与顶点相关联的边原创 2017-08-13 18:34:10 · 350 阅读 · 0 评论 -
排序算法汇总
排序:以下排序都是按从小到大的顺序编写的;1)直接插入排序: 时间复杂度O(n*n)//从小到大//直接插入排序:取出一个比,比完再插入void InsertSort(int* arr, size_t n){ assert(arr); for(size_t i = 0 ; i < n-1; i++) { int temp = arr[i+1];原创 2017-08-13 00:43:12 · 346 阅读 · 0 评论 -
堆
堆:堆数据结构是一种数组对象,它可以被视为一颗完全二叉树结构; 堆排序————————————————–》选择排序 堆结构的二叉存储: 最大堆:所有的父节点都比左右孩子大; 最小堆:所有的父节点都比左右孩子小;向上调整:不用关心父节点比当前子节点小的问题;(适用于已经把堆建好,插入新节点时调整使用) 向下调整:需要关心父节点比当前子节点小的问题;(使用于任何情况,可以用来创建大堆、小堆,或原创 2017-07-26 22:16:15 · 241 阅读 · 0 评论 -
模拟实现vector容器
vector:模型结构:以上表示3个指针,分别指向不同的位置; Vector的缺陷:前期增长代价太大,以1/2的模式开增,eg:1,2,3,4,6,6,9,9,9。。。 改进方法:使用reverse(x)直接开辟一个较大空间即可;Vector中两种增容方式: ① resize(x,y) //会改变size()大小,会让容量变大或者不变 分三种情况: a.X > capacity :增容原创 2017-07-21 21:09:19 · 291 阅读 · 0 评论 -
栈和递归---解决迷宫问题
迷宫问题:走过的路设置为2,未走过的路设置0,墙设置为1;- 解决方法一:栈stack将每次你所走过的路都push进入栈里面,栈顶元素的坐标就是你所在的位置,取出你所在的位置然后判断当前位置上下左右四个方向是否有通路,如果没有就pop()顶层元素,然后再取出顶层元素(即退一步),然后接着判断其他方向是否有通路,直到你走出边界或者栈为空的时候退出; 缺陷:只找到一条路径就退出,无法判断最短路原创 2017-07-22 12:57:47 · 579 阅读 · 0 评论 -
剖析容器List
List零个或者多个数据元素的有限序列;A. 是一个序列:元素之间有顺序,每一个元素都有前驱和后继;(这里的链表是一个带头节点的双向循环链表)B. 有限的; 综上所述:ListNode的模型如下:迭代器:一种遍历容器的方式,只作遍历,修改的作用,不析构节点;分为:普通迭代器(可读可改),const迭代器(可读不可改),反向迭代器(反向遍历);模拟实现正向迭代器基本功能,代码如下:templ原创 2017-07-19 13:11:01 · 197 阅读 · 0 评论 -
探索红黑树中的秘密
**红黑树:** 二叉搜索树,它在每个节点中增加了一个颜色位,通过对任何一条从根到叶子节点的简单路径上的颜色来约束,红黑树保证最长路径不超过最短路径的两倍,因而近似于平衡;(不是绝对的平衡)性质: ①每个节点不是红色就是黑色的; ②根节点是黑色的; ③如果一个结点是红色的,则它左右两个子节点是黑色的(没有连续的红色结点); ④对于每个节点,从该节点到其后所有后代结点的简单路径上,均包含相同原创 2017-08-09 00:25:50 · 272 阅读 · 0 评论 -
HashTable,位图,BloomFilter分析(简单粗暴)
**HashTable:(散列表/哈希表)** 是根据关键字key而直接访问在内存存储位置的数据结构;它通过一个关键值的函数将所需的数据映射到表中的位置来访问数据,这个映射函数叫做散列函数,存放记录的数组叫做散列表; 构造哈希表的几种方法: 1)直接定址法:取关键字的某个线性函数为散列地址;(但数值之间相差较大,该方法不可用) 2)除留余数法:取关键值被某个不大于散列表长m的数p除后的所得的原创 2017-08-09 00:46:15 · 679 阅读 · 0 评论 -
二叉树
二叉树:是由N个结点组成的有限集合,该集合可为空(空二叉树),或者由一个根节点和两个互不相交的子节点组成。 二叉树的特点: 1) 最多有两棵子树,所以二叉树中不存在度大于2的结点; 2) 左子树和右子树是有序的,不可随意改变; 3) 五种基本形态: A. 空二叉树; B. 只有一个根节点的二叉树; C. 根节点只有左子树; D. 根节点只有右子树; E. 根节点既有原创 2017-07-24 20:16:18 · 313 阅读 · 0 评论 -
磁盘查找树------B,B+,B*树集合
**B-树:**常用于文件系统,数据库 外查找,是一种平衡的多叉树;(或者是空树) 性质: ① 根节点至少有两个孩子; ② 每个非根节点有[M/2,M]个孩子; ③ 每个非根节点有[M/2-1,M-1]个关键字,并且以升序排列; ④ Key[i]和key[i+1]之间的孩子节点的值介于key[i],key[i+1]之间; ⑤ 所有的叶子节点都在同一层; 图例如下:M = 3插入75时原创 2017-08-10 03:02:30 · 318 阅读 · 0 评论 -
线索化二叉树
**线索化:**能够对这颗树进行非递归遍历;能够给这棵树加上迭代器;线索化避免了这棵树遍历时的递归回旋问题,使用一个循环一口气就可以将这棵树访问完毕,可以这么理解,树的本身访问到了叶子节点就出现了断点问题,就要开始递归回旋判断,然而我们使用了线索化以后就相当于将断点问题解决,这就是一条可以直达终点的通路。 可以用两句话概括: A. 如果当前节点没有左孩子,就让左孩子指向父亲,同时让其节点类型变原创 2017-07-26 01:33:01 · 675 阅读 · 0 评论 -
AVL树---升级版的二叉搜索树
AVL树:是一棵高度平衡的二叉搜索树;(搜索树+平衡因子 ) 性质: 1)左子树和右子树的高度之差的绝对值不超过1; 2)树中的每个左子树和右子树都是AVL树; 3)每个节点都有一个平衡因子,任一节点的平衡因子是-1,0,1;(每个节点的平衡因子=右子树高度-左子树高度) 时间复杂度是:log以2为底N的对数节点类型: 平衡因子发生改变的三种情况:(分别举一个例子来分析) ① 插入结点原创 2017-07-30 16:26:04 · 366 阅读 · 0 评论