数据结构
文章平均质量分 76
用C++实现数据结构
mi_rencontre
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
图的遍历、最小生成树以及单源最短路径
图的遍历主要分为两种:深度优先遍历(DFS)和广度优先遍历(BFS)DFS:深度优先遍历:和树的前序遍历相似,首先访问出发点v,并将其标记为已访问过;然后依次从v出发搜索v的每个邻接点w。若w未曾访问过,则以w为新的出发点继续进行深度优先遍历,直至图中所有和源点v有路径相通的顶点(亦称为从源点可达的顶点)均已被访问为止。若此时图中仍有未访问的顶点,则另选一个尚未访问的顶点作为新的源点重复上原创 2016-05-22 17:03:12 · 4224 阅读 · 0 评论 -
图的存储
图 : 是一种线性结构,由顶点集合(vertex)及顶点间的关系集合组成的一种数据结构。图的存储:临接矩阵:将所有的顶点的信息组织成一个顶点表,然后利用矩阵来表示各顶点之间的临接关系,称为临接矩阵。邻接表:使用数组存储顶点集合,使用链表链接边的关系。图的邻接矩阵存储实现代码:#pragma once#includetemplateclass GraphMatrix{原创 2016-05-17 10:44:35 · 1654 阅读 · 0 评论 -
并查集的实现
并查集(UnionFind):将N个不同的元素分成一组不相交的集合。 开始时,每个元素就是一个集合,然后按规律将两个集合进行合并。 应用场景:假如已知有n个人和m对好友关系(存于数组r),如果两个人是直接的或间接的好友关系(好友的好友的好友....)原创 2016-05-13 22:17:51 · 758 阅读 · 0 评论 -
布隆过滤器的简易实现
布隆过滤器(Bloom Filter): 是由布隆(Burton Howard Bloom)提出的。它实际上是由一个很长的二进制向量和一系列随机映射函数组成,布隆过滤器用于检索一个元素是否在一个集合中。底层是利用哈希表来实现的,它可以通过一个Hash函数将一个元素映射成一个位阵列(Bit Array)中的一个点。这样一来,我们只要看看这个点是不是 1 就知道可以集合中有没有它了。这就是原创 2016-05-08 16:41:22 · 3301 阅读 · 4 评论 -
B树的实现
B树:1970年,R.Bayer和E.mccreight提出了一种适合外查找的树,它是一种平衡的多叉树,称为B树。(有些地方写的是B-树,注意不要误读 成"B减树") 一棵M阶(M>2)的B树,是一棵平衡的M路平衡搜索树,可以是空树或者满足以下性质:1. 根节点至少有两个孩子 2. 每个非根节点有[ (M/2)向上取整 ,M]个孩子3. 每个非根节点有[ (M/2)向上取整 -1,M-原创 2016-05-07 11:41:35 · 2120 阅读 · 0 评论 -
红黑树的实现
红黑树:红黑树是一棵二叉搜索树,它在每个节点上增加了一个存储位来表示节点的颜色,可以是Red或Black。通过对任何一条从根到叶子简单 路径上的颜色来约束,红黑树保证最长路径不超过最短路径的两倍,因而近似于平衡。性质:1. 每个节点,不是红色就是黑色的 2. 根节点是黑色的 3. 如果一个节点是红色的,则它的两个子节点是黑色的原创 2016-04-30 10:11:55 · 586 阅读 · 0 评论 -
AVL树的实现
AVL树: AVL树又称为高度平衡的二叉搜索树,是1962年有俄罗斯的数学家G.M.Adel'son-Vel'skii和E.M.Landis提出来的。它能保持二叉树的高度 平衡,尽量降低二叉树的高度,减少树的平均搜索长度。性质:1. 左子树和右子树的高度之差的绝对值不超过1 2. 树中的每个左子树和右子树都是AVL树 3. 每个节点都有一个平原创 2016-04-29 22:54:11 · 536 阅读 · 0 评论 -
二叉搜索树的实现
二叉搜索树的性质:1.每个节点都有一个作为搜索依据的关键码(key),所有节点的关键码互不相同。2.左子树上所有节点的关键码(key)都小于根节点的关键码(key)。3.右子树上所有节点的关键码(key)都大于根节点的关键码(key)。4.左右子树都是二叉搜索树。实现代码如下:#includeusing namespace std;templatestruct BS原创 2016-04-15 15:49:54 · 429 阅读 · 0 评论 -
堆的实现
堆数据结构是一种数组对象,它可以被视为一棵完全二叉树结构。堆结构的二叉树存储是最大堆:每个父节点的都大于孩子节点。最小堆:每个父节点的都小于孩子节点。 实现代码如下:#include using namespace std;#include #includetemplatestruct原创 2016-04-13 20:10:57 · 472 阅读 · 0 评论 -
非比较排序
非比较排序有:1.计数排序(适用于要排序的数的范围不大时) ,以数组中的数据为key值,得到它们出现的次数, 然后根据它们出现的次数进行重新排列,得到它们的有序数列。相当于哈希表的直接定址法。 2.基数排序 LSD-- Least Significant Digit first原创 2016-04-10 13:50:46 · 428 阅读 · 0 评论 -
处理哈希冲突的开链法(哈希桶)
处理哈希冲突的另一种方法:开链法原创 2016-04-08 17:28:51 · 1452 阅读 · 0 评论 -
哈希表(hashtable)
HashTable: 哈希表/散列表,是根据关键字(key)直接访问数据的数据结构。它通过一个关键值的函数将所需的数据映射到表中的位置来访问数据,这个映射函数叫做散列函数,存放记录的数组叫做散列表。构造哈希表的几种方法1.直接定址法--取关键字的某个线性函数为散列地址,Hash(Key)= Key 或 Hash(Key)= A*Key + B,A、B为常数。2原创 2016-04-08 17:24:55 · 733 阅读 · 0 评论 -
比较排序算法
常用的排序算法有: 直接插入排序,希尔排序,选择排序,堆排序,冒泡排序,快速排序,归并排序等。原创 2016-04-08 12:08:09 · 493 阅读 · 0 评论 -
线索化二叉树
二叉树是一种非线性结构,遍历二叉树几乎都是通过递归或者用栈辅助实现非递归的遍历。用二叉树作为存储结构时,取到一个节点,只能获取节点的左孩子和右孩子,不能直接得到节点的任一遍历序列的前驱或者后继。为了保存这种在遍历中需要的信息,我们利用二叉树中指向左右子树的空指针来存放节点的前驱和后继信息。 #includeusing namespace std;#include原创 2016-04-03 16:59:27 · 422 阅读 · 0 评论 -
位图的实现
应用场景:给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。思路:如果内存够的话,40亿个整型使用位图存储需要500M左右的空间。#include using namespace std; #includeclass Bitmap{public: Bitmap() : _size(0) {} Bitm原创 2016-04-03 16:04:52 · 1034 阅读 · 0 评论 -
二叉树
二叉树: 二叉树是一棵特殊的树,二叉树每个节点最多有两个孩子结点,分别称为左孩子和右孩子。满二叉树: 高度为N的满二叉树有2^N - 1个节点的二叉树。完全二叉树: 若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。前序遍历(先根遍历):(1):先访问根节点;原创 2016-03-21 08:43:50 · 435 阅读 · 0 评论 -
稀疏矩阵的压缩存储与转置
稀疏矩阵:M*N的矩阵,矩阵中有效值的个数远小于无效值的个数,且这些数据的分布没有规律。原创 2016-03-22 08:36:08 · 697 阅读 · 0 评论 -
广义表
广义表是非线性的结构,是线性表的一种扩展,是有n个元素组成有限序列。广义表的定义是递归的,因为在表的描述中又得到了表,允许表中有表。#includeusing namespace std;#include enum Type{ HEAD, VALUE, SUB,};struct GeneralListNode{ Type _type; GeneralL原创 2016-03-21 09:36:03 · 421 阅读 · 0 评论
分享