
数据结构
ChaseRaod
这个作者很懒,什么都没留下…
展开
-
由前序遍历和中序遍历重建二叉树
由前序遍历和中序遍历重建二叉树(如:前序序列:1 2 3 4 5 6 - 中序序列:3 2 4 1 6 5)现在我们已知两个序列,前序序列是:1 2 3 4 5 6,中序序列是3 2 4 1 6 5,根据这两个序列重构一个二叉树。思路:前序序列的第一个节点就是就是这棵二叉树的根节点,在中序序列中找到这个根节点,它左边的就是左子树,右边的就是右子树。代码实现:Node* ReBuild(char* p原创 2017-07-30 11:57:03 · 344 阅读 · 0 评论 -
【数据结构】:二叉搜索树
二叉搜索树,也称有序二叉树,排序二叉树,是指一棵空树或者具有下列性质的二叉树:若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;若任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;任意节点的左、右子树也分别为二叉查找树。没有键值相等的节点。因此,搜索二叉树中没有键值冗余的节点,通常可用来去重排序。如图所示就是一棵二叉搜索树: 中序遍历结果为:0 1原创 2017-10-23 21:28:28 · 729 阅读 · 0 评论 -
用二叉搜索树实现简单字典
在上一篇博客中,我们介绍了二叉搜索树的基本概念和结构,那么二叉搜索树有哪些应用呢?我们可以用二叉搜索树的K V模型实现一个简单字典模型。 http://blog.youkuaiyun.com/chaseraod/article/details/78323622#include<iostream>#include<queue>#include<string>using namespace std;temp原创 2017-10-24 10:35:29 · 1315 阅读 · 0 评论 -
线索化二叉树
#include<iostream>using namespace std;#include<assert.h>enum PointTag{ LINK, //子问题 THREAD//线索化};//线索化二叉树的节点template<class T>class ThreadTreeNode{public: T _data; ThreadTreeNode<原创 2017-10-15 17:28:31 · 462 阅读 · 0 评论 -
数据结构:堆(heap)
堆就是一种完全二叉树 堆可分为大堆和小堆 大堆:所有父节点大于子节点。 小堆:所有父节点小于子节点。 由于它是一棵完全二叉树,其元素之间没有空隙,所以我们可以用一个vector来表示它 我们可以根据需要选择创建大堆还是小堆,我们用仿函数实现这个功能//大堆template<class T>struct Greater{ bool operator()(const T& a,原创 2017-09-18 23:59:08 · 674 阅读 · 0 评论 -
map和set的使用以及模拟实现
1,set 我们先来看看STL中set的接口有哪些 set的底层使用红黑树来实现,红黑树是一个不暴露给外界的数据结构,map和set都用它来实现,所以map和set是属于关联式容器。set的特性: 所有的元素都会根据元素的键值自动排序,set的元素不像map那样可以同时拥有实值(value)和键值(key),set元素的键值就是实值,实值就是键值,set不允许两个元素有相同的键值。 我们原创 2017-11-04 23:52:42 · 1136 阅读 · 0 评论 -
并查集解决朋友圈问题
题目:加入已知n个人和m对好友关系(存于数组r),如果两个人是直接或间接的好友(好友的好友的好友………),则认为他们属于同一个朋友圈。请写程序求出这n个人里一共有多少个朋友圈。 例如:n=5,m=3,r={{1,2},{2,3},{4,5}},表示有5个人,1和2是好友,2和3是好友,4和5是好友,则1,2,3属于同一个朋友圈,4和5属于另一个朋友圈。结果为2个朋友圈。这道题目的求解需要用到一种数原创 2017-11-28 20:06:55 · 1675 阅读 · 0 评论 -
【数据结构】:图
概念: 图是另一种非线性结构,由顶点集合(vertex)及顶点间的关系集合组成的一种数据结构。 完全图:在由n个顶点组成的无向图中,若有N(N-1)/2条边,则称为无向完全图。(也就是说任意两个顶点间都有边相连)权重:在一些图中,边具有与之相关的数值,称为权重。(权重可以表示从一个顶点到另一个顶点的距离/花费的代价/所需的时间/次数等)临接顶点:如果(u,v)是图中的一条边,则u和v互为临接原创 2017-11-29 09:13:52 · 1675 阅读 · 0 评论 -
【数据结构】:哈希表(hashtable)
hashtable—-哈希表,也称散列表,是根据关键字直接访问在内存存储位置的数据结构。它通过一个关键值得函数将所需的数据映射到所需的位置来访问数据,这个映射函数叫散列函数,存放记录的数组叫做散列表。构造哈希表的几种方法。 1,直接定址法—-取关键字的某个线性函数为散列地址,Hash(key)=key或Hash(key)=key%p. 2,除留余数法—-取关键值被某个不大于散列表m的数p除后的所原创 2017-11-15 15:28:36 · 721 阅读 · 0 评论 -
将二叉搜索树转化为双向链表
题目:输入一棵二叉树,将该二叉树转换成一个排序的双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。 在二叉搜索树中,左子节点的值总是小于父节点的值,右子节点的值总是大于父节点的值,因此,我们在转换成排序双向链表时,原先指向左子节点的指针调整为指向前一个节点的指针,原先指向右子节点的指针调整为链表中指向后一个节点的指针。 由于要求转换之后的链表时排好序的,我们可以中序遍历树中的每原创 2017-11-15 19:02:37 · 948 阅读 · 0 评论 -
布隆过滤器
Bloom-Filter算法简介 Bloom-Filter,即布隆过滤器,1970年由Bloom中提出。它可以用于检索一个元素是否在一个集合中。 Bloom Filter(BF)是一种空间效率很高的随机数据结构,它利用位数组很简洁地表示一个集合,并能判断一个元素是否属于这个集合。它是一个判断元素是否存在集合的快速的概率算法。Bloom Filter有可能会出现错误判断,但不会漏掉判转载 2017-11-15 20:29:40 · 480 阅读 · 0 评论 -
求最小生成树的克鲁斯卡尔(Kruskal)算法
Kruskal算法是利用贪心算法,每一次选出最小边加入生成树中,并利用并查集判断是否有回路,若有回路,则不能生成树,需要注意的是,这里在比较两条边的大小时 ,要使用权值进行比较。 【贪心算法】是指在问题求解时,总是做出当前看起来最好的选择。也就是说贪心算法做出的不是整体最优的的选择,而是某种意义上的 局部最优解。贪心算法不是对所有的问题都能得到整体最优解。根据上述分析给出代码://最小生成树原创 2017-11-30 18:03:38 · 988 阅读 · 0 评论 -
【数据结构】:红黑树(RB Tree)
红黑树是近似平衡的二叉搜索树。 红黑树的性质: 1,每个节点不是红色就是黑色 2,根节点必须是黑色 3,没有连续的红节点 4,每条路径上黑色节点数目相等红黑树保证最长路径不超过最短路径的两倍。那么,为什么满足以上这些条件就能保证呢? 最短路径一定是节点全黑,要保证每条路径的黑节点数量相等,只能在两个黑节点之间添加红节点,所以最长路径不会超过最短路径的两倍。 红黑树保证效率为log2^N原创 2017-10-29 13:04:34 · 550 阅读 · 0 评论 -
二叉树相关面试题总结
前言:一、为什么要树结构?不像数组、链表是线性的数据结构,树是一种分层的非线性数据结构(1)使用树的一个原因是:我们需要存储有分层关系的信息(比如说文件系统)(2)另外一个是(BST):当把树建成有一定的形式的树可以方便数据的查找(对于平衡的树,查找时间复杂度为O(logn))。(3)同理对于这样一个树(AVL/红黑树):他们的插入和删除的时间复杂度是(O(logn))(4)相对于数组来转载 2017-10-06 16:20:33 · 385 阅读 · 0 评论 -
栈和队列的应用:迷宫问题
我们给出的迷宫如图: 其中,0表示通路,1表示障碍代码实现如下:#include <iostream> using namespace std;#include <assert.h> #include <stack> #include<iomanip> const int N = 10;//定义全局变量迷宫的大小(假设迷宫整体为正方形,行列相等) struct Pos{原创 2017-10-06 14:39:47 · 1240 阅读 · 0 评论 -
求二叉树中两个节点的最近公共祖先
比如:在如图这棵二叉树中,8和9的公共祖先是1,4和5的公共祖先是2,5和2的公共祖先是2。在上述分析中,我们可以得出思路,本题解法可分为两种情况,(1)两个节点在根节点同侧 ,则它们的最近公共祖先可能是其中一个节点,也可能是在到两个节点的公共路径上。 (2)两个节点在根节点的不同侧,则它们的公共祖先只能是根节点。同时,这棵树又分为三种情况: (1)这棵树是搜索树 (2)这棵树中有三叉链 (原创 2017-07-30 12:30:33 · 940 阅读 · 0 评论 -
数据结构:位图
所有比特的编号方法是,从低字节的低位比特位开始,第一个bit为0,最后一个bit为 2^(n-1)。比如说,现在有个数组是这样子的,int a[4],那么 a[0]的比特位为0——31 a[1]的比特位为32——63 a[2]的比特位为64——95 a[3]的比特位为96——127比如说现在我们有100这个数,于是,我们要将第100位置为1,也就是说,我们最少得有100位,100位等于12.原创 2017-08-07 23:49:41 · 535 阅读 · 0 评论 -
关于海量数据处理的各种常用数据结构
随着互联网的兴起,越来越多的内容被放到互联网中,从而导致海量数据处理受到更多人的重视,尤其是在百度、腾讯等这些涉及海量数据的公司。下面我们简单谈一下关于海量数据处理的一些常用数据结构。包括哈希、bitmap、Bloom filter、堆、mapreduce、trie树。(1)哈希 对于哈希,相信大家都不会陌生。其基本原理不再说明,哈希的一个关键点是哈希函数的选择,如何使映射结果更加均衡及冲突减少。转载 2017-08-07 23:50:51 · 1294 阅读 · 0 评论 -
使用迭代器模拟STL list
STL中的 list是一个有头节点的双向循环链表,掌握了lst的list,vector自然不在话下。 STL中使用迭代器(iterator)指向list的节点,并进行增删查改等操作。下面我们模拟实现STL中list的常用操作。 首先,我们要知道,list本身和list的节点是不同的结构,需要分开设计,以下是模拟STL list的节点结构:template<class T>str原创 2017-05-18 01:18:56 · 537 阅读 · 0 评论 -
《STL源码剖析》中的List
vector和数组类似,它拥有一段连续的内存空间,并且起始地址不变,很好的支持了随机存取,但由于是连续空间,所以在中间进行插入、删除等操作时都造成了内存块的拷贝和移动,另外在内存空间不足时还需要重新申请一块大内存来进行内存的拷贝。为了克服这些缺陷,STL定义了另一种容器List,它对于数据插入和删除的时间复杂度均为O(1),而且再内存方面不用频繁的拷贝转移。下面,就一起来看看List的源码实现吧!转载 2017-09-16 14:38:08 · 518 阅读 · 0 评论 -
模拟实现STL中的vector
在之前的文章模拟实现源码剖析了STL中的List,这篇文章模拟STL中的vector. 模拟实现STL中的list 《STL源码剖析》中对vector的描述是这样的: vector的数据安排以及操作方式,与array非常相似。两者的唯一区别在于空间运用的灵活性。array是静态空间,一旦配置了就不能改变。vector是动态空间,随着元素的加入,它的内部机制会自行扩充空间以容纳新元素。 vec原创 2017-09-17 12:01:41 · 408 阅读 · 0 评论 -
栈和队列相关面试题
1,用两个栈实现一个队列templateclass CQuee{public: CQuee() {} ~CQuee() {} void Push(const T& node); T Pop();private: stack stack1; stack stack2;};templatevoid CQuee::Push(const T& node){ st原创 2017-09-26 00:13:57 · 367 阅读 · 0 评论 -
STL常见面试题
红黑树的特性与其在C++ STL中的应用 map 、set、multiset、multimap的底层实现都是红黑树,epoll模型的底层数据结构也是红黑树,linux系统中CFS进程调度算法,也用到红黑树。 红黑树的特性: 根节点是黑色不能有两个连续的红节点空指针是黑色从任意一个结点出发,到后代中空指针的路径上,均包含相同数量的黑色结点。 http://blog.youkuaiyun.com/l转载 2017-09-18 19:30:07 · 683 阅读 · 0 评论 -
优快云的MarkDown编辑器字体颜色、大小
Markdown是一种可以使用普通文本编辑器编写的标记语言,通过类似HTML的标记语法,它可以使普通文本内容具有一定的格式。但是它本身是不支持修改字体、字号与颜色等功能的! 优快云-markdown编辑器是其衍生版本,扩展了Markdown的功能(如表格、脚注、内嵌HTML等等)!对,就是内嵌HTML,接下来要讲的功能就需要使用内嵌HTML的方法来实现。字体、字号与颜色<font face="黑转载 2017-10-27 16:42:43 · 327 阅读 · 0 评论 -
【数据结构】:AVL树
AVL树又称为高度平衡二叉树,高度越低效率越好AVL树的性质: 1,AVL树首先是一棵二叉搜索树 2,左子树和右子树的高度差不超过1 3,左右子树都是AVL树 4,平衡因子控制平衡(右子树的高度-左子树的高度)如下图所示:AVL树的效率:一棵AVL树有N个节点,其高度可以保持在log2^N,插入、删除和查找的时间复杂度也是log2^NAVL树的插入: 在AVL树中插入一个节点时,在右子树插原创 2017-10-28 10:48:26 · 456 阅读 · 0 评论 -
数据结构 二叉树(binarytree)的实现
我们先来介绍一些关于树的概念:节点:结点包含数据和指向其它节点的指针。 根节点:树第一个结点称为根节点。 结点的度:结点拥有的子节点个数。 叶节点:没有子节点的节点(度为0)。 父子节点:一个节点father指向另一个节点child,则child为孩子节点,father为父亲节点 。 兄弟节点:具有相同父节点的节点互为兄弟节点。 节点的祖先:从根节点开始到该节点所经的所有节点都可以称为该原创 2017-06-02 17:53:43 · 902 阅读 · 0 评论 -
浅谈B-树、B+树
B树数据库的索引大多用B+树实现,要了解B+树,我们必须先了解什么是B-树? 首先要清楚的是,B-树不能叫做B减树,否则可就让人笑掉大牙了,所以,后文中我们直接用作B树。 之前我们讲过,二叉搜索树的效率是O(log2^N),那为何数据库中不用二叉搜索树来作为索引呢?此时我们必须考虑到磁盘IO。数据库索引是存储在磁盘上的,当数据量比加大 的时候,索引的大小可能有几个G甚至更多。当我们利用索引查询的原创 2017-11-25 14:00:00 · 551 阅读 · 0 评论