数据结构
文章平均质量分 61
zhuohaiyy
这个作者很懒,什么都没留下…
展开
-
STL中vector的使用以及模拟实现
vector:vector是一个动态增长的一个数组,它和数组是非常相似的。 vector与数组的区别在于空间运用的灵活性。 数组是静态空间,一旦配置了就不能改变,如果要增大空间,就需要重新开辟一个更大的空间,把原来数组的元素拷贝进去,然后在把原来的空间释放还给操作系统。 而vector是动态增长的,它会随着元素的增加而增大空间。下面我们看一下vector的主要函数功能判断容器的大小int si原创 2017-09-23 09:58:23 · 373 阅读 · 0 评论 -
基于huffman树实现文件压缩
在上一篇博客中我们介绍了哈夫曼(huffman)树本文将介绍一下如何用huffman树实现文件压缩。首先,我们将文件压缩这个项目分为五个步骤: 1. 统计字符出现的次数。 2. 构建哈夫曼树 3. 生成哈夫曼编码 4. 压缩文件 5. 解压缩文件以上就是文件压缩的基本思想,我们不难发现出现的越频繁,次数越多的字符,它的huffman编码就会越短,并且占用的空间也会越少,原创 2018-01-24 18:24:00 · 535 阅读 · 0 评论 -
huffmantree——哈夫曼树
哈夫曼树(Huffman tree):又名最优树,指给定n个权值作为n的叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。若将树中结点赋给一个有着某种含义的数值,则这个数值称为该结点的权。这里有几个名词我们先来了解一下:路径和路径长度:在一棵树中,从一个原创 2018-01-24 14:32:38 · 1027 阅读 · 0 评论 -
面试题(两个栈实现一个队列和两个队列实现一个栈)
面试题(判断元素出栈入栈顺序的合法性。) 面试题(实现一个栈,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值的操作)的时间复杂度为O(1))1,两个栈实现一个队列我们知道栈是后进先出的,而队列是先进先出的 我们创建两个栈input(输入栈),output(输出栈) 我们用input(输入栈)来负责入队,而output(输出栈)来负责出队(反向) 出队是,如果output不为空,原创 2017-09-26 09:25:16 · 2711 阅读 · 0 评论 -
模拟实现堆+堆的应用
堆数据结构是一种数组对象,它可以被看作一颗完全二叉树的结构(数组是完全二叉树),堆是一种静态结构。 堆分为最大堆和最小堆。 最大堆:每个父结点都大于孩子结点。 最小堆:每个父结点都小于孩子结点。堆的优势:效率高,可以找最大数最小数,增删的时间复杂度为lgN,快 怎么找最后一个叶子结点? 找到最后一个叶子结点(左孩子为空就是叶子结点),由于堆是静态结构,所以我们要通过计算下标的方法找,计算它原创 2017-10-16 21:07:43 · 393 阅读 · 0 评论 -
选择排序——选择排序和堆排序
常见的比较排序算法有插入排序(直接插入排序和希尔排序),选择排序(选择排序和堆排序),交换排序(冒泡排序和快速排序),归并排序。还有非比较排序:基数排序和计数排序。本文讲讲选择排序中的选择排序和堆排序选择排序 以上是选择排序的算法思想,它的时间复杂度为O(N的平方)。代码实现:void SelectSort(int* a, size_t n){ assert(a); size_t原创 2017-11-28 21:33:17 · 298 阅读 · 0 评论 -
插入排序——直接插入排序和希尔排序
常见的比较排序算法有插入排序(直接插入排序和希尔排序),选择排序(选择排序和堆排序),交换排序(冒泡排序和快速排序),归并排序。还有非比较排序:基数排序和计数排序。本文讲讲插入排序中的直接插入排序和希尔排序。直接插入排序如图所示是我们直接插入排序的算法思想,我们可以看到它的时间复杂度为O(N的平方)。代码实现:void InsertSort(int *a,size_t n){ assert原创 2017-11-28 19:57:27 · 589 阅读 · 0 评论 -
容器set和map的使用
set和map都是关联式容器 先介绍两个值: 键值:key 实值:valueset特性:所有的元素都会根据元素的键值(key)自动的被排序。对于set元素来说键值就是实值,实值就是键值,set不允许两个元素有相同的键值(我们不能通过set的迭代器去修改set的元素,原因后面会解释)map特性:所有的元素都会根据元素的键值(key)自动的被排序,map的所有元素都是pair,同时原创 2017-10-30 15:21:00 · 561 阅读 · 0 评论 -
二叉树的基本操作实现(递归和非递归)
二叉树:二叉树是一棵特殊的树,二叉树每个节点最多有两个孩子结点,分别称为左孩子和右孩子。 满二叉树:高度为N的满二叉树有2^N- 1个节点的二叉树。完全二叉树: 若设二叉树的深度为h,除第h 层外,其它各层(1~h-1) 的结点数都达到最大个数,第h 层所有的结点都连续集中在最左边,这就是完全二叉树二叉树的基本操作:构造二叉树,前序遍历,中序遍历,后序遍历,求树的叶子结点,树的深度,树中第K层的结点原创 2017-10-12 15:01:03 · 728 阅读 · 0 评论 -
AVL树的基本实现
AVL树(高度平衡的二叉搜索树),它可以保持二叉树的高度平衡,尽量降低二叉树的高度,减少树的平均搜索长度AVL树的性质 1,左子树和右子树的高度之差的绝对值不超过1 2,树中的每个左子树和右子树都是AVL树 3,每个结点都有一个平衡因子,任意一个结点的平衡因子是-1,0,1(每个结点的平衡因子等于右子树的高度减去左子树的高度)AVL树的效率:一颗AVL树有N个结点,它的高度可以保持在lgN,其原创 2017-11-02 09:20:36 · 351 阅读 · 2 评论 -
STL中map和set底层的红黑树实现
我们都知道map和set的实现是依赖红黑树的 怎样写红黑树可以让map和set都可以使用呢? 在这里我们定义了一个模版参数,如果它是key那么它就是set,如果它是map,那么它就是map;我们分析一下,红黑树迭代器的前置++ 到当前结点,就说明了它的左子树和自己都已经访问过了 1,当前位置,若右树不为空,则访问右树的最左结点 2,当前位置,若右树为空,则找祖先中孩子不是他的右 若右访问原创 2017-11-10 13:57:02 · 3718 阅读 · 0 评论 -
RBTree——红黑树
红黑树:红黑树是一棵二叉搜索树,它在每个节点上增加了一个存储位来表示结点的颜色,红色或黑色(Red或Black) 通过对任何一条从根到叶子简单路径上的颜色来约束,红黑树保证最长路径不超过最短路径的两倍,从而达到近似平衡。红黑树必须满足的性质: 1,每个节点不是红色就是黑色。 2,根节点必须为黑色。 3,如果一个节点是红色,则它的两个子节点是黑色 (即不能有两个连续的红色节点)。 4,对每原创 2017-11-07 12:02:38 · 310 阅读 · 0 评论 -
二叉搜索树的增删查(递归与非递归)实现
二叉搜索树(BinarySearchTree): 二叉搜索树性质: 1. 每个节点都有一个作为搜索依据的关键码(key),所有节点的关键码互不相同。 2. 左子树上所有节点的关键码(key)都小于根节点的关键码(key)。 3. 右子树上所有节点的关键码(key)都大于根节点的关键码(key)。 4. 左右子树都是二叉搜索树。如图:是一个二叉搜索树 本文将实现二叉搜索树的插入删除查找我们原创 2017-10-23 21:57:18 · 353 阅读 · 0 评论 -
迷宫求解
问题:给指定的入口与出口,求该迷宫的通路。 思想: 1,我们要考虑越界问题。 2,我们要试探下一个位置是否可以通过,若这个位置上下左右都不能通过,则返回上一个位置。再去下一个位置。 代码的实现://建立一个存放坐标的结构体struct Pos{ size_t _row; size_t _col;};template<size_t M, size_t N>class M原创 2017-10-10 14:03:14 · 267 阅读 · 0 评论 -
栈和队列,以及模拟实现
栈栈只允许在末端进行插入和删除的线性表。 栈具有后进先出的特性。 所以栈的插入删除都是在栈顶进行操作的,可以取栈顶元素(Top)实现:用顺序表实现,由于他只能在栈顶进行操作,所以优选顺序表实现应用:递归图解: 栈模拟实现代码:#include<iostream>#include<assert.h>using namespace std;template<class T>class Sta原创 2017-09-28 09:06:48 · 290 阅读 · 0 评论 -
STL中list的使用及模拟实现
list:带头结点的双向循环链表 我们先来看看在STL中list的各个接口的使用#include<windows.h>#include<iostream>#include <algorithm> #include<list>using namespace std;//迭代器的使用 void Testlist(){ list<int> l1; l1.push_back原创 2017-09-19 14:27:43 · 416 阅读 · 0 评论 -
面试题(判断元素出栈入栈顺序的合法性。)
面试题(实现一个栈,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值的操作)的时间复杂度为O(1)) 面试题(两个栈实现一个队列和两个队列实现一个栈) 判断元素出栈,入栈顺序的合法性 如:入栈的序列(1,2,3,4,5),出栈序列为(4,5,3,2,1)是合法序列 入栈的序列(1,2,3,4,5),出栈序列为(1,5,3,2,4)是不合法序列 解题思路:我们声明两个栈,分别为i原创 2017-09-26 13:56:12 · 1175 阅读 · 0 评论 -
面试题(实现一个栈,要求实现Push、Pop、Min的时间复杂度为O(1))
面试题(判断元素出栈入栈顺序的合法性。) 面试题(两个栈实现一个队列和两个队列实现一个栈)实现一个栈,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值的操作)的时间复杂度为O(1)解题思路: 我们定义两个栈分别为s1,s2。我们用s2保存最小值,s1保存原来的值Push():我们添加元素到s1中,如果s2为空或者x#include#includeusing n原创 2017-09-26 15:23:25 · 1339 阅读 · 0 评论