数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。
红黑树是一棵二叉搜索树,它在每个节点上增加了一个存储位来表示节点的颜色,可以是红色也可以是黑色。通过对任何一条从根到叶子简单路径上的颜色来约束,红黑树保证最长路径不超过最短路径的两倍,因而近似于平衡。 红黑树满足下面的性质 1 .   每个节点,不是红色就是黑色的 2 .   根节点是黑色的 3 .   如果一个节点是红色的,则它的两个子节点是黑色的 4 .   对每个节点,从该节点到其所有后代叶
哈希表(散列表),是通过关键字key而直接访问在内存存储位置的一种数据结构,它就是 以空间换取时间。通过多开辟几个空间,来实现查找的高效率。 对于哈希表,我们并不是很陌生:在c语言学习阶段,给定一个字符串,查找第一个只出现过一次的字符;在数据结构 矩阵的高效转置方法中,计算原矩阵中每一列中有效数字的个数;在文件压缩项目(之后给出分析总结)中,计算中文件中各个字符出现的次数。 对于构造哈希表,有以下
位图 来自于《编程珠玑》。所谓的Bit-map就是用一个bit位来标记某个元素对应的Value, 而Key即是该元素。由于采用了Bit为单位来存储数据,因此在存储空间方面,可以大大节省。 如果说了这么多还没明白什么是Bit-map,那么我们来看一个具体的例子,假设我们要对0-7内的5个元素(4,7,2,5,3)排序(这里假设这些元素没有重复)。那么我们就可以采用Bit-map的方法来达到排序的目的
1.布隆过滤器的引入: 我们知道,在海量整形数中查找一个数字是采用位图来完成的;如果要在海量的字符串中查找一个字符串是否在其中,位图就是无法解决的,所以引入了布隆过滤器。 2.布隆过滤器的概述: 布隆过滤器是由布隆这个人提出的,它是由一系列的二进制向量和一些映射函数来实现的,它主要用于检索一个字符串是否在一个集合中,并且空间效率和查询时间都是远远超过一般的算法,还可以表示全集,其他数据结构并不能~
    平衡二叉树,是一种二叉排序树,其中每个结点的左子树和右子树的高度差至多等于1。它是一种高度平衡的二叉排序树。高度平衡?意思是说,要么它是一棵空树,要么它的左子树和右子树都是平衡二叉树,且左子树和右子树的深度之差的绝对值不超过1。     将二叉树上结点的左子树深度减去右子树深度的值称为平衡因子BF,那么平衡二叉树上的所有结点的平衡因子只可能是-1、0和1。只要二叉树上有一个结点的平衡因子的
树的一些概念 (1)树是n(n>=0)个有限数据的元素集合,形状倒过来像一颗树。 (2)节点:节点包含数据和指向孩子节点的指针 (3)叶子节点:没有孩子的节点,也就是度为0的 (4)节点的度:表示的是孩子节点的个数 (5)父子节点:一个节点father指向另一个节点child,那么child节点为孩子节点,father为父亲节点 (6)兄弟节点:拥有相同父亲的节点 (7)根节点:所有孩子的祖先,也
概念及其性质 二叉搜索树,又名二叉排序树,二叉查找树 二叉搜索树有一下特点: (1)若左子树不为空,则左子树的所有节点均小于根节点 (2)若右子树不为空,则右子树的所有节点均大于根节点 (3)左右子树也是二叉搜索树 (4)每棵树都有自己的key值,而且不能重复 如何定义二叉搜索树 //二叉搜索树的节点,Key-Value结构 template<typename K,typename V> stru
线性表(Linear List) 基本概念 线性表是由n(n>=0)个类型相同数据元素组成的有限序列。数据元素可由若干个数据对象组成,且一个线性表中的数据元素必须属于同一数据对象。 线性表示n个类型相同数据元素的有限序列,对n>0,除第一个元素无直接前驱,最后一个元素无直接后继外,其余的每个数据元素只有一个直接前驱和直接后继。 线性表的逻辑结构如图: 线性表具有如下特点: 同一性:线性表由同类数据
线性表(Linear List) 基本概念 线性表是由n(n>=0)个类型相同数据元素组成的有限序列。数据元素可由若干个数据对象组成,且一个线性表中的数据元素必须属于同一数据对象。 线性表示n个类型相同数据元素的有限序列,对n>0,除第一个元素无直接前驱,最后一个元素无直接后继外,其余的每个数据元素只有一个直接前驱和直接后继。 线性表的逻辑结构如图: 线性表具有如下特点: 同一性:线性表由同类数据
本篇博文旨在介绍数据结构中的图;介绍了图以及图的有关概念;介绍了图的两种实现方式,并用代码进行了实现;介绍并实现了图的广度优先遍历和深度优先遍历; 图 图是数据结构中的一种非线性结构,由顶点以及顶点相连的边构成 图包括有向图和无向图 无向图中,当两个顶点存在连接关系时,不区分该连接是A到B点,还是B到A点 有向图中,两个顶点存在连接关系时,要区分是A可以到B,还是B可以到A 图的基本概念 完全图
【1】定义 图(Graph)是一种非线性数据结构 任意的两个元素都可能相关,即图中任一元素可以有若干个直接前驱和直接后继,属于网状结构类型。 树是图的特例——有向无环图 【2】有向图(Digraph) 设 Vi、Vj为图中的两个顶点,若关系< Vi,Vj >存在方向性,称之为有向图,记作< Vi,Vj > ,Vi为弧尾,Vj为弧头 【3】无向图(Undigraph) 设Vi、Vj为图中的两个顶点
第一章:绪论 1.1 数据结构的基本概念 数据:是信息的载体,是描述客观事物属性的数、字符以及所有能输入到计算机中并被计算机程序识别和处理的符号的集合。 数据元素:是数据的基本单位,一个数据元素可由若干个数据项组成,数据项是构成数据元素的不可分割的最小单位。 数据对象:是具有相同性质的数据元素的集合,是数据的一个子集。 数据类型:是一个值的集合和定义在此集合上的一组操作的总称。 1) 原子类型:其
考场的时候想到的n*m做法tle了,正解是O(n+m) 首先想到一个性质是不管a[i],a[j]相差多少,只要a[i],a[j]同余,那想让他们increase后%m得到另一个余数,那他们需要increse的次数是相等的。 所以我们想到把n个数按%m从0到m-1分成m类。这样就能贪心了,因为如果%m为0这样的数大于n/m个,那这样说明这里面的v.size()-n/m个数至少要加1,我们把这些多出来
喜欢的话可以扫码关注我们的公众号哦,更多精彩尽在微信公众号【程序猿声】 01 预备知识 1.0 什么是线性表? 线性表(List)是零个或者多个数据元素的有限序列. 首先它是一个序列.里面的元素是有顺序的,如果有多个元素,除开头和结尾以外的元素都有一个前驱和一个后继.而开头元素只有后继,结尾元素只有前驱. 其次线性表是有限的,也就是里面的元素个数是有限的。 1.1 线性表的基本操作(描述) 1A
喜欢的话可以扫码关注我们的公众号哦,更多精彩尽在微信公众号【程序猿声】 01 单链表(Singly Linked List ) 1.1 什么是单链表? 单链表是一种链式存储的结构。它动态的为节点分配存储单元。当有节点插入时,系统动态的为结点分配空间。在结点删除时,应该及时释放相应的存储单元,以防止内存泄露。由于是链式存储,所以操作单链表时,必须知道头结点或者头指针的位置。并且,在查找第i个节点时,
要求: 输入一个链表 将其倒序;   void Linklist_reverse(LinkList *L){ LinkList p = (*L)->next; LinkList q; LinkList r=NULL; while (p) { q = p->next; p->next = r; r = p;
目录 4.1 树的基本概念 4.1.1 树的定义 4.1.2 基本术语 4.1.3 树的性质 4.2 二叉树的概念 4.2.1 二叉树的定义及其主要特性 (1)二叉树的定义 (2)几个特殊的二叉树 (3)二叉树的性质 4.2.2 二叉树的存储结构 (1)顺序存储结构 (2)链式存储结构 4.3 二叉树的遍历和线索二叉树 4.3.1 二叉树的遍历 (1)先序遍历(PreOrder) (2)中序遍历(
1 #include<stdio.h> 2 #include<stdlib.h> 3 4 typedef struct LinkList { 5 int data; 6 LinkList *next; 7 8 }LinkList , *linklist; 9 //创建头结点 10 int CreateList(linklist &L) {
问题描述 给定一张迷宫地图和一个迷宫入口,然后进入迷宫探索找到一个出口。如下图所示: 该图是一个矩形区域,有一个入口和出口。迷宫内部包含不能穿越的墙壁或者障碍物。这些障碍物沿着行和列放置,与迷宫的边界平行。迷宫的入口在左上角,出口在右下角。 问题分析 首先要有一张迷宫地图,地图由两部分组成: (1)一是迷宫中各处的位置坐标, (2)二是迷宫各位置处的状态信息,即该处是墙还是路 所以,该迷宫地图可由
其实这个还是有点问题的,在偶见情况下会打印出0*x,目前无解唔。。。 原理就是借用线性表,然后做运算直接先插入到后面。 然后遍历一下,只要指数相同就合并在前面一个里面,后面的归0(不删除)。 打印的时候加一个判断是否为0的条件就行了。 下面是源码: #include<iostream> #include<cstring> using namespace std; struct Node {
这里放出两种不同的代码,一个是老师给的(较为复杂),还有一个是自己写的。 自己写的: #include<iostream> using namespace std; struct Node { int data; //数据单元 Node *link; //指向下一个结点 }; class Josephus { private: N
树状数组 ta的本质是利用二进制的性质维护一组数据 最常用的操作就是求前缀和 int lowbit(int x){ return x&(-x); /*通过补码,清空高位1,只留下最后一个1*/ }   void add(int x,int val){ while(x<=n){ c[x]+=val; x+=lowbit(x); }
类的结构如下: class StaticSearchTable { private: int *data; int data_number; bool search_seq(int loc,int key); void select_sort(); bool flag;//区分是否为顺序表 public: StaticSearchTable
普通莫队 简介 莫队是一种基于分块思想的离线算法,用于解决区间问题,适用范围如下: 只有询问没有修改。 允许离线。 在已知询问\([l,r]\)答案的情况下可以\(O(1)\)得到\([l,r?1],[l,r+1],[l?1,r],[l+1,r]\)的答案。 满足以上三个条件就可以在\(O(n\sqrt{m}+mlogm)\)的时间复杂度下得到每个询问的解。 算法思想 莫队的精髓就在于通过对询问进
树状数组的问题模型: 现在有一个这样的问题: 有一个数组\(a\),下标从\(0\)到\(n-1\),现在你要进行\(w\)次修改,\(q\)次查询。 修改是修改数组中某一个元素的值; 查询是查询数组中任意一个区间的和,\(w+q<500000\)。 这个问题很普遍,首先分析下朴素做法的时间复杂度, 修改是\(O(1)\)的时间复杂度, 而查询就要\(O(n^2)\)的复杂度,总体时间复杂度为\(
线段树原理 线段树,类似区间树,它在各个节点保存一条线段(数组中的一段子数组),主要用于高效解决连续区间的动态查询问题,由于二叉结构的特性,它基本能保持每个操作的复杂度为\(O(logn)\)。 线段树的每个节点表示一个区间,子节点则分别表示父节点的左右半区间,例如父亲的区间是\([a,b]\),那么\((c=(a+b)/2)\)左儿子的区间是\([a,c]\),右儿子的区间是\([c+1,b]\
Description 给定 \(n\) 个商店,他们围成一个圆圈,按照顺时针从 \(1\) 到 \(n\) 编号。你有 \(T\) 元钱,从 \(1\) 号点开始按照顺时针方向走,每到一个商店,只要钱够就必须买这个商店的物品。商店中物品是无限的,即多次到达可能多次购买。求会买多少件物品 Input 第一行是一个整数 \(n\) 下面一行 \(n\) 个整数 \(a_i\),代表每个商店物品的价格
  上一期说完了什么是最小生成树,这一期咱们来介绍求最小生成树的算法:kruskal算法,适用于稀疏图,也就是同样个数的节点,边越少就越快,到了数据结构与算法这个阶段了,做题靠的就是速度快,时间复杂度小。   网上一搜就知道大家都会先介绍prim算法,而我为什么不介绍prim算法呢?因为小编认为这个算法理解快,也很容易明白,可以先做个铺垫(小编绝不会告诉你小编是因为不会才不说的),kruskal算
  在这一专辑(最小生成树)中的上一期讲到了prim算法,但是prim算法比较难懂,为了避免看不懂,就先用kruskal算法写题吧,下面将会将三道例题,加一道变形,以及一道大水题,水到不用高级数据结构,建树,画图,最短路径什么的,统统不需要。废话不多说,直接看题: 例题精讲 T1: 1348:【例4-9】城市公交网建设问题 时间限制: 1000 ms         内存限制: 65536 KB
data 数据data element 数据元素data item 数据项data object 数据对象data structure 数据结构ADT (Abstruct Date Type) 抽象数据类型alogrithm 算法correctness 正确性readability 可读性robustness 健壮性frequency count 频度asymptotic time complex