数据结构
咸鱼程序员
这个作者很懒,什么都没留下…
展开
-
图的基本操作
1. 图的基本概念图是由顶点集合及顶点间的关系组成的一种数据结构:G = (V, E), 顶点集合V = {x|x属于某个数据对象集}是有穷非空集合; E = {(x,y)|x,y属于V}或者E = {<x, y>|x,y属于V && Path(x, y)}是顶点间关系的有穷集合, 也叫做边的集合。 (x, y)表示x到y的一条双向通路,即(x, y)是无方向的; Pa...原创 2018-05-03 11:47:53 · 5674 阅读 · 0 评论 -
稀疏矩阵的三元组存储和逆置
template<class T>class SparseMatrix{public: template<class T> struct trituple { trituple(int row=0, int col=0, const T&data=T()) :_row(row) , _col(col) , _data(data)...原创 2017-12-01 15:09:15 · 556 阅读 · 0 评论 -
模板参数和模板的模板参数实现栈和队列
#include <iostream>using namespace std;//利用顺序表实现栈#if 0template <class T>class Stack{public: Stack() :_ptr(new T[3]) , _capacity(3) , _size(0) {} Stack(const T*arr, size_t ...原创 2017-11-14 16:56:01 · 253 阅读 · 0 评论 -
插入排序——直接插入排序和shell排序
1. 排序的分类2. 直接插入排序(1)算法思想: 直接插入排序是一种简单的排序算法,将第一个元素看作有序子序列,从第二个元素开始,和前一个元素比较,若小于,将前一个元素向后移,将第二个元素插入到有序子序列中;若大于,直接将第二个元素插入到有序子序列中。按这种过程继续下去,直到完成所有的有序子序列。(2)基本实现:void InsertSort(Data...原创 2018-03-27 20:54:44 · 418 阅读 · 0 评论 -
交换排序——冒泡排序和快速排序
1. 冒泡排序(1)算法思想:将序列中的第一个元素和第二个元素相比较,如前者大于后者,则交换,否则不交换;再将第二个元素和第三个元素比较,若前者大于后者,则交换两个元素的位置,否则不交换,依次进行,直到最后一个元素,经过如此一轮,则n个元素中最大的一个被放在了最后。此后,再进行相同的过程。(2)基本实现:void BubbleSort(DataType* arr, int sz){...原创 2018-03-27 22:09:37 · 235 阅读 · 0 评论 -
选择排序——简单选择排序和堆排序
1. 简单选择排序(1)算法思想:将序列的第一个元素当作最小的元素,和后面的元素一一比较,将最小的元素下标标记出来,和第一个元素进行交换,则一趟下来,第一个元素一定是最小的,直到所有的元素全部排序完成。(2)基本实现:void SelectSort(DataType* arr, int sz){ int i = 0; int j = 0; for (i = 0; i <...原创 2018-03-28 20:56:45 · 265 阅读 · 0 评论 -
开散列法实现哈希桶
上节我们介绍了闭散列法实现哈希表的操作,今天我们来看开散列法实现哈希桶的操作。开散列法(链地址法(开链法)) 开散列法首先对关键码集合用散列函数计算散列地址,具有相同地址的关键码归于同一子集合,每一个子集合称为一个桶,各个桶中的元素通过一个单链表链接起来,各链表的头结点组成 一个向量,因此,向量的元素个数与可能的桶数一致。设元素的关键码为37,25,14,36,49,68,5...原创 2018-04-12 12:13:54 · 384 阅读 · 0 评论 -
哈希的简单实现
在前面的学习中,我们看了静态查找和动态查找,今天我们来看哈希查找。线性表,二叉搜索树,AVL树,红黑树和B树,元素在存储结构中的位置与元素的关键码之间不存在直接的对应关系。在这些数据结构中,查找一个元素需要进行一系列的关键码的比较。查找的效率取决于查找过程中比较的次数。1. 哈希查找的定义 在插入或者查找时,根据元素的关键码,以哈希函数计算出该元素的存储位置并...原创 2018-04-12 12:16:56 · 3248 阅读 · 1 评论 -
海量数据面试题简要分析
1. 哈希切割topK问题给一个超过100G的文件,文件中保存的是IP地址,设计算法找到出现次数最多的IP地址,并找出前topK的IP地址。解决方法:(1)我们可以从文件中拿出一条IP地址,将所有IP地址遍历一遍,和其他IP地址进行比较,统计次数。在这种方式下,时间复杂度是O(n^2); 但是由于文件太大,I/O操作过于频繁,操作效率不高。(2)我们可以利用哈希的思想,将100...原创 2018-04-14 17:16:39 · 193 阅读 · 0 评论 -
一个很有意思的并查集
先来看一个例题:首先在地图上给你若干个城镇,这些城镇都可以看作点,然后告诉你哪些对城镇之间是有道路直接相连的。最后要解决的是整幅图的连通性问题。比如随意给你两个点,让你判断它们是否连通,或者问你整幅图一共有几个连通分支,也就是被分成了几个互相独立的块。像畅通工程这题,问还需要修几条路,实质就是求有几个连通分支。如果是1个连通分支,说明整幅图上的点都连起来了,不用再修路了;如果是2个连通分支,则...转载 2018-04-26 11:11:09 · 244 阅读 · 0 评论 -
二叉树的按行打印及之字形打印
1. 按行打印二叉树分析: 按行打印二叉树,我们能想到的就是层序遍历二叉树。关键是要按行打印出来,我们可以定义两个变量,一个用来保存下一层元素的个数,一个用来表示当前行打印的元素个数。class Solution {public: vector&lt;vector&lt;int&gt; &gt; Print(TreeNode* pRoot) { vector&...原创 2018-07-14 15:33:26 · 808 阅读 · 0 评论 -
链表面试题总结(一)
链表是面试最常问到的代码,虽然每个代码不长,但是逻辑能力和代码能力却能很好的体现出来。 我们就来看一下链表面试题都有什么吧! 1. 比较顺序表和链表的优缺点,说说它们分别在什么场景下使用? 2. 从尾到头打印单链表 3. 删除一个无头单链表的非尾节点(不能遍历链表) 4. 在无头单链表的一个非头节点前插入一个节点 5. 单链表实现约瑟夫环(JosephCircle) 6. 逆置/反转...原创 2018-08-04 15:13:50 · 297 阅读 · 0 评论 -
堆面试题总结
【堆面试题】 1. 实现堆创建,插入及删除 2. 优先级队列 3. 100w个数中找到最大的前K个数 4. 堆排序 【堆面试题解答】 1. 实现堆创建,插入及删除 在实现堆的创建时,我们以大堆为例,大堆的创建需要自上向下调整堆,创建堆的时间复杂度为O(log2 n)。 void AdjustDown(vector&lt;int&gt;&amp; arr,int parent,in...原创 2018-08-09 23:31:41 · 1086 阅读 · 0 评论 -
栈和队列面试题总结
假溢出是什么?怎么解决? 顺序队列因多次入队列和出队列操作后出现的尚有存储空间但不能再进行入队列操作的溢出称作为假 溢出。 顺序队列最大存储空间已经存满而又要求进行入队列操作所引起的溢出称为真溢出。 解决方法 在使用循环队列时判断队空和队满 1 少用一个存储单元 如果少用一个存储空间,则尾队尾指针加1等于队头指针为队列满的判断条件: (rear...原创 2018-08-05 22:38:03 · 338 阅读 · 0 评论 -
链表面试题总结(二)
带头结点的单链表和不带头结点的单链表的区别 (1)从功能上讲,带头节点和不带头节点的单链表实现的功能是一样的,在删除和插入的效率是一样的,都是O(1)。 (2)从操作方面讲,带头节点的比不带头节点的单链表实现简单,一方面是不用改变头指针的指向,另一方面不管是在删除或者插入时,都保持了一致性,可以快速的定位链表中的第一个结点。 (3)如果为了在第一个数据元素前面加入新元素或者删除...原创 2018-08-06 11:55:18 · 155 阅读 · 0 评论 -
二叉树面试题总结
二叉树是除了链表外最重要的数据结构之一,它的面试题也是很常见的,今天可以来总结一下。 1. 前/中/后遍历二叉树(递归&非递归) 2. 层序遍历二叉树 3. 按行层序打印二叉树 4、求二叉树的高度 5、求二叉树中结点的个数 6、求叶子结点的个数 7、求二叉树中第k层结点的个数 8、判断一个节点是否在一棵二叉树中 9、求二叉树中两个结点的最近公共祖先结点 10、判断一棵二...原创 2018-08-07 19:07:00 · 503 阅读 · 0 评论 -
稀疏矩阵的快速逆置和相加
//快速逆置 SparseMatrix<T> FastTransport() { SparseMatrix<T> sm; sm._col = _row; sm._row = _col; sm._invalid = _invalid; //成功逆置后,每行有效元素的个数 int *ptr = new int[_col]; memset(pt...原创 2017-12-01 15:11:49 · 454 阅读 · 0 评论 -
二叉树整理
http://blog.csdn.net/xy010902100449/article/details/46602273转载 2018-02-06 15:24:59 · 139 阅读 · 0 评论 -
图的广度优先遍历和深度优先遍历
给定一个图G和其中任意一个顶点v0,从v0出发,沿着图中各边访问图中的所有顶点,且每个顶 点仅被遍历一次。"遍历"即对结点进行某种操作的意思。1. 广度优先遍历广度优先遍历类似于二叉树的层序遍历,可以利用队列来实现。对于利用邻接表存储的图,我们给定任意一顶点,将与改顶点连接的链表遍历即可,一层一层的遍历。但是要注意可能会出现重复遍历,所以我们要添加标记。广度优先遍历的实现vo...原创 2018-05-04 21:59:10 · 3060 阅读 · 0 评论 -
一级,二级空间配置器
作为STL的六大组件之一——空间配置器,它的作用就是分配和管理空间,为容器包括算法提供生存空间。然而在我们使用STL中的利器在程序的舞台上大放光彩时,往往看不到它的存在,它总是站在舞 台的背后,为我们精彩的演出默默的付出。今天我们就来看下空间配置器。 1. 为什么需要空间配置器呢(1)通常申请的小块内存,容易造成内存碎片,最终造成空间的浪费。(2)当我们用malloc申请空间时,底层会...原创 2018-06-04 18:03:39 · 543 阅读 · 1 评论 -
复杂链表的复制
复杂链表的复制是一个难点,但是也是链表面试题的重点。今天我们就来看下复杂链表的赋值。1. 复杂链表(ComplexList)template<class T>struct ComplexListNode{ T _data; ComplexListNode<T>* pNext; //next指针域 ComplexListNode<T>* p...原创 2018-06-06 11:03:04 · 220 阅读 · 0 评论 -
二叉树中两个结点的最远距离
二叉树是我们熟悉的数据结构之一,它的面试题也有很多,今天我们就来看下二叉树中两个结点的最远距离。分析:第一步: 第二步: 在分析完之后,我们就可以写代码了//方法一:求二叉树的左右子树的高度之和就是最远距离,但是要递归求,然后比较typedef int T;struct...原创 2018-06-22 10:17:07 · 2114 阅读 · 0 评论 -
排序双向链表和二叉树之间的转换
1. 由搜索二叉树转换为排序的双向链表分析(1)搜索二叉树的左子树小于根节点,右子树大于根节点,奠定了排序的基础,而二叉树既有左子树,又有右子树,使双向成为可能的,也就是说,是有可能实现他们之间的转化的。 (2)为了构造链表的双向,我们可以将原先指向左子树的指针调整为链表结点中的pPre(指向前驱结点的指针),将原先指...原创 2018-06-17 23:01:44 · 706 阅读 · 0 评论 -
树中两个结点的最低公共祖先
在进行这个问题之前,我们需要考虑以下几个问题:(1)题目告诉我们是树,但是没有告诉我们是一棵怎样的树。这里的树可以分为三种结构。第一种:普通的二叉树;第二种:结点中含有指向父亲结点的指针;第三种:二叉搜索树。(2)对于不同结构的树,处理的方式是不一样的,时间复杂度也是不一样的,我们需要针对每种结构设计解法。1. 二叉搜索树二叉搜索树的左子树比根节点小,右子树的值比根节点大,我们可以...原创 2018-06-19 12:06:54 · 479 阅读 · 0 评论 -
迭代器失效总结
我们经常使用STL的容器,STL中的容器包括序列式容器,关联式容器。但是在使用某些容器的时候会出现迭代器失效的问题。1. 迭代器失效的容器类型通常数组,链表,树结构会出现迭代器失效。 即vector,list,map(set,mulitimap, mulitiset)。2. vector迭代器失效失效现象 在调用erase函数进行删除某一个元素或者迭代器的时候,当前位置及以后位...原创 2018-07-19 19:48:58 · 352 阅读 · 0 评论 -
B_树的插入
一. B_树的定义 一棵M阶(M>2)的B树,是一棵平衡的M路平衡搜索树,可以是空树或者满足一下性质: 1. 根节点至少有两个孩子。 2. 每个非根节点至少有M/2(上取整)个孩子,至多有M 个孩子。 3. 每个非根节点至少有M/2-1( 上取整)个关键字,至多有M-1个关键字,并且以升序排列 。 4. ke y [i]和ke y[i+1]之间的孩子节点的值介于ke...原创 2018-03-20 20:59:20 · 465 阅读 · 0 评论 -
红黑树的判断
我们要判断一棵二叉树是不是红黑树,最直接的方法就是看二叉树是否满足红黑树的5条性质,这5条性质在上一篇红黑树中提到。bool _IsBRTree(PNode PRoot) { if (PRoot == NULL) return true; if (PRoot->_color == RED) return false; int count = 0;...原创 2018-03-16 09:25:20 · 986 阅读 · 0 评论 -
红黑树
1. 红黑树的概念红黑树是一棵二叉搜索树,它在每一个结点上增加了一个存储位来标记结点的颜色,可以是red 或者 black。2. 红黑树的性质(1)每个结点不是红色就是黑色(2)树的根节点是黑色的(3)没有两个连续的红色结点(4)对于每个结点,从该节点到所有后代叶结点的简单路径上,均包含相同数目的黑色结点。3. 红黑树的插入首先,我们规定新插入的结点是红色。在插入新...原创 2018-03-15 23:30:35 · 167 阅读 · 0 评论 -
AVL平衡二叉树
我们知道,树的高度越小,查找速度越快。因此,希望二叉树的高度足够小。今天我们来看一种特殊类型的二叉搜索树——AVL平衡二叉树。在这种类型的树中,二叉树结构近乎平衡。1. AVL树的定义 AVL树是具有如下特征的二叉搜索树: (1)根的左子树和右子树的高度之差的绝对值不大于1; (2)根的左子树和右子树都是AVL树。2. AVL树的插入(Insert) 要在一棵...原创 2018-03-14 23:30:49 · 165 阅读 · 0 评论 -
二叉排序树
动态查找表是在查找过程中动态生成的,也就是对于给定值key,如果查找表中存在关键字等于key的元素,则查找成功;否则,在查找表中插入关键字等于key的元素。动态查找表有不同的实现方法,接下来介绍三种实现方法。第一种,也就是今天要写的二叉排序树。1. 二叉排序树的定义二叉排序树是一种特别的二叉树,它的具体定义如下:(1)若它的左子树不空,则左子树上所有结点的关键字值均小于它的根节点的...原创 2018-03-12 18:16:45 · 297 阅读 · 0 评论 -
堆的基本操作
1.堆的概念 将所有元素按照完全二叉树的顺序存储方式存储在一维数组中,并且满足任意一根节点的左右子树的关键字的值小于等于根节点的值。堆实际上是一个一维数组,不过是将这个一维数组当成完全二叉树,并且认为其满足完全二叉树的双亲结点的序号和孩子结点序号的关系。2.堆的分类 堆分为大堆和小堆。大堆,即堆顶元素是所有元素中最大的,将完全二叉树沿某条路径遍历,则得到的序列是递减...原创 2018-03-08 12:57:14 · 390 阅读 · 0 评论 -
数据结构之二叉树
众所周知,树是数据结构的重要部分,而二叉树是树中的重要部分,今天就来看下关于二叉树的主要内容。所谓的二叉树,是指树的度不超过二,结点要么为空,要么由根节点和左右子树组成。二叉树是递归定义的,所以可以借助递归思想来解决问题。今天的主要问题如下:一. 二叉树的结点定义 struct BinTreeNode{ BinTreeNode(T data) :_PLeft(NULL) ...原创 2018-02-06 17:04:06 · 166 阅读 · 0 评论