数据结构
文章平均质量分 82
L_XRUI
one day one day one day......
展开
-
栈与队列的实现
一、栈:特点:后进先出(LIFO),只允许在末端进行插入和删除,所以适用于用数组(即一段连续的空间)来实现,经常性在数组尾部插入删除代码实现:#include #include #include using namespace std;template class Stack{public: Stack() :_a(NULL) ,_size(0) ,_cap原创 2016-11-29 16:42:23 · 473 阅读 · 0 评论 -
并查集实现解决小米面试题朋友圈问题
并查集:将N个不同的元素分成一组不相交的集合,开始时,每个元素就是一个集合,然后按规律将两个集合进行合并。举例如:(1)现在有10个元素:0,1,2,3,4,5,6,7,8,9;分别将每个元素看成一个集合,则可将它们看作数组下标,数组里先存储-1,代表都为根,如:(2)现在知道有元素下列不相交集合关系:则在上面数组基础上创建这些集合关系,数组变为:过程为:以第一个原创 2017-03-17 17:19:34 · 1671 阅读 · 1 评论 -
红黑树实现
红黑树:是一棵二叉搜索树,它在每个节点上增加了一个存储位来表示节点的颜色,可以是Red或Black。通过对任何一条从根到叶子简单路径上的颜色来约束,红黑树保证最长路径不超过最短路径的两倍,因而近似于平衡(由于性质中红色节点不连续,最短路径可为全是连续黑结点,最长路径则由于红节点不连续,则每间隔一个黑的插入一个红的节点,所以最长路径为两倍)。 它主要满足以下几个性质: 1. 每个节点,不是红原创 2017-02-15 23:20:39 · 772 阅读 · 0 评论 -
哈夫曼树
哈弗曼树(Huffman tree):是最优二叉树,加权路径最短的二叉树。贪心算法:是指在问题求解时,总是做出当前看起来最好的选择,即为贪心算法做出的不是整体最优的选择,而是某种意义上的局部最优解,贪心算法不是对所有的问题都能得到整体最优解。思想:这里使用贪心算法构建哈弗曼树,运用最小堆的思想,建立最小堆,每次从堆中找最小的两个节点构造新结点,新结点再放回堆中,并连接两个旧的结点,按相同方原创 2017-01-29 17:25:24 · 898 阅读 · 0 评论 -
STL库:set和map的使用和原理
set和map是C++标准库中的关联容器,它们中的所有元素都会根据元素的键值(key)自动被排序,又由于红黑树(RB-tree)是一种平衡二叉搜索树,自动排序效果非常好,所以标准的STL中的set和map容器都是以红黑树(RB-tree)为底层机制,又由于map和set所开放的各种操作接口,RB-tree也提供了,所以它们几乎所有的操作行为,都只是转调RB-tree的操作行为。set介绍:se原创 2017-02-16 12:51:12 · 1138 阅读 · 0 评论 -
大数据处理堆实现N个数据找K个最大数据和堆排序
在N个数据中找K个最大数据思想:用堆实现找最大的数据,则先建立一个N个数据中其前K个节点的最小堆,将没进入最小堆的节点依次与小堆的头节点比较,若大于头节点,则替换两个值,并且调用向下调整算法(其思想前面博客已经介绍实现),直到N个数据比较完成,此时最小堆中的K个节点即为N个数据中的K个最大数据。在代码中为了方便测试N与K的值较小。堆排序思想:即建立一个堆来实现排序,升序与降序思想基本相同,原创 2016-12-31 15:10:25 · 2676 阅读 · 0 评论 -
大小堆的实现与实现优先级队列
堆:可视为一棵完全二叉树结构,最小堆每个父节点都小于孩子结点,最大堆每个父节点都大于孩子结点。建堆思想:实现向下调整算法AdjustDown():即当一个节点的左子树和右子树都已为最大堆或最小堆(在这里则寻找树倒着走的第一个非叶子结点,依次进行调整),比较其左右孩子结点满足大堆或小堆要求的节点,再与此节点比较,若孩子结点大,满足大堆交换两节点值,或小堆,孩子结点小则交换。大堆与小堆思想基本相同原创 2016-12-31 14:44:48 · 1085 阅读 · 0 评论 -
STL容器中list与迭代器iterator的模拟实现
list在容器中结构是有一个头结点_head,头结点指向第一个结点,尾结点指向头结点,它为双向循环链表,在其中它有自己的迭代器可以类似于智能指针,用于数据的访问和算法的配合。代码实现:#include #include #include #include using namespace std;template struct _ListNode //结点结构{ T原创 2016-12-30 16:03:55 · 2048 阅读 · 0 评论 -
二叉树递归与非递归遍历实现
二叉树:将一数组创建二叉树,四种遍历方法:前序,中序,后序,层次遍历,与求不同情况下的结点个数等。代码实现:#include #include #include #include #include using namespace std;template struct BinaryTreeNode{ T _data; BinaryTreeNode *_left; B原创 2016-12-29 22:54:28 · 1877 阅读 · 0 评论 -
对称矩阵和稀疏矩阵的压缩和转置
对称矩阵:N*N方阵A,特点Aij=Aji,对角线分割为上三角和下三角,压缩存储只需存储下三角数据。稀疏矩阵:矩阵中有效数据很少,在存储时只存储有效数据,非法数据不存,在实现中创建一个结构体表示一个有效数据,并以行优先级先后顺序依次存放,并对稀疏矩阵实现转置和快速转置。代码实现:#include #include #include #include using namespac原创 2016-12-29 22:34:58 · 1159 阅读 · 0 评论 -
关于栈与递归求解迷宫与迷宫最短路径问题
一、栈实现迷宫问题:问题描述:用一个二维数组模拟迷宫,其中1为墙,0为通路,用栈方法判断迷宫是否有出口,下图为简单模拟的迷宫:思想:1.首先给出入口点,如上图入口点坐标为{2,0};2.从入口点出发,在其上下左右四个方向试探,若为通路(值为0)时,则向前走,并将每次通路结点入栈(push)保存和标记走过的路为2;3.当四个方向都没有通路时,则开始回溯,将栈中保存的结点开原创 2016-12-03 13:11:24 · 3975 阅读 · 0 评论 -
STL二级空间配置器
在前面博客已经实现了一级空间配置器,博客链接如下:http://blog.csdn.net/l_xrui/article/details/645008981.首先明白为什么需要二级空间配置器?我们知道动态开辟内存时,要在堆上申请,但若是我们需要不断的在堆上开辟小块内存,释放,开辟释放,则就会再堆上造成很多外部碎片,浪费了内存空间;并且由于每次都要进行调用malloc、free函数,原创 2017-03-27 20:30:26 · 913 阅读 · 0 评论