
数据结构
Cry .
当你的能力配得上你的野心、梦想的时候,运气自然就会来了。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
数据结构之线段树
#include<iostream>#include<vector>const int MAXSIZE = 20;void build_tree(std::vector<int>& arr, std::vector<int> &tree, int root_node, int start, int end) { if (st...原创 2020-03-19 13:26:06 · 231 阅读 · 0 评论 -
数据结构之跳跃表
在以往的动态平衡数据结构中,我们学习过AVL tree, RB tree等等。二者的对元素的插入,删除,访问的时间复杂度都为对数时间。但是二者相对比较复杂,构建也比较麻烦(尤其是RB树,太难了~~)。有没有也存在一种动态平衡的数据结构,对元素的插入,删除和访问操作为对数时间尼?当然有! 那就是跳跃表。我们都知道链表的插入或者删除操作的时间复杂度为常数时间,但是其索引元素的时间复杂度便为线性时间...原创 2020-03-05 22:34:08 · 504 阅读 · 0 评论 -
数据结构之二叉平衡树
AVL树是平衡的二叉查找树。也是高度平衡的二叉查找树。每个节点的左子树的高度与右子树的高度的差的绝对值小于等于1.AVL树的基本操作包括:首先包括旋转操作:左旋(逆时针),右旋(顺时针),左—右旋转(先左旋,后右旋),右—左旋转(先右旋,后左旋)。右旋void RotaeRR(AvlTree* &avl) { if (!avl) return; else { ...原创 2019-09-22 10:19:34 · 243 阅读 · 0 评论 -
Find—Union(并查集)
有时候我们想要查询两个元素是否在同一个集合中或者想要合并两个集合,怎么办呢?有人会说:“用二叉树,AVL树,链表,布隆过滤器也许啊”等等。但是“杀鸡怎么可以用牛刀呢?更何况,效率可能还不高”那怎么解决呢? 用并查集可以完美的解决这个问题哦~~并查集是一个树状结构(对集合进行抽象的描述),用于处理一些不相交的集合(Disjoint Sets)的合并及查询问题。既然是树状结构,那每个节点肯定有其p...原创 2019-12-24 17:33:39 · 548 阅读 · 1 评论 -
C++之广度优先搜索(BFS)
对树的遍历中,我们学过前序遍历,中序遍历,后序遍历。图是一种特殊的树,因此图的遍历就是由树的遍历而演变过来的。图有两中遍历的算法:广度优先搜索(BFS) 深度优先搜索(DFS)。今天我们先来学习一下广度优先搜索吧。学习深度优先搜索,请参考我的另一篇博客。广度优先算法的思想:给定源顶点s,然后搜索与s所邻接的顶点,然后再搜索s邻接顶点的邻接顶点,以次下去,直到搜索到所有的顶点。该思想就是树的层序...原创 2019-11-19 16:54:50 · 1187 阅读 · 0 评论 -
C++之拓扑排序
拓扑排序是图论中的一种常见排序的算法(当且仅当为有向图成立)。图论中顶点与顶点存在依赖关系,比如A—>B,解释为A与B存在依赖关系,A在B之前先发生。有时候我们想了解图中各顶点的发生顺序,拓扑排序便解决了此问题。拓扑排序的思想:我们检查所有顶点的入度,当该顶点的入度为0时,便将其压入队列中(为什么要用队列呢?因为队列具有先进先出的思想啊~),当队列不为空时,便删除其首元素,然后降低与其...原创 2019-11-17 19:02:50 · 852 阅读 · 0 评论 -
C++之快速排序
快速排序顾名思义是目前实践中最快的排序算法。如归并排序算法一样,快速排序算法也使用了分治的递归思想。快速排序的思想:选取枢纽元,同过枢纽元对数据进行分割,左边的数据小于枢纽元,右边的数据大于枢纽元。然后利用分治递归的思想,对左右数据进行分割,最后进行合并。枢纽元的选取对快速排序非常重要!!怎么选取枢纽元呢?有的人会说选第一个或者最后一个数据。可以这样选择。但是如果出现第一个数据或者最后一个数据...原创 2019-11-10 20:10:07 · 240 阅读 · 0 评论 -
HashTable C++ 实现之开放定址法
解决HashTable的冲突的第二种方法叫做开放定址法。开放定址法不需要使用指针,不需要特意的动态分配空间。当发生冲突时此算法会选择其他的空的单元。因此核心问题来了,怎么有效的选择空的单元呢?算法一:线性探测法 F(i)=i(i为寻址次数)原理:对HashTable进行插入时,出现Index相同时,我们在原始Index的基础上加F(i)。但是问题又来了,因为F(i)为线性函数,它会连续的In...原创 2019-11-04 23:44:06 · 509 阅读 · 0 评论 -
HashTable C++实现之分离链接法
HashTable是以常数时间进行进行插入,删除和查找的数据结构。其查找原理是:通过哈希函数Hash(),进行哈希得到value,value为哈希表的下表。怎么能得到均衡的value呢?Hash()(哈希一般是通过字符串映射到键值)Index HashTable::Hash_one(const ElemType& key, const size_t tablesize)cons...原创 2019-11-03 18:48:57 · 302 阅读 · 0 评论 -
C++ 优先队列的实现(大堆)
优先队列是一种支持插入新元素和删除最大元素的数据结构。它和我们之前学过的队列和栈很相似,优先队列是队列和栈的拓展。而堆是支持优先队列的操作的一种数据结构。实现堆的方法有好几种,第一:我们可以使用链表,以O(1)时间插入,以O(N)时间删除。第二:使用二叉树,二叉树的所有操作需要,但是插入和删除操作却会导致二叉树严重的不平衡,那AVL树呢?插入和删除的操作需要,而且不会破坏树的平衡性,可以是可以,但...原创 2019-10-13 21:43:16 · 1479 阅读 · 0 评论 -
邻接表
邻接表(数组与链表相结合的存储方法)的结构类似于树的存储–孩子表示法。#includetypedef struct FNode{char data;struct DNodefirstedge; //firstedge指向边表的第一个节点}FNode;typedef struct DNode{int adjvex; //边表结点的内容int weight; //权DN...原创 2019-02-17 13:00:19 · 618 阅读 · 0 评论 -
深度优先搜索Or深度优先遍历详解
感觉写的很好 转载了一下深度优先搜索(DFS, Depth First Search)是一个针对图和树的遍历算法。早在19世纪就被用于解决迷宫问题。对于下面的树而言,DFS方法首先从根节点1开始,其搜索节点顺序是1,2,3,4,5,6,7,8(假定左分枝和右分枝中优先选择左分枝)。这里写图片描述DFS的实现方式相比于BFS应该说大同小异,只是把queue换成了stack而已,stack...转载 2019-02-18 10:46:30 · 478 阅读 · 0 评论 -
深度优先遍历(邻接矩阵)
DFS(深度优先遍历算法)实质是:运用的栈是思想(先进后出),未访问的进栈,访问的顶点如果周边没有可访问的顶点便出栈;#includeconst int Maxsize = 100;bool visted[Maxsize]; //访问标志的数组(判断是否访问)class MGraph{public:MGraph();~MGraph();MGraph(const size_t&a...原创 2019-02-18 19:15:32 · 4037 阅读 · 0 评论 -
深度优化遍历(邻接表)
**当图稀疏时用邻接表创建图更加高效**#includeconst int Maxsize = 100;bool visted[Maxsize];typedef struct FNode{int data;struct DNodefirstedge;}FNode;typedef struct DNode{int adjvex;int weight;DNodenext;}D...原创 2019-02-18 20:41:59 · 325 阅读 · 0 评论 -
双端队列的实现
双端队列是由一些表组成的数据结构,具体简单实现代码如下(不是c++STL里面的哦~)1.Push(X):将项X插入双端队列的前端。2.Pop ( ):从双端队列中删除前端项并将其返回。3.Inject (X) :将项X插入到双端队列的尾端。4.Eject():从双端队列中删除尾端项并将其返回。5.Empty () :双端队列是否为空。6.IsFull () :双端队列...原创 2019-09-03 20:03:31 · 2390 阅读 · 0 评论 -
C++ Queue 实现(数组与链表)
typedef int ElemType;const ElemType MaxSize = 100;class Queue { ElemType data[MaxSize]; int front; int rear;public: Queue(int f_r=-1):front(f_r),rear(f_r){}; ~Q...原创 2019-09-03 22:28:16 · 1432 阅读 · 0 评论 -
数据结构之二叉树查找树
树由节点和边组成。整棵树有一个最上端的节点,称为根节点(root)。每个节点可以拥有具方向性的边,用来和其他节点相连。相连节点之中,在上者称为父节点,在下者称为子节点。无子节点者称为叶节点。根节点至任何节点之间有唯一的路径,路径所经过的边数我们称作路径长度。根节点至任一节点的路径长度我们称作该节点的深度。根节点的深度永远是0。某节点至其最深的子节点的路径长度,我们称为该节点的高度。子节点如果...原创 2019-09-30 11:51:18 · 687 阅读 · 0 评论 -
C++ 伸展树的实现
首先我们应该知道什么是伸展树?伸展树是Bst(二叉查找树)的扩展版,而且伸展树不需要存储像AVL树那样的平衡因子或者高来保持平衡,那伸展树是不是会出现严重不平衡的情况呢?就行斜树,答案:不会的哦。后面大家就明白了。伸展树的功能是什么呢?当我们搜索大量数据时为了提高搜索的效率,往往搜索到的数据,下次使用的概率往往会比较大,比如我们使用的智能输入法,浏览网页等等。这里就用到了伸展树哦。告诉大家:...原创 2019-10-06 18:43:23 · 606 阅读 · 0 评论 -
邻接矩阵
邻接矩阵创建图的思想核心:邻接矩阵其处理的是顶点与顶点之间的关系(图中顶点与顶点的关系有邻接关系哦),其实质就是用一个二维数组存储权(与图或弧相关的数),其数组的下标就是顶点的下标值;#includeconst int Maxvex = 100;class MGraph{public:MGraph();~MGraph();private:char vexs[Maxvex];in...原创 2019-02-15 19:07:09 · 425 阅读 · 0 评论