数据结构
文章平均质量分 78
lc_29503203
这个作者很懒,什么都没留下…
展开
-
堆的基本实现及优先级队列问题
堆数据结构是一种数组对象,它可以被视为一棵完全二叉树结构。堆结构的二叉树存储有两种:最大堆:每个父节点的都大于孩子节点;最小堆:每个父节点的都小于孩子节点。下来以大堆为例:1.如何建堆?1>首先我们选取vector来对堆中元素进行存储;2>由于堆数据结构可被视为一棵完全二叉树,我们可以从最后一个非叶子节点起往上调整;但是须得注意,这个首先得满足左右子树都是大堆得情况。3原创 2016-10-12 12:29:05 · 551 阅读 · 0 评论 -
几种常见排序及优化版本
排序算法是很常见的当然也是相当重要的算法之一,排序又分了好几种算法,在不同的场景下我们应该明白如何去选择用哪一种,而这就要综合很多种因素,包括时间,空间复杂度以及所给数据的具体情况,这里就先来介绍一下算法的分类:1.冒泡排序这种排序应该是我们接触最早的,它的思想就是:比较相邻的两个关键字,如果反序则交换,直到没有反序的记录为止。如果我们有n个元素,那么需要进行n-1趟的冒泡原创 2016-11-20 18:20:45 · 419 阅读 · 0 评论 -
二叉树经典面试题
求二叉树中最远的两个节点的距离,对于这样一个题经过画图分析总体来说有一下几种情况:分析:我们可以考虑递归算法,进行后续遍历的同时,将每一个节点左右子树的距离通过传引用的方式将其带回,如果当前节点的左右子树距离大于前一节点的左右子树距离,那么就更新这个distance.代码实现:templatestruct BinaryTreeNode{ Binar原创 2016-11-28 08:58:01 · 988 阅读 · 0 评论 -
简单实现一个固定大小的内存池
1.内存池的引入 (1)内存池顾名思义就是存放内存的池子,直接分配一大块内存存起来,然后慢慢地切出来使用,用完了再还回到池子,后续还能再利用。 (2)如果我们需要申请一块空间,我们一般都会动态开辟一块空间(new或malloc),它们两个的共同点就是在堆上去申请空间,当然也是有一定限制的。如果我们频繁的去申请释放空间,就会造成许多的内存碎片,内存的浪费也就产生了。如果原创 2016-12-07 09:42:51 · 1087 阅读 · 0 评论 -
快速排序的几种方法及其优化
快速排序的整体思想是分治的思想,也就是说首先对一个大区间进行单趟排序,然后将大区间又进行分割,然后再进行单趟排序,直到这个区间剩下单个元素就不再分割了,小区间有序了返到上一层大区间就有序了,也就是递归思想。下面是一个快排的动图:根据以上分析,单趟排序是将复杂问题简单化的关键,下面就来分析一下单趟排序的几种方法:1.左右指针法步骤可分为:(1)选择一个关键字,可通原创 2016-11-27 08:59:06 · 850 阅读 · 0 评论 -
归并排序
归并排序(MergeSort)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。归并排序,它采取分而治之(Divide-and-Conquer)的策略,时间复杂度是O(N*lgN)。归并排序的步骤如下:1. Divide: 把长度为n的输入序列分成两个长度为n/2的原创 2016-11-27 11:32:01 · 349 阅读 · 0 评论 -
合并两条有序链表
有序链表的合并是面试的时候常考的一道链表算法题: 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则(即升序)。 对于这道题目有两种解法:一是非递归形式,二是递归形式。 1.非递归算法,我们解题思路如下: (1)先考虑这几种特殊情况, 如果两条链表相等,我们将返回任意一条即可; 如果一条链表为空,另一条不为空,那么我们返回不为空的那条链表即可;原创 2017-04-27 17:03:47 · 751 阅读 · 0 评论 -
找链表中倒数第k个节点
剑指offer上有道题是这样的:输入一个链表,输出该链表中倒数第K个节点。例如:一个链表有6个节点,1--2--3--4--5--6,找倒数第三个节点就是指向4的那个节点。链表节点定义如下:struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }}原创 2017-05-29 11:54:06 · 514 阅读 · 0 评论 -
二叉搜索树的后序遍历序列
题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。 如下图分析: 代码实现:class Solution {public: bool VerifySquenceOfBST(vector<int> sequence) { //后序遍历 左子树--根结点--右子树原创 2017-06-15 12:09:24 · 479 阅读 · 0 评论 -
求出最喜欢的前k种最喜欢的水果
近几年cvte的面试题中有这样一个问题: 本公司现在要给公司员工发波福利,在员工工作时间会提供大量的水果供员工补充营养。由于水果种类比较多,但是却又不知道哪种水果比较受欢迎,然后公司就让每个员工报告了自己最爱吃的k种水果,并且告知已经将所有员工喜欢吃的水果存储于一个数组中。然后让我们统计出所有水果出现的次数,并且求出大家最喜欢吃的前k种水果。 1.题目分析: (1)它要求统计出所有水果出现的次原创 2017-08-03 11:53:12 · 684 阅读 · 0 评论 -
剖析STL空间配置器
本文将围绕以下几方面逐步对STL空间配置器进行一个剖析1.为什么要有空间配置器,它是用来解决什么问题的?2.STL中标准版本带来什么问题?如何解决的?3.探索STL中的SGI版空间配置器。 (1)一级空间配置器该如何做的? (2)二级空间配置器又是怎样的一个工作流程?1.为什么要有空间配置器,它是用来解决什么问题的?相信熟悉vector的同学可能原创 2017-07-27 10:37:11 · 709 阅读 · 1 评论 -
计数排序
计数排序是一种费比较的排序算法,它的思想其实很简单,就是先开辟一块空间用来存放数据出现的次数,然后就要统计出数据出现的次数,并将其放在对应的位置下标上,最后我们可以根据统计的次数依次还原出来就有序了,如下图分析:代码实现:void CountSort(int* a,int n){ assert(a); int max=a[0]; int min=a[0]; //1.先统计原创 2016-11-27 13:26:19 · 341 阅读 · 0 评论 -
二叉搜索树递归&&非递归的基本实现
学习二叉树之后,发现二叉搜索树其实是很实现的,为什么呢?其实取决于它所具有的性质,下来简单介绍一下它的性质。二叉搜索树的性质:1. 每个节点都有一个作为搜索依据的关键码(key),所有节点的关键码互不相同。 2. 左子树上所有节点的关键码(key)都小于根节点的关键码(key)。3. 右子树上所有节点的关键码(key)都大于根节点的关键码(key)。4. 左右子树都是二叉搜原创 2016-10-21 21:45:03 · 642 阅读 · 0 评论 -
红黑树的基本实现
先前介绍过AVL树,它是一种高度平衡的二叉搜索树,但是它最大的限制是必须满足左子树与右子树高度之差的绝对值不超过1,所以对旋转的要求较高,而红黑树不追求完全平衡,保证最长路径不超过最短路径的2倍即可,相对而言降低了旋转的要求,因此性能就提高了一些,而且它们的插入删除查找的时间复杂度均为O(lgN),所以红黑树在数据结构中运用还是较为广泛的,首先先来了解一下它的性质。1.根节点是黑色的;2.原创 2016-10-28 18:04:21 · 442 阅读 · 0 评论 -
数据结构--一个数组实现两个栈
用一个数组实现两个栈,通常我们会想到以下几种方案:1.奇偶栈,即就是将数组的偶数位置看作一个栈的存储空间,将奇数位置看作另一个栈的存储空间。2.从中间分别向两边展开,即就是将数组的中间位置看作是两个栈的栈底,压栈时栈顶指针分别向两边移动,当任何一边到达数组的起始位置或是数组尾部就开始扩容。3.从两边向中间压栈,就是将数组的起始位置看作是一个栈的栈底,将数组的尾部看作是另原创 2016-10-03 06:17:26 · 3122 阅读 · 0 评论 -
数据结构之时间.空间复杂度分析
在很多数据结构的面试题中看似简单,但是对题目的要求却挺高,主要就体现在复杂度分析方面。复杂度又分为时间复杂度和空间复杂度。1.时间复杂度时间复杂度实际就是函数,函数计算执行的基本操作次数 .在进行时间复杂度分析时需注意: 1)时间复杂度强调的是函数执行的操作次数,这里的函数是指数学里面的函数,而不是C语法里的函数;2)在实际中我们通常情况考量的是算法的最坏情况;3)原创 2016-09-07 22:55:09 · 10676 阅读 · 2 评论 -
用栈实现简单的迷宫游戏
迷宫游戏的实现是运用了栈的“后进先出”的原理,究竟如何实现的呢?下来简单的分析一下。比如:下图是一个小迷宫1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 10 0 0 1 1 1 1 1 1 11 1 0 1 1 1 1 1 1 1 //0---表示通路1 1 0 1 1 1 1 0 0 0 //1----表示墙1 1 0 1 1原创 2016-09-10 16:07:38 · 3031 阅读 · 0 评论 -
实现一个栈,要求push,pop,Min的操作时间复杂度为O(1)
问题:实现一个栈,要求实现Push(入栈),Pop(出栈),Min(返回最小值)的操作时间复杂度为O(1).分析:刚看到这个题的时候,用栈来实现Min(返回最小值)的操作,我的第一反应就是必须把栈中的最小值放在top()位 置,然后根据栈的“后进先出”的道理来实现,但是问题接着就来了。首先,根据元素的不断push,最小值很有可能在原创 2016-09-11 22:33:10 · 4208 阅读 · 0 评论 -
广义表的简单实现
广义表是一种允许表中有表的非线性结构,在实现广义表的基本操作时需注意以下几个问题:1.就如下图来看,Head为表的头结点,它存储着指向广义表或其子表的地址;Value是广义表的一个值节点;那么Sub的作用是什么呢?又为什么不把子表的Head直接放入Sub里呢?原因在于,我们可以把Sub当成一个子表项,它和value是同一层次的(都可看成是第一层的),通过它的next找到下一个值节点或另一个表项原创 2016-09-24 14:31:14 · 923 阅读 · 0 评论 -
堆排序
升序建大堆#include#includeusing namespace std;void AdjustDown(int *a, size_t root, size_t size){ assert(a); size_t parent = root; size_t child = parent * 2 + 1; while (child < size) { if (ch原创 2016-10-14 17:20:53 · 486 阅读 · 0 评论 -
huffman算法实现文件的压缩与解压
本文采用哈夫曼编码的方式进行文件的压缩和解压缩,主要原理是通过huffman编码来表示字符,出现次数多的编码短,出现次数少的编码长,这样整体而言,所需的总的bit位是减少的。但是当大部分字符出现的频率都差不多时,huffman压缩的压缩率就会很低。一.利用哈夫曼编码压缩文件,主要分为两部分:1.压缩文件主要步骤:(1).统计出文件中各个字符出现的次数;(2)原创 2016-11-05 11:04:28 · 10830 阅读 · 1 评论 -
AVL树的基本实现
在学习二叉树后我们知道它存在缺陷,就是当我们插入一些有序节点时就基本退化为链表的形式,达不到我们想要的结果,因此,在这里为了解决这个问题就引出了平衡二叉树(AVL)的概念。AVL树又称为高度平衡的二叉搜索树,它能保持二叉树的高度平衡,尽量降低二叉树的高度,减少树的平均搜索长度,那它具有哪些性质呢?1. 左子树和右子树的高度之差的绝对值不超过1;2. 树中的每原创 2016-10-26 09:10:13 · 958 阅读 · 0 评论 -
数据结构--两个栈实现一个队列
用两个栈实现一个队列,首先我们先明确栈和队列的特点,栈是“后进先出”,而队列是“先进先出”。下来通过图来分析一下push,pop的过程:#include#include#includeusing namespace std;templateclass DoubleStack_Queue{public: void Push(const T& d); voi原创 2016-10-01 17:29:39 · 742 阅读 · 0 评论 -
数据结构--两个队列实现一个栈
两个队列实现一个栈,首先我们必须清楚以下几点:栈的特点是“后进先出”,而队列的特点是“先进先出”;在插入元素时栈和队列都是在尾部进行的,但是在删除元素时,队列是从对头开始删除的,栈是从栈顶开始的。解决这个问题提供两种方法:1.队列q1,q2,用q1作为维护栈的主队列,q2作为辅助.入栈,将元素直接插入到q1中;出栈:(1)将q1中(除队尾元素外)的所有元素依次弹出并插入到q原创 2016-10-01 21:16:29 · 996 阅读 · 0 评论 -
数据结构--判断栈的弹出序列是否合法
题目是这样描述的:输入两个整数序列,第一个序列表示栈的压入序列,请判断第二个序列是否为该栈的弹出序列,假设压入栈的所有数字均不相等。例如:入栈序列,1 2 3 4 5,判断4 5 3 2 1以及4 3 5 1 2是不是其弹出序列. 解决这个问题很直观的方法是建立一个辅助栈,把输入的第一个序列中的数字一次压入该辅助栈中,并按照第二个序列的顺序依次从该栈中弹出数字。下面通过图来详细分析一下具体原创 2016-10-02 09:23:38 · 1589 阅读 · 0 评论 -
哈希表的构造之线性探测法
散列表,它是基于高速存取的角度设计的,也是一种典型的“空间换时间”的做法。顾名思义,该数据结构能够理解为一个线性表,可是当中的元素不是紧密排列的,而是可能存在空隙。散列表(Hash table,也叫哈希表),是依据关键码值(Key value)而直接进行訪问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来訪问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列原创 2016-11-08 12:24:50 · 6590 阅读 · 0 评论 -
哈希表的构造之开链法
前面总体介绍了一下有关哈希算法(哈希表如何构造,怎样减少哈希冲突等):http://blog.csdn.net/qq_29503203/article/details/52992810今天主要来实现一下哈希表的构造之开链法,这种方法可以将负载因子延伸到1,即_size==_tables.size(),这样对空间的利用率提高了许多,首先来看一下它的原理:下原创 2016-11-08 13:16:51 · 684 阅读 · 0 评论 -
二叉树的递归&非递归遍历及其他函数功能的实现
二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的。对于二叉树,有前序,中序,后序以及层序四种遍历方法。因为树的定义本身就是递归定义,所以前三种遍历方式采用递归不仅容易理解而且代码很简洁。而对于树的遍历若采用非递归的方法,就要采用栈去模拟实现。层序的实现则要用到队列里的“先进先出”的原理来实现。先来介绍一下要实现的函数:templateclass Binary原创 2016-09-27 23:09:46 · 403 阅读 · 0 评论