数据结构
小魏同学i
这个作者很懒,什么都没留下…
展开
-
【数据结构】二叉树
树是数据结构中非常重要的一部分内容,尤其是二叉树。什么是二叉树? 树是由n(n>=1)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。 二叉树则是每个结点最多有两个子树的树,二叉树的度最多为2,。左侧子树的称为左子树,右侧子树的称为右子树。二叉树中有着一些非常重要的推论:...原创 2017-12-03 14:30:27 · 288 阅读 · 0 评论 -
【数据结构】哈希桶
在上一篇博客中,我们简单地介绍了哈希表,以及解决哈希冲突的办法;今天我们介绍解决哈希冲突的另一种方法——开散列法。开散列法又叫链地址法,首先对关键码集合用散列函数计算散列地址,具有相同地址的关键码归于同一子集合,每一个子集合称为一个桶,各个桶中的元素通过一个单链表链接起来,各链表的头结点组成一个向量。说起来可能很复杂,其实很简单,看一个图就明白了:假设哈希函数为Hash(key)=key%10...原创 2018-04-04 20:56:39 · 5613 阅读 · 1 评论 -
【数据结构】堆
什么是堆? 这里的堆不是指计算机里的“堆栈”,而是指一种数据结构,它的结构是一颗二叉树。 我们把一个关键码集合中所有元素按完全二叉树的顺序存储方式存储在一个一维数组中,并满足以下两个之一:任一个节点的关键码均小于等于它的左右孩子的关键码,位于堆顶的关键码最小的称为最小堆;任一个节点的关键码均大于等于它的左右孩子的关键码,位于堆顶的关键码最大的称之为最大堆。堆的创建...原创 2018-04-04 22:17:39 · 192 阅读 · 0 评论 -
【数据结构】排序算法——选择排序和堆排序
选择排序1.基本思想 以升序为例,假设有n个数据,每一趟在后面n-i的待排序的数据元素集合中选出关键码最小的数据元素,作为有序序列的第i个元素,直至待排序集合中只剩下1个元素。2.操作步骤 举一个例子: 3.算法性能 时间复杂度:直接选择算法需要遍历每一趟选出最小的一个数,遍历n遍,时间复杂度为O(N^2) 稳定性:是一种不稳定的算法。vo...原创 2018-04-04 23:02:13 · 211 阅读 · 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个朋友圈。 ...原创 2018-04-12 18:14:09 · 1022 阅读 · 2 评论 -
【数据结构】图
图的概念 1. 图 图是一种非线性数据结构,由顶点的集合及顶点间的关系(边)组成;G=(V, E),其中顶点集合V是有穷非空集合;E={(x,y) | x, y属于V}或E={<x,y> | x, y属于V}是顶点间关系的有穷集合,也叫做边的集合;其中第一种圆括号表示x到y的一条双向通路,即:(x,y)与(y,x)是一条边,这种边与顶点构成的图叫做无向图;第二种尖括号表示x...原创 2018-04-22 11:41:35 · 599 阅读 · 0 评论 -
【数据结构】位图
位图(bitmap),就是用每一位存放某种状态,适用于数据较多,且状态不多的情况。在Linux系统中,用位图来表示是否接收到进程发送的信号,接收到信号则将相关的比特位置1。给出40亿个不重复的无符号整数,没排过序;在给定一个无符号的整数,判断这个数是不是在这40亿个数中。 这道题的解决方法也用到了位图,一个无符号的整数能表示的最大的值是2^32=42亿多,每一个无符号的整数占用4个字节,那么...原创 2018-04-12 20:30:48 · 1483 阅读 · 0 评论 -
【数据结构】图的遍历及最小生成树
上一篇博客中讲了图的基本概念及如何存储,下面学习图的遍历及最小生成树的问题。图的遍历广度优先搜索(Breadth First Search, BFS)举一个例子: 假设我们都从顶点A开始遍历,左侧为有向图,它的广度优先搜索结果为:A D B E C;右侧为无向图,它的广度优先搜索结果为:A E D B C。 广度优先搜索类似于树的层序遍历,在实现的时候,需要借助队列...原创 2018-05-02 00:11:26 · 1865 阅读 · 1 评论 -
【数据结构】布隆过滤器
布隆过滤器原理 如果要判断一个数是不是在一个集合里,一半想到的是将所有的元素保存起来,然后通过比较确定。但是随着集合中元素的增加,需要的存储空间越来越大,检索速度自然会变慢。这时会有人想到使用哈希表,将元素通过哈希函数映射到一个位阵列中,将相应的比特位置为1,这样就可以判断这个元素是不是在集合之中了。 但是哈希有一个很严重的问题,那就是哈希冲突。针对这个问题,我们的解决方法是使...原创 2018-05-10 20:51:12 · 190 阅读 · 0 评论 -
【数据结构】哈希
我们经常会在一堆数据中搜索我们需要的数据元素,用于搜索的数据集合称为搜索结构。常见的查找方法有:从前往后依次遍历,二分查找,平衡二叉树,B树等。今天,我们看一种更高效的查找方法。哈希查找 在线性表,二叉搜索树,AVL树等结构中,元素在存储结构中的位置与元素的关键码之间不存在直接的对应关系。我们知道在数据结构中搜索一个元素需要进行一系列的关键码比较,因此搜索的效率取决于搜索过程...原创 2018-04-03 23:54:02 · 830 阅读 · 0 评论 -
【数据结构】对B树的认识
B树的引入 二叉搜索树、平衡二叉树、红黑树都是我们之前学过的典型的二叉搜索树,其查找的时间复杂度和树的高度都是O(log2N)。 但是如果我们的数据量很大的话,比如像文件系统及数据库系统普遍都采用B-/+树作为索引结构。一般来说,索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储在磁盘上。这样的话,索引查找过程中就要产生磁盘I/O的消耗,相信大家都知道,相比于内存...原创 2018-03-20 17:19:12 · 366 阅读 · 0 评论 -
【数据结构】红黑树
一. 红黑树的概念 红黑树是一颗二叉搜索树,它的每个结点增加一个存储单位来表示结点的颜色,这个颜色是red或者black,通过对任何一条从根结点到叶子结点上的颜色来约束,红黑树保证最长路径不超过最短路径的两倍,因而近似平衡。二. 红黑树的性质 1.每个结点不是黑色就是红色;2.根结点的颜色是黑色;3.没有两个连续的红色结点;4.每条路径上黑色结点的数量...原创 2018-01-27 17:23:05 · 267 阅读 · 0 评论 -
【数据结构】带迭代器的红黑树
在上一篇博客中,我们简单的介绍了红黑树及其插入操作,下面我们将给红黑树封装一个迭代器。为方便操作,我们需要添加一个头结点,并设置其颜色为红色,以便于根结点区分开;这个根结点的左指向最小的结点,右指向树中值最大的结点,其双亲结点指向根结点,根结点的双亲域也指向头,如下图所示:#pragma once#include using namespace std;enum COLOR原创 2018-01-27 17:45:52 · 203 阅读 · 0 评论 -
【数据结构】二叉搜索树
二叉搜索树,又称二叉排序树,它是一棵空树或者时具有如下性质的一棵二叉树:1.若它的左子树不为空,则左子树上所有节点的值都小于根结点;2.若它的右子树不为空,则右子树上所有节点的值都大于根结点;3.它的左右子树也分别为二叉搜索树。如下图所示:可以发现它的中序遍历结果是:0,1,2,3,4,5,6,7,8,9;是有序的。二叉搜索树主要包括了结点的原创 2018-01-25 20:43:29 · 179 阅读 · 0 评论 -
【数据结构】二叉搜索树——转换成有序双向链表
在上一篇博客中,我们对二叉搜索树已经有了简单的认识。下面我们看看怎样将二叉搜索树转换成有序的双向链表在二叉搜索树中,左子树结点的值小于双亲结点的值,右子树结点的值大于双亲结点的值。在双向链表中,每个结点也有两个指针,分别指向前一个结点和后一个结点。因此我们可以通过改变指针指向将二叉搜索树转换成双向链表。具体实现代码如下:#pragma once#include原创 2018-01-25 21:21:40 · 279 阅读 · 0 评论 -
【数据结构】AVL树及平衡化旋转
二叉搜索树可以缩短查找的效率,但是如果数据有序或接近有序时二叉搜索树将退化为单支树,查找效率将会下降。因此,我们通过向二叉搜索树种插入结点后,保证左右子树的高度之差的绝对值不超过1来调节结点,降低树的高度。一. AVL树概念: 一颗AVL树是一颗空树或者具有如下性质的二叉搜索树:1.它的左右子树都是AVL树;2.左子树和右子树高度之差(简称平衡因子)的绝对值不超过1;...原创 2018-01-26 18:41:56 · 1200 阅读 · 1 评论 -
【数据结构】栈
栈是数据结构中非常重要的一种,它的最大特点就是先进后出,我们利用这个特点解决很多问题时都会比较方便。比如:括号匹配问题,逆波兰表达式求值等问题,有时候也需要借助栈将递归转化成循环。 下面我们将通过顺序存储来简单实现栈:template class Stack{public: Stack() : _data(new T[3]) , _size(0) , _原创 2017-11-15 23:16:01 · 206 阅读 · 0 评论 -
【数据结构】前序遍历和中序遍历确定二叉树
已知一个二叉树,我们可以得到它的前序遍历,中序遍历和后续遍历。那么,我们已知前序和中序的遍历结果,怎样还原二叉树呢?假设前序遍历结果为:abdcef,中序遍历结果为dbaecf。 前序遍历:根结点+左子树+右子树 中序遍历:左子树+根结点+右子树 由此,我们可以得知,前序结果第一个字母a为根结点,在中序遍历结果中找到a,a的左侧d,b为a的左子树,a的右侧e...原创 2018-02-11 19:52:26 · 3930 阅读 · 0 评论 -
【数据结构】排序算法——插入排序和希尔排序
一、插入排序1.算法思想 要求在一个已经有序的数据序列中插入一个数据,并且插入次数据后数据序列依然有序,这时就需要用到一种新的排序方法——插入排序,其基本思想就是每步讲一个待排序的记录,按其关键码值的大小插入到前面已经排序的文件中适当的位置,直至全部插入完为止。2.具体步骤从第一个元素开始,该元素可以认为已经被排序取出下一个元素,在已经排序的元素序列中从后向前扫描如果已排序的元素大于新元...原创 2018-02-25 19:28:08 · 1153 阅读 · 0 评论 -
【数据结构】排序算法——快速排序
快速排排序是效率非常高的排序算法之一。 它的基本思想是:首先选择一个基准值,通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都小于基准值,另一部分所有数据都大于基准值,并且经过一趟排序,所选择基准值已经换到了在它应该在的正确位置。然后再通过此方法堆这两部分数据分别进行快速排序,整个排序过程可以递归实现。但是具体的将待排序的数据分为两个部分的方法,却有很多: 举...原创 2018-05-13 22:40:28 · 21223 阅读 · 0 评论