数据结构
文章平均质量分 73
海绵宝宝的欧尼
要想人前显贵,必得人后受罪!
展开
-
数据结构::模拟实现动态栈
#include#includeusing namespace std;//动态栈templateclass Stack{public: Stack() //构造函数 :arr(NULL) ,_size(0) ,_capacity(0) {} Stack(const Stack& s) //拷贝构造函数 :arr(原创 2016-12-02 18:03:36 · 3750 阅读 · 0 评论 -
数据结构::关于STL中map,set,muliset,multimap要说的
前言:1、对于关联式容器,在插入和删除的时候是不需要内存拷贝可内存移动的,所有的元素都是用节点的方式进行存取,所以在这里插入和删除都是指针的移动,而不会发生内存移动,因此在进行插入操作的时候是不会发生迭代器失效的问题的。相对于vector来说,每一次删除和插入,指针都有可能失效,调用push_back在尾部插入也是如此。因为为了保证内部数据的连续存放,iterator指向的原创 2017-02-20 17:13:31 · 1205 阅读 · 0 评论 -
数据结构::浅析平衡二叉树
【为什么我们要引入平衡二叉树?】在学习完搜索二叉树后,我们知道搜索二叉树退化了之后,它的样子和单链表很像(如下图),在这种情况下,我们如果进行搜索的话,它的时间复杂度就大大降低了,此时的时间复杂度是O(N)。因此我们引入了平衡二叉树,它解决了搜索二叉树效率低的缺点【平衡二叉树(AVL树)】:1、概念:(首先它是搜索二叉树)要么是空树,要么是具有以下性质的二叉树:1)左右原创 2017-01-24 22:21:13 · 881 阅读 · 0 评论 -
数据结构::一些经典的大数据题
前言:1、说明:一般解决大数据问题有两个思路:1)先将与这道题相关的所有的数据结构进行使用一遍,如果有合适的就直接进行使用2)如果不能直接使用,一般就要进行哈希切分,然后再使用合适的数据结构进行问题的解决2、在这里我先来介绍一种常用于大数据问题的方法:哈希切分1)先估算出要切分的大小2)然后使用哈希的除留余数法进行各个数据的映射经典题:1、给原创 2017-02-22 17:41:17 · 5458 阅读 · 0 评论 -
【数据结构】---B树,B+树,B*树及Mysql的两种搜索引擎
一、B树1、B树的定义 是一种多路搜索树2、B树的性质 一颗M阶(M>2)的B树,是一颗平衡的M路平衡搜索树,可以是空树或者满足以下性质: 1)根节点至少有两个孩子 2)每个非根节点有[M/2-1,M-1]个关键字 3)每个非根节点有[M/2,M]个孩子 4)key[i],key[i+1]孩子的值介于key[i]和key[i+1]之间 5)所有的叶子节点都在同一层3、B树如何实现原创 2017-03-02 17:32:59 · 1150 阅读 · 0 评论 -
数据结构::浅析红黑树
1、概念: 红黑树是一棵二叉搜索树,它增加一个标志位来进行红黑颜色的表示。通过任何一条从根到叶子节点路径上的颜色来进行约束,红黑树保证最长路径是最短路径的两倍。2、性质: 1)每个节点不是红色的就是黑色的 2)根节点是黑色的 3)红色节点是不连续的 4)从根节点到每一条叶子节点的简单路径中,黑色节点的个数是相等的。 5)每个叶子节点是黑色的原创 2017-02-15 11:03:20 · 770 阅读 · 0 评论 -
数据结构::由一道面试题进入位图的世界
我们先来看一道腾讯的面试题:给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中原创 2017-02-23 20:04:24 · 853 阅读 · 0 评论 -
【数据结构】:哈希的扩展---布隆过滤器
什么是布隆过滤器:由来: 如果想判断一个元素是不是在一个集合里,一般想到的是将所有元素保存起来,然后通过比较确定。我们能想到的数据结构就有链表,树,哈希表等等,但是随着集合中元素不断的增加,哈希表也很难进行存储这样的数值,并且哈希有一个问题就是会出现哈希冲突,那么这个时候就很难进行元素的判断,所以这个时候我们就引入了布隆过滤器。原理: 当一个元素被加入集合时,通过 K 个 Hash 函数将这原创 2017-02-27 15:31:49 · 488 阅读 · 0 评论 -
【数据结构】:排序--插入排序
插入排序:基本思想: 可以这样理解:将无序的区间插入到有序的区间里分类: 1)直接插入排序 2)希尔排序 3)折半插入排序1、直接插入排序:基本思想: 将第i个记录插入到第i-1个序列中,将第i个数对应的关键字k与第i-1前面排好序的数进行比较,(我们这里以降序为例)如果k是比前面的数都小的,那么直接进行插入,否则在第i-1个数中进行寻找合适的位置,找到之后再进行插入。图示: 代原创 2017-02-27 17:10:39 · 388 阅读 · 0 评论 -
【数据结构】:排序--归并排序
归并排序1、思想: 归并排序是类似于快排的一种排序,采用分治的思想,将原来的序列进行划分,划分到各自的区间大小为1(注意:如果是一个奇数大小的序列,那么要将其中一个多划分一次),然后将划分的子区间进行有序合并,最终达到完全有序的序列。2、具体如何实现: 3、代码实现:#include<iostream>#include<assert.h>using namespace std; voi原创 2017-03-09 18:40:26 · 563 阅读 · 0 评论 -
【数据结构】:由小米的一道面试题入手并查集
小米的面试题1、题目: 假如已知有n个人和m对好友关系(存于数字r),如果两人是直接或间接好友(好友的好友的好友….),则认为他们属于同一个朋友圈,请写程序求出这n个人里一共有多少个朋友圈。 例如:n=5,m=3,r={{1,2},{2,3},{4,5}},表示有5个人,1和2是好友,2和3是好友,4和5是好友,则1,2,3,属于一个朋友圈,4,5属于另一个朋友圈。结果为2个朋友圈。2、怎么原创 2017-03-09 19:45:06 · 738 阅读 · 0 评论 -
【数据结构】:图
图1、定义是一种非线性结构,由顶点的集合和顶点间的关系的集合组成的一种数据结构。 Graph = (V,E); V = {x|x是顶点的集合}; E = {<x,y> |(x,y属于V)};2、图的分类有向图:顶点之间单向指引就是有向图无向图:顶点之间可以互相指引就是无向图 3、一些基本概念 1)完全图:在由n个顶点组成的无向图中,若有n(n-1)/2条边,则就是完全无向图 2)权重原创 2017-03-20 11:29:11 · 538 阅读 · 0 评论 -
【数据结构】非比较排序--计数排序和基数排序
非比较排序1、思想 不需要进行元素之间的比较,交换,在线性的时间内完成排序。2、分类 1)计数排序 2)基数排序3、优缺点 要求的空间比较多,是典型的以空间换时间的一种做法计数排序1、原理 2、代码实现#include<iostream>using namespace std; void CountSort(int* a,int n){ //1、首先确定要开一个多大的原创 2017-03-07 15:36:08 · 1142 阅读 · 0 评论 -
【数据结构】---二叉树有关的面试题
重建二叉树1、说明: 知道一棵树的前序序列和中序序列,进行重建这棵二叉树2、思路分析 A:我们知道前序的遍历顺序是:根–左–右 中序的遍历顺序是左–根–右 因此在给定的前序序列中第一个数就是根,给定的中序序列中,中间就是根,左右是它的左右子树。我来用图进行说明下: B:我们由图可以知道,经过第一轮的寻找后接下来的就利用递归就可实现了3原创 2017-04-28 22:43:36 · 424 阅读 · 0 评论 -
【数据结构】--几道栈和队列面试题
用两个栈实现一个队列1、思路分析 拿到这道题,会有以下几种思路: 思路一:入队时,将所有的元素压入到s1中出队时,将s1中的所有元素倒入到s2中,然后让s2中栈顶的元素出栈,然后将s2中所有的元素倒入到s1中问题所在:我们不难发现,在这种解法中,要进行来回倒栈,时间复杂度就会比较大,做起来也比较麻烦 思路二: 说明:是对第一种的优化我们不难发现,其实在进行倒栈的时候,没必要进行最后一个元原创 2017-05-05 01:11:30 · 1303 阅读 · 0 评论 -
【数据结构】:排序--交换排序
交换排序1、基本思想 思想的核心是“交换”,是指借助序列中元素之间的相互交换进行排序的方法。2、种类 冒泡排序快速排序冒泡排序1、基本思想 抓住两个点:趟数和次数 对于冒泡排序,一个元素要经过多少趟才能冒出头,其他的元素要经过同样的形式多少次。2、代码实现 基本实现void BubbleSort(int*a, size_t sz) { int i =原创 2017-02-28 22:48:48 · 440 阅读 · 0 评论 -
【数据结构】:排序--选择排序
选择排序1、基本思想 该方法的核心是“选择”,每次在要排序的一组数中先找出最大的(或者最小的)一个数,然后将它和序列中最后一个数(或者第一个数) 进行交换,剩下的数依次进行。2、分类 选择排序堆排序选择排序1、基本思想 这是最基本的选择排序。思想就遵循选择排序的基本思想2、代码实现(基本实现:)void SelectSort(int*a,int n){ int i原创 2017-02-28 20:31:07 · 318 阅读 · 0 评论 -
数据结构::STL库里map和set的用法简介
前言:【pair的简介】:1、它是一种模板类型的结构体,定义在头文件#includetemplate2、有两个成员是first,second3、模板参数可以是任何类型的【STL简单提要】:1、分为序列式容器和关联式容器1)序列式容器就是里面操作的数据无关联,比如:vector,它的操作push,pop2)关联式容器就是里面操作的数据有关联,比如:set,map,原创 2017-02-16 10:37:46 · 695 阅读 · 0 评论 -
数据结构::树,二叉树
【树】:1、树的相关概念:1)树是n(n>=0)个有限个数据的元素集合,形状像一颗倒过来的树。2)节点:结点包含数据和指向其它节点的指针。3)根节点:树第一个结点称为根节点。4)结点的度:结点拥有的子节点个数。5)叶节点:没有子节点的节点(度为0)。6)父子节点:一个节点father指向另一个节点child,则child为孩子节点,father为父亲节点 。原创 2016-12-14 21:14:21 · 1327 阅读 · 1 评论 -
数据结构::二叉树的非递归实现
#includeusing namespace std;#include#includetemplatestruct BinaryTreeNode{ T _data; BinaryTreeNode* _left; //左孩子 BinaryTreeNode* _right; //右孩子 BinaryTreeNode(const T&x) :_data(x) ,_left原创 2016-12-14 21:23:09 · 1112 阅读 · 0 评论 -
数据结构::矩阵(一)--对称矩阵及对称矩阵的压缩存储
【对称矩阵】:1、定义:元素以对角线为对称轴对应相等的矩阵。 设一个N*N的方阵A,A中任意元素Aij,当且仅当Aij == Aji(0 && 0 角和下三角。【对称矩阵的压缩存储】:1、压缩存储称矩阵存储时只需要存储上三角/下三角的数据,所以最多存储n(n+1)/2个数据。2、对称矩阵和压缩存储的对应关系:下三角存储i>=j, SymmetricM原创 2016-12-12 18:38:12 · 3877 阅读 · 0 评论 -
数据结构::矩阵(二)--稀疏矩阵
【稀疏矩阵】:定义:在N*N的矩阵中有效值的个数远小于无效值的个数,且这些数据的分布没有规律(下面这张图就是稀疏矩阵的一个例子:)【稀疏矩阵的压缩存储】: 1)稀疏矩阵的存储:压缩存储值存储极少数的有效数据。使用{row,col,value}三元组存储每一个有效数据,三元组按原矩阵中的位置,以行优先级先后顺序依次存放。templatestruct Tripe{原创 2016-12-12 20:39:18 · 2757 阅读 · 1 评论 -
数据结构::迷宫(一)--栈的一个应用
【前情描述】:我们先来看一张图片: (在这张图片里我们用“1”来表示墙,用“0”来表示通路。红色方块表示入口点,绿色方块表示出路) 我们要从迷宫的出口开始走找出路,即红色走到绿色,那么怎么解决这个问题呢?别着急,往下看,听我细细讲解:【解决迷宫问题】:方法一:利用栈来解决 思路分析:1)我们先要给定一个入口点,从入口点开始出发,即先将入口点进行压栈2)我们用一原创 2016-12-06 11:43:05 · 6341 阅读 · 0 评论 -
数据结构::迷宫(二)--栈的一个应用(求迷宫最短路径)
上篇文章我们知道求解迷宫通路的方法,但是一个迷宫有时是不止一条出路,在这些出路中,我们如何找到最短的那一条,这就是我今天要说的迷宫最短路径问题。(此处使用的图):【先来分析有什么解决方案:】1、方法一:我们如果采用上章中递归的方式,将所走的路用2标记起来,此时如果找到一条路后,要进行回溯递归,但是到可以走的环中就出现问题了,说的有点迷糊是吧,我把图抛出来。在这张图中原创 2016-12-06 16:00:30 · 7875 阅读 · 1 评论 -
数据结构::关于迭代器失效
当我们在使用容器或者链表的insert或者erase函数的时候可能会导致迭代器失效,那么如何解决这个问题:我们可以获取insert或者erase返回的迭代器。原创 2016-12-07 16:34:14 · 2183 阅读 · 0 评论 -
数据结构::如何计算后缀表达式--栈的一个小应用
一、首先我们先了解下什么是后缀表达式:【定义】:不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则,如:(2 + 1) * 3 , 即2 1 + 3 *【计算方法】:建立一个栈S 。从左到右读表达式,如果读到操作数就将它压入栈S中,如果读到n元运算符(即需要参数个数为n的运算符)则取出由栈顶向下的n项按操作符运算,再将运算原创 2016-12-07 21:18:44 · 2534 阅读 · 0 评论 -
数据结构::算法复杂度
我们都知道一个问题有多种算法,而算法分析就是选择合适的算法和改进的算法。而一个算法的优劣性是从时间复杂度和空间复杂度来进行评判。那么接下来我们就来玩转时间,空间复杂度。 一、时间复杂度1、虽然叫时间复杂度但是不是计算时间的,因为你想如果我们要算出一个算法的实际运行时间,那岂不是要将它上机测试运行,每一个都要这样做就会很麻烦,并且我们有的可能还比较抽象,很难计算出来,任务量大,很花费时间。因原创 2016-11-26 19:04:53 · 4381 阅读 · 0 评论 -
数据结构::递归时间复杂度的计算
开篇前言:为什么写这篇文章?笔者目前在学习各种各样的算法,在这个过程中,频繁地碰到到递归思想和分治思想,惊讶于这两种的思想的伟大与奇妙的同时,经常要面对的一个问题就是,对于一个给定的递归算法或者用分治思想缩小问题规模的算法,如何求解这个算法的时间复杂度呢?在google过很多的博文后,感觉这些博文总结的方法,有很好优秀的地方,但是都不够全面,有感于此,笔者决定总结各家之长,作此博文,总结各种方法于转载 2016-11-26 22:11:43 · 9272 阅读 · 1 评论 -
数据结构::模拟STL实现list
注意:在STL里面运用的是空间配置器,但是这次我暂时没有用空间配置器,后面我会带上空间配置器再实现一遍。#include#includeusing namespace std;templatestruct _ListNode{ T _data; _ListNode* _pNext; _ListNode* _pPre; _ListNode(const T& x) :_d原创 2016-12-09 14:31:36 · 629 阅读 · 0 评论 -
数据结构::线索化二叉树
1、为什么要引入线索化二叉树? 我们知道二叉树是一种非线性结构,当我们遍历二叉树的时候,我们一般的方法是利用递归或者是借助栈来实现非递归,而不管是利用递归还是栈我们知道,它们所用的开销是很大的,即压栈,建立新的栈帧,当有时候我们递归的层次很深的时候,会出现溢出,而且一般递归虽然简单,但是效率比较低。 因此我们就想能不能采取一种方式,可以减小开销,遍历的时候可以一次解决,原创 2016-12-25 22:06:56 · 708 阅读 · 0 评论 -
数据结构::堆及堆的应用~
【堆】:1.概念: 堆是一种特殊的树形结构,堆的把每一个节点都有一个值,我们通常所说的堆这种数据结构,指的就是二叉堆。 其实它可以被看做一个完全二叉树。 它的每个节点的子树又可以被看做是堆。2.分类: 堆可以分为最大堆和最小堆: 最大堆:每个父节点都大于孩子节点 最小堆:每个父节点都小于孩子节点3.关于堆的实现: 1)如何建堆原创 2016-12-31 13:47:35 · 7905 阅读 · 0 评论 -
数据结构::搜索二叉树
【概念及性质】: 它要么是一颗空树,要么是具有以下性质的一颗树: 1)每个节点都有一个作为搜索依据的关键码(key),并且每个关键码都不相同 2)左子树上的所有节点的关键码都小于根节点的关键码 3)右子树上的所有节点的关键码都大于根节点的关键码 4)左右子树都是搜索二叉树【如何实现一些接口】:(由于它亦是一个二叉树,所以一些拷贝构造,析构等原创 2017-01-13 13:03:04 · 731 阅读 · 0 评论 -
数据结构::如何实现哈夫曼树
【哈夫曼树的定义】: 哈夫曼树又称为最优二叉树,它是加权路径最短的二叉树。 不同于普通的二叉树,它的每个节点都有相应的权值,当我们构建的时候最终离根节点远的节点权重小,反之就比较大。【哈夫曼树的实现】:1、利用的核心思想:贪心算法 贪心算法:是指在问题进行求解的时候,总是做出当前看起来最好的选择。即就是说贪心算法做出不是整体的最优解,而是某种原创 2017-01-01 20:13:23 · 4208 阅读 · 0 评论 -
数据结构::关于哈希表
学习完二叉搜索树后,我们来学习一种新的结构,哈希表【前言】:二叉搜索树具有lgn的搜索时间复杂度,但是是建立在数据有足够的随机性哈希表是也是具有对数时间复杂度的,但是它是以统计为基础的,并不在乎输入数据的随机性【哈希表】:1、定义:*HashTable-散列表/哈希表,是根据关键字(key)而直接访问在内存存储位置的数据结构。*它通过一个关键值的函数将所原创 2017-02-21 17:16:14 · 749 阅读 · 0 评论