数据结构
文章平均质量分 69
John__xs
刚入门的菜鸟级程序员
展开
-
单链表排序之直接插入排序
****单链表排序之直接插入排序****/*前段时间刚学会几种排序方法,最近学习了单链表,就用来试试,本篇链表的排序方法讲述的是单链表的直接插入排序;(注意:请仔细看准节点结构体的包装和头指针的包装再阅读以下代码);直接插入排序的思想和直接插入排序数组的方法,我都已经在直接插入排序的文章中介绍了;直接插入排序链接:http://blog.csdn原创 2016-06-07 20:28:34 · 13317 阅读 · 0 评论 -
双向链表(迭代器)
//双向链表(迭代器)#include<iostream>#include<cassert>using namespace std;//链表结点template<class T>struct _ListNode { _ListNode* _prev; _ListNode* _next; /*void* _prev; vo原创 2016-09-21 19:26:37 · 2749 阅读 · 3 评论 -
稀疏矩阵的快速转置算法
稀疏矩阵的快速转置算法在描述稀疏矩阵的快速转置算法之前,先了解什么是稀疏矩阵和什么是稀疏矩阵的压缩存储;稀疏矩阵的压缩存储什么是稀疏矩阵? /* 这是大学的以么课《线性代数》学的,不知道大家还记得多少,在老师讲到实现稀疏矩阵的压缩存储的时候,我知记得 我当时考了75分,其它的就呵呵了-_-!!! 言归正传,稀疏矩阵,例如:--------------0 0 2 0 40 0 0 0 00原创 2016-09-28 09:09:09 · 12308 阅读 · 3 评论 -
哈夫曼树实现文件压缩
最近在学了哈夫曼树之后,作为练习,写了一个文件压缩的小项目; 在这里和大家分享一下;主要实现思路: 利用哈夫曼树的特性对字符进行哈夫曼编码,其中运用到了最小堆;利用最小堆的特性,找出构造哈夫曼树的结点;统计文件字符出现的次数,本质是利用字符出现的次数进行构造哈夫曼树; 然后通过遍历哈夫曼树获取哈夫曼编码;配置文件的主要内容:字符,字符出现次数,哈夫曼编码 当解压缩时可以利用配置文件中的内容构造出原创 2016-11-05 09:34:40 · 5344 阅读 · 2 评论 -
布隆过滤器(Bloom Filter)的原理
布隆过滤器[1](Bloom Filter)是由布隆(Burton Howard Bloom)在1970年提出的。它实际上是由一个很长的二进制向量和一系列随机映射函数组成,布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率(假正例False positives,即Bloom Filter报告某一元素存在于某集合中,但是实际上该元素转载 2016-11-06 15:48:14 · 1168 阅读 · 0 评论 -
遍历二叉树(非递归)
遍历二叉树(非递归)博客链接:递归遍历二叉树语言 = C++; 博客摘要:回顾层序遍历的遍历方式采用非递归的方式遍历二叉树; 主要三种遍历方式: @前序遍历 @中序遍历 @后序遍历在上一篇博客中我们提到了遍历二叉树的四种方式:前序遍历中序遍历后序遍历层序遍历其中前三种采用了递归的方式,而层序遍历采用的是非递归的方式,为我们本篇博客坐了铺垫;我们先来回忆一下层序遍历的大体过程原创 2016-10-03 20:06:21 · 976 阅读 · 0 评论 -
二叉排序树
二叉排序树什么是二叉排序树:即一个二叉树,它的每一个结点的左孩子的key值比当前结点的key值小,而右孩子结点的key值比当前结点的key值大,这样的一个树就是二叉排序树,也叫二叉搜索树(BST_tree);一颗排序二叉树的结点框架大概就是这样:template<class K>struct SearchBinaryTreeNode{ SearchBinaryTreeNode<K>* _原创 2016-10-20 09:36:14 · 6747 阅读 · 0 评论 -
数据结构之红黑树
红黑树: 本质是一棵近似平衡的搜索树,当然,想要了解红黑树的前提是你足够了解搜索树和AVL(高度平衡的二叉搜索树);红黑树的特征: (注意,本文所讲内容时刻围绕这五条特征,请仔细阅读)1. 每个节点,不是红色就是黑色的 2. 根节点是黑色的 3. 如果一个节点是红色的,则它的两个子节点是黑色的 4. 对每个节点,从该节点到其所有后代叶节点的简单路径上,均包含相同数目的黑色节点。原创 2016-10-31 16:51:09 · 1369 阅读 · 0 评论 -
探索B树/B+树与MySQL数据库索引的关系
本文主要讲述主轴线:由搜索/查找联系到数据结构(搜索树,红黑书,B/B+树);进行B/B+/RBtree的性能分析;讲述一些关于数据从内存以及磁盘读取数据的数据存储管理的内容;对数据库引擎MyISAM和InnoDB的分析;前言:目前大部分数据库系统及文件系统都采用B-Tree或其变种B+Tree作为索引结构,最近学习了数据结构树这一部分的内容,又阅读了前辈们关于这一话题的的总结后,斗胆运用原创 2016-11-18 17:40:21 · 13058 阅读 · 3 评论 -
求二叉树中最远的两个节点的距离
求二叉树中最远的两个节点的距离短短的代码中其实涉及到了三道题目:利用已知序列递归的建一棵二叉树递归的求一棵树的深度求二叉树中距离最远的两个节点的距离:利用递归求树的深度的思想,在其中加入一个最大距离的引用的参数,利用了引用参数的特性,即可求得最大距离,比较简单,下面列出代码及图示;给出两组测试用例的图示://代码实现#include<iostream>#include<cassert>u原创 2016-11-23 19:49:14 · 5318 阅读 · 1 评论 -
二叉树相关编程题总结
关于二叉树的五道面试题的总结求二叉树的最远两个结点的距离;由前序遍历和中序遍历重建二叉树;判断一棵树是否是完全二叉树;求二叉树两个节点的最近公共祖先;将二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。 注:本篇博客就这五道面试题,并不是单纯的给出求解代码,而是全面的进行分析,并进行问题的延伸,在求解过程中对问题的延伸都有代码的实现,so!原创 2016-12-01 17:18:54 · 6319 阅读 · 2 评论 -
【链表复习】链表相关面试题
题目描述 输入一个链表,从尾到头打印链表每个节点的值。class Solution {public: vector<int> ret; //保存链表值 vector<int> printListFromTailToHead(ListNode* head) { fun(head); //递归 return ret; } //递归原创 2017-06-30 22:26:41 · 884 阅读 · 1 评论 -
大数据处理面试题分析
**大数据处理面试题分析**最近学习了关于搜索方面的数据结构--搜索树,AVL树,红黑树,哈希表,哈希表的扩展-位图,布隆过滤器;大数据在当前社会下是非常火的,同样随之而来的是在IT行业进行面试的时候,也就变成了经常问的话题;所以我就尝试利用所学知识对以下大数据方面的面试题进行分析:我发现,如果是内存放不下,并且位图等数据结构也用不上的情况下,哈希切分则扮演重要的角色!当然,我建议如果你对数据结构有原创 2016-11-12 13:24:59 · 3934 阅读 · 1 评论 -
【STL】堆
【STL】常用容器总结,带有复习性质的学习更有效率;【Heap】 在STL中不是以容器的方式呈现的,而是以算法的方式;所谓堆,其实就是将数组假想成完全二叉树,满足某种规则的呈现。 某种规则就是堆顶(数组第一个元素)始终为最大或者最小的元素,还可以结合数组连续性的特性进行堆排序;堆分为 max heap 和 min heap, STL默认的是 max heap , 所以下面实现的时候也会原创 2017-06-27 17:11:46 · 1897 阅读 · 0 评论 -
【STL】序列式容器--vector
【STL】常用容器总结,带有复习性质的学习更有效率;【vector】序列式动态增长的容器优点:相比如array的数组,不拘泥于固定大小,可以动态增长,依然可以采用下标的方式随机访问,(未雨绸缪)提前根据需求调用API设置vector初始大小,这是因为vector存在的缺陷(见下);缺点:因为是固定位置的结构,所以避免不了的是挪动时的消耗,比如,删除一个元素,vector底层是将要删除的元素后面的元素原创 2017-06-27 08:33:23 · 513 阅读 · 0 评论 -
【STL】序列式容器--list(简单复习)
【STL】常用容器总结,带有复习性质的学习更有效率;list 和 vector 是最常用的两个容器,也是在面试中最常被问到的,让你对比一下这两个容器;那么,首先复习一下 list 的结构,list 底层的数据结构是双向链表,同时,和vector不同的是,list 的迭代器不再是原生指针, 而是专门封装的双向迭代器;既然是链表,那么和 vector 一对比, 不同之处就很明显了, 首先因为是链表结构,原创 2017-06-27 09:11:43 · 460 阅读 · 0 评论 -
【STL】序列式容器--stack和queue
【STL】常用容器总结,带有复习性质的学习更有效率;【栈和队列】栈和队列相关的问题在面试中真的是被问的不要不要的,下面我先从栈和队列的数据结构开始复习,最后做几道栈和队列的相关面试题作为巩固;【栈】: 一种先进后出的结构,在操作系统中应用广泛;在STL中的栈容器,底层默认是deque作为数据结构(queue也是一样),但是由于双端队列用的比较少,而且比较复杂,没有过多研究,同样list和vector原创 2017-06-27 13:13:42 · 622 阅读 · 0 评论 -
稀疏矩阵的压缩存储
稀疏矩阵的压缩存储coad = C++;什么是稀疏矩阵? /* 这是大学的以么课《线性代数》学的,不知道大家还记得多少,在老师讲到实现稀疏矩阵的压缩存储的时候,我知记得 我当时考了75分,其它的就呵呵了-_-!!! 言归正传,稀疏矩阵,例如:--------------0 0 2 0 40 0 0 0 00 1 0 3 05 0 6 0 0--------------上面这个就原创 2016-09-20 20:49:15 · 2237 阅读 · 0 评论 -
对称矩阵的压缩存储
对称矩阵的压缩存储什么是对称矩阵的压缩存储? 就是只存上三角或者只存下三角,以下代码以下三角存储为例;怎么做到压缩存储呢? 只存下三角呢?其实这很简单,采用的是一维数组存储,下标访问的形式! 这样做的目的肯定在于节省空间! 在实现代码之前,我们需要搞清楚的是对称矩阵的规律; /*下面是一个对称矩阵: 0 1 2 3 1 0 1 2 2 1 0 1 3 2 1 0显而易见的是对称轴上都是原创 2016-09-20 20:39:12 · 4900 阅读 · 0 评论 -
单链表排序之冒泡排序
***单链表排序之冒泡排序***/*前段时间刚学会几种排序方法,最近学习了单链表,就用来试试,本篇链表的排序方法讲述的是单链表的冒泡排序;(注意:请仔细看准节点结构体的包装和头指针的包装再阅读以下代码);冒泡排序的思想和冒泡排序数组的方法以及冒泡排序的优化,我都已经在冒泡排序的文章中介绍了;冒泡排序链接:http://blog.csdn.原创 2016-06-07 12:26:42 · 30118 阅读 · 7 评论 -
单链表排序之选择排序
***单链表排序之选择排序***/*前段时间刚学会几种排序方法,最近学习了单链表,就用来试试,本篇链表的排序方法讲述的是单链表的选择排序;(注意:请仔细看准节点结构体的包装和头指针的包装再阅读以下代码);选择排序的基本思想:对比数组中前一个元素跟后一个元素的大小,如果后面的元素比前面的元素小则用一个变量k来记住他的位置,接着第二次比较,前面“后一个元素”原创 2016-06-07 11:36:57 · 19734 阅读 · 9 评论 -
单链表基本操作详解
# 单链表基本操作文中提到的内容的链接一并列在这里:顺序表:http://blog.csdn.net/bitboss/article/details/51559175冒泡排序:http://blog.csdn.net/bitboss/article/details/51559034选择排序:http://blog.csdn.net/bitboss/原创 2016-06-04 22:12:46 · 6809 阅读 · 4 评论 -
单链表操作之删除链表的一个非尾结点
***单链表操作之删除链表的一个非尾结点***/* 删除链表的一个非尾结点;没有给头节点;多么经典的一道题,但是第一次看到这道题的时候是有点懵,想着是从头找到该节点,然后删除,直接忽略了没有给你表头的事实,然后回过头来再思考思考,其实这道题也蛮简单的,既然给让你删除非尾结点,那么它的后面肯定还有结点,只要把这两个结点的data交换一下,然后删除后面的那个结点不就好原创 2016-06-08 00:23:59 · 2433 阅读 · 0 评论 -
单链表操作之在当前节点前插入一个元素
***单链表操作之在当前节点前插入一个元素***//在当前结点前插入一个元素,没有给头指针;//定义的结点的结构体和头指针的结构体;typedef int DataType;typedef struct LinkNode{ DataType data; struct LinkNode* next;}LinkNode,*pLinkNod原创 2016-06-08 08:37:16 · 12833 阅读 · 2 评论 -
单链表操作之反转单链表
***单链表操作之反转单链表***//反转单链表,只能遍历一遍链表// 定义的结点结构体和头指针结构体:typedef int DataType;typedef struct LinkNode{ DataType data; struct LinkNode* next;}LinkNode,*pLinkNode;//结点结构体typed原创 2016-06-08 09:46:56 · 3032 阅读 · 0 评论 -
单链表操作之合并两个单链表
***单链表操作之合并两个单链表***/* 本篇博客为合并两个单链表, 有序和无序都可以; 其中用到单链表的尾插和单链表的选择排序;@单链表排序之选择排序链接:http://blog.csdn.net/bitboss/article/details/51602544;代码中大部分操作都在单链表基本操作详解中介绍过,这里就直接上代码;*/原创 2016-06-08 14:01:13 · 10136 阅读 · 0 评论 -
单链表操作之查找中间结点
***单链表操作之查找中间结点***//查找链表的中间结点;//自定义的结点结构体和头指针结构体:#include#include#include#includetypedef int DataType;typedef struct LinkNode{ DataType data; struct LinkNode* n原创 2016-06-08 22:50:12 · 4763 阅读 · 0 评论 -
单链表操作之删除倒数第k个结点
****单链表操作之删除倒数第k个结点****//函数功能:删除链表的倒数第k个结点;1//自定义的结点结构体和头指针结构体://函数原型:void DelKNode(pLinList pList, int k);ps:我在博客中每次的思路分析,只是将我的对每道题的理解和思考列出来,里面会有我做题时思考的经过,各种失败的尝试等等,希望我的原创 2016-06-10 18:28:44 · 5881 阅读 · 1 评论 -
单链表面试题系列之链表相交问题
***单链表面试题系列之链表相交问题***// 链表相交示意图/* 判断链表是否相交的问题;(前提两个链表都不带环) 我这里有两种思路:方法一: 联系前面讲的带环链表问题,我们可以将链表2 链接到链表1的尾部,如果两个链表相交,则必然会带环;这样的话我们就可以通过前面讲的带环链表找入口点的方法去做了;这里给出链表带原创 2016-06-13 11:05:52 · 2056 阅读 · 0 评论 -
单链表面试题系列之带环链表的入口点
***单链表操作之带环链表的入口点***// 本篇博文阐述如何找到带环链表的入口点,那么,首先有必要阐述一下什么是带环链表?如何判断链表是否带环?带环链表: 即链表中有循环的部分,通俗的说就是没有尾节点!例如:判断链表是否带环:那么知道了什么是带环链表,接下来就是判断链表是否带环的判断问题了,其实也很简单,首先最简单的是判断出不原创 2016-06-12 19:46:18 · 5046 阅读 · 1 评论 -
单链表面试题系列之约瑟夫环
***单链表面试题系列之约瑟夫环***约瑟夫环约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围,从编号为1的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。通常解决这类问题时我们把编号从1~n,最后结果即为原问题的解。关于原创 2016-06-14 00:36:25 · 2327 阅读 · 0 评论 -
寻找迷宫出口<一>
寻找迷宫出口小程序目的: 判断在一个10*10的矩阵中是否可以找到迷宫的出口;PS:程序功能比较单一,还有许多可以改进的地方,比如,可以寻找出口的最优路径,可是我现在没有想出来,所以,在 寻找迷宫出口 我会对迷宫问题做出进一步的完善!---------------------------------------------------------原创 2016-09-10 11:41:42 · 4352 阅读 · 0 评论 -
面试题之两个队列实现一个栈
本篇博客主要阐释内容:面试题: 使用两个队列模拟实现一个栈#include<iostream>#include<queue>//用两个队列实现一个栈 //这道题的目的在于让我们利用队列先进先出的原则实现栈“后进先出”的原则; //所以这里只模仿实现 push,pop,和top三个操作;代码实现原理: 首先得了解队列的特点:先进先出。 既然是两个队列实现一个栈,很明显是让你通过俩个队列互相倒原创 2016-09-13 15:36:06 · 1744 阅读 · 0 评论 -
面试题之用两个栈实现一个队列
本篇博客主要讲述内容:面试题之用两个栈实现一个队列实现思路:用两个栈实现一个队列 类似于两个队列实现一个栈,就主要体现出队列的“先进先出的”原则,即实现push和pop两个操作;主要实现难点思路分析:实现Pop时就稍微有点技巧,如果s2不为空,则直接pops2,为什么呢?很简单,如果s2不为空,说明经过上次pop之后,剩余的s2并没有还给s1,那s2的栈顶元素是不是目前最先进入队列的元素! 比如:原创 2016-09-13 15:46:43 · 1512 阅读 · 0 评论 -
判断出入栈的合法性
本篇博客阐述内容:通过已给的入栈和出栈序列判断是否匹配(即是否合法)这其实是个简单的问题,我们不对有重复的情况做考虑;既然是对出栈顺序进行检测,那很简单,我们让入栈序列入栈 让出栈栈序列去匹配,最后如果两个序列都结束了,那就说明匹配了; 假设入栈序列是{1,2,3,4,5} 出栈序列是{4,5,3,2,1} 那么我们让入栈序列入栈,1先入,看一看第一个出栈的是不是1,不是继续将原创 2016-09-20 08:26:39 · 2379 阅读 · 0 评论 -
【STL】关联式容器
【STL】常用容器总结,带有复习性质的学习更有效率;【STL】 关联式容器复习在复习关联式容器之前,先回忆一下底层的基本数据机构;【树】: 常见的树有二叉树,搜索二叉树,RB_tree, AVL _tree, 哈弗曼树;:下面只做特点的回顾,代码及具体细节有前面专门的博客,后面给出链接;普通的二叉树即一种左右子树的结构,没有什么特别的地方,只是查找的时间复杂度为logn;搜索二叉树的特点则是左子树原创 2017-06-28 11:36:02 · 604 阅读 · 0 评论