数据结构
文章平均质量分 58
BabysBreath_hl
切骄切燥
展开
-
C++模板实现双向循环链表(有带头结点)
带头结点的双向循环链表,头结点不存储有效数据,有效数据从头结点的下一个节点存储,代码中既实现了完整版的过程,又完成了简单优化。代码如下:#include#includeusing namespace std;templatestruct ListNode{ T _data; ListNode* _next; ListNode* _prev; ListNode(const原创 2017-02-18 21:03:17 · 977 阅读 · 0 评论 -
求链表的差集
题目详情:已知集合A和B的元素分别用不含头结点的单链表存储,函数difference()用于求解集合A与B的差集,并将结果保存在集合A的单链表中。例如,若集合A={5,10,20,15,25,30},集合B={5,15,35,25},完成计算后A={10,20,30}。 链表结点的结构类型定义如下:struct node{ int elem; node* next; node(in原创 2017-07-27 09:26:01 · 933 阅读 · 0 评论 -
二叉搜索树转换为排序双向链表
二叉搜索树转化为排序双向链表。可以使用中序线索化的方法去进行,在这里需要注意的是我们需要一个记录前一个访问节点的结点。二叉搜索树转换前:转换后:思路:如果根节点的左子树存在,则一直去访问左子树,当为空时返回,并将prev结点赋给该节点的左子树,如果prev不为空,则将prev结点的右子树指向该节点,无论prev是否存在,将该节点赋给prev,如果该节点的右子树存在,则继原创 2017-08-01 17:24:56 · 739 阅读 · 0 评论 -
模拟实现一个Stack 要求实现Push(出栈)、Pop(入栈)、Min(返回最小值的操作)的时间复杂度为O(1)
模拟实现Stack,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值的操作)的时间复杂度为O(1)。思路:Min(返回最小值的操作)我们可以实现用一个辅助栈或者辅助数组来实现。用辅助栈来保存最小的值;考虑到数据的多样性,所以用模板来实现。代码实现:#pragma once#includeusing namespace std;#includet原创 2017-07-19 18:13:23 · 948 阅读 · 1 评论 -
AVL树实现与分析
AVL是高度平的二叉搜索树,它能降低二叉树的高度,减少树的平均搜索长度原创 2017-04-27 23:50:04 · 5530 阅读 · 5 评论 -
布隆过滤器
布隆过滤器一、历史背景知识 布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远超过一般的算法,缺点是有一定的误识别率和删除错误。而这个缺点是不可避免的。但是绝对不会出现识别错误的情况出现(即假反例False negatives,如果某个元原创 2017-04-26 15:38:19 · 688 阅读 · 0 评论 -
剑指offer--入栈、出栈正确性的判断
判断元素出栈、 入栈顺序的合法性。 如: 入栈的序列(1,2,3,4,5) , 出栈序列为(4,5,3,2,1) 是合法序列, 入栈的序列(1,2,3,4,5) , 出栈序列为(1,5,3,2,4) 是不合法序列我的解题思路:创建一个辅助栈来模拟入栈与出栈过程,从而判断其入栈、出栈顺序是否合法。定义两个数组In与Out分别存储入栈序列与出栈序列,然后将栈序列的第一个元原创 2017-05-25 00:32:29 · 1381 阅读 · 6 评论 -
完全二叉树的判断
完全二叉树(Complete Binary Tree):若设二叉树的深度为h,除第h层外,其他各层(1~h-1)的节点数都达到最大个数,第h层所有的节点都连续集中在最左边,这就是完全二叉树。完全二叉树由满二叉树而引起来的。对于深度为K的,有n个节点的二叉树,当且仅当每一个节点都与深度为K的满二叉树中编号从1到n的节点一一对应时称之为完全二叉树。注意:满二叉树一定是完全二叉树,但完全二叉原创 2017-05-04 23:51:44 · 4892 阅读 · 0 评论 -
二叉树经典题系列-二叉树的镜像
二叉树的镜像:将一个二叉树的左右子树,调换位置。即下图的形式:递归的思想是:从根节点的左右子树进行交换,然后以根节点的左子树为根节点,而后以根节点的右结点为根节点,进行左右子树交换。遇到空节点或叶节点直接返回。下面求二叉树镜像的函数代码实现:templatevoid MirroTree(TreeNode * root){ if (root == NULL) retur原创 2017-05-24 00:29:18 · 695 阅读 · 0 评论 -
对称矩阵的压缩存储
对称矩阵是一个N*N的方阵A,A中任意元素Aij,当且仅当Aij == Aji(0 压缩存储称矩阵存储时只需要存储上三角/下三角的数据,所以最多存储n(n+1)/2个数据。对称矩阵和压缩存储的对应关系:下三角存储i>=j,SymmetricMatrix[i][j] ==Array[i*(i+1)/2+j] ;读取时,由于上三角上的数据与下三角存在Aij =原创 2017-03-17 09:39:57 · 4450 阅读 · 1 评论 -
堆排序的实现
堆排序(heapsort)是一种比较快速的排序方式,它的时间复杂度为O(nlgn),并且堆排序具有空间原址性,任何时候只需要有限的空间来存储临时数据。我将用c++实现一个堆来简单分析一下。堆排序的基本思想为:1、升序排列,保持大堆;降序排列,保持小堆;2、建立堆之后,将堆顶数据与堆中最后一个数据交换,堆大小减一,然后向下调整;直到堆中只剩下一个有效值;下面我将简单分析一下:第一原创 2017-04-01 22:24:50 · 1008 阅读 · 3 评论 -
迷宫问题求最小路径
迷宫问题求最短路径问题,是相对经典的栈应用问题,我们将每一个通路的坐标使其入栈,当它遇到闭路时在让其出栈,当找到一个路径时,将其保存到另一个最小栈中。(用迭代实现) 下面是问题描述: 在一个地图里面,0代表通路,1代表墙壁,从左边进入,其他方向出去,算一条通路。 问题解决: 最终实现结果: 下面是代码实现:#include<stack>#include<iostream>#in原创 2017-03-10 11:19:20 · 742 阅读 · 1 评论 -
二叉树的遍历算法实现、以及所有简单操作
二叉树的遍历分为先序遍历,中序遍历,后序遍历,层序遍历;先序遍历:根节点->左子树->右子树 递归思想:先打印根节点数据,然后调用函数取根节点左子树的 递归实现:非递归思想:非递归实现:原创 2017-03-19 21:40:32 · 708 阅读 · 0 评论 -
裴波那契数递归与非递归的实现
斐波那契数通过递归实现的时间复杂度是O(2^n),空间复杂度为O(n);【递归效率低】 非递归迭代实现时时间复杂度为O(n),空间复杂度为O(1);也是最优算法。递归实现:int Fib(size_t n){ if (n < 3) { return n-1; } return Fib(n - 1) + Fib(n - 2);}非递归实现:int原创 2017-02-26 11:34:33 · 1777 阅读 · 3 评论 -
用两个栈实现一个队列
栈为后进先出,队列为先进先出 用两个栈实现一个队列。是一个比较经典的问题。看到这个问题,我的第一个解题思路为: 定义两个栈,s1,s2。s1作为入队列栈,s2作为出队列栈; 入队列:每次入队列的时候,将数值压入s1栈中; 出队列:出队列时,将s1中的所有数据,压进s2栈中原创 2017-03-17 18:10:56 · 1305 阅读 · 8 评论 -
二分查找递归非递归实现并分析
二分查找在有序数列的查找过程中算法复杂度低,并且效率很高。因此较为受我们追捧。其实二分查找算法,是一个很经典的算法。但是呢,又容易写错。因为总是考虑不全边界问题。 用非递归简单分析一下,在编写过程中,如果编写的是以下的代码:#include<iostream>#include<assert.h>using namespace std;int binaty_search(int* arr, si原创 2017-02-24 20:21:09 · 1627 阅读 · 0 评论 -
2016年模拟笔试题--微信红包问题
问题描述:春节期间小明使用微信收到很多个红包,非常开心。在查看领取红包记录时发现,某个红包金额出现的次数超过了红包总数的一半。请帮小明找到该红包金额。写出具体算法思路和代码实现,要求算法尽可能高效。给定一个红包的金额数组gifts及它的大小n,请返回所求红包的金额。测试样例:[1,2,3,2,2],5返回:2代码:#include#include#include原创 2017-08-14 15:19:25 · 2269 阅读 · 1 评论