
数据结构
shine_zyd_way
这个作者很懒,什么都没留下…
展开
-
<STL>模拟实现Vector
首先,这里用到了类型萃取的知识,代码如下:struct __TrueType{ bool Get() { return true; }};struct __FalseType{ bool Get() { return false; }};template <class _Tp>struct TypeTrai原创 2016-12-10 15:12:34 · 360 阅读 · 0 评论 -
判断一棵树是否是完全二叉树
首先我们要了解什么事完全二叉树。 完全二叉树: 假设一颗二叉树的深度为h,除了第h层以外,其余各层节点的个数全都达到了每层的最大值,即2^(n-1),只有第h层的结点个数小于或者等于2^(h-1),而且节点都连续集中在最左边,这就是完全二叉树,当然当第h层结点达到最大值时,叫做满二叉树,满二叉树是一种特殊的完全二叉树; 如图所示为完全二叉树: 从根结点开始遍历整棵二叉树,(所假设的节点之前为原创 2017-08-02 10:55:04 · 4557 阅读 · 2 评论 -
判断一个节点是否在一棵二叉树中&&判断一颗二叉树是是否是另一颗树的子树
1.判断一个节点是否在一颗二叉树中 首先判断此节点是不是根节点,是根节点的话就返回表示节点在树中,否则递归根节点的左右子树,继续向下寻找bool _IsNode(Node* node,Node* root) { if (root == NULL) return false; //节点位根节点 if (node->_da原创 2017-08-02 09:50:42 · 667 阅读 · 0 评论 -
求一颗二叉树的镜像
下面我给出一棵二叉树和他的镜像,所谓镜像就是一棵树就跟在镜子中显示一样,左右反转,示意图如下: 根节点的左右孩子互换,我们可递归实现:void _MirrorTree(Node* root) { if (root == NULL)//树为空 return; if (root->_left == NULL&&root->_right原创 2017-08-02 08:51:36 · 324 阅读 · 0 评论 -
BloomFilter布隆过滤器
1、简介: BloomFilter是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。 2、应用: 要判断一个元素是否在一个集合中出现,一般情况下就是将这个集合的元素保存下来,然后再到这个集合中一一比较即可,但是如果这个集合中的元素很多的话,不仅需要的内存很大,而且查找起原创 2017-05-31 12:41:25 · 371 阅读 · 0 评论 -
位图
位图法就是bitmap的缩写。所谓bitmap,就是用每一位来存放某种状态,适用于大规模数据,但数据状态又不是很多的情况。通常是用来判断某个数据存不存在的。在STL中有一个bitset容器,其实就是位图法。 举个例子来说明一下: 给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。 40亿个数全部存放大约要用16G的内存空间,这肯定是不现实原创 2017-05-09 21:43:22 · 456 阅读 · 0 评论 -
并查集解决朋友圈问题
首先我们来看一道题笔试题,关于朋友圈的问题: 解决这个问题,我们可以用并查集来解决。 并查集是一种数据结构,用于处理不相交集合中的合并以及查询问题,将N个元素分成一组不相交的集合,开始时我们把每一个元素当成一个集合,然后按规律将集合合并。举例说明,首先定义一个只有10个元素的数组,并将每个元素的值设置为-1假设每个元素在集合中的关系如下: 看上图中的第一个树,0,6,7,8在用一个集合原创 2017-05-31 10:52:06 · 1408 阅读 · 0 评论 -
堆的介绍与应用
堆是一种特殊的树形数据结构,每个结点都有一个值。通常我们所说的堆的数据结构,是指二叉堆。堆数据结构是一种数组对象,它可以被视为一棵完全二叉树结构。 堆结构的二叉存储分为2种形式,分别是最大堆和最小堆,最大堆就是每个父节点的值都大于或等于孩子节点的值,最小堆刚好与之相反,每个父节点的值都小于或等于孩子节点的值。 用以下代码实现一个堆,默认情况下是大堆的形式:#include <iostream>原创 2017-04-10 21:20:30 · 404 阅读 · 0 评论 -
哈夫曼树应用——文件压缩
1.哈夫曼树的简介: 哈夫曼树(Huffman tree),又名最优树,指给定n个权值作为n的叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。若将树中结点赋给一个有着某种含义的数值,则这个数值称为该结点的权。 2.哈夫曼树的构造方式如下: 比如说有一组数,1,4,3原创 2017-04-16 22:57:39 · 4395 阅读 · 3 评论 -
大数据处理问题
首先让我们明确一下内存之间的换算:1> 1Byte=8bit2>1KB=1024Byte=1024*8 bit3>1MB=1024KB=1024*1024Byte=1024*1024*8bit4>1G=1024MB=1024*1024KB=1024*1024*1024Byte(大约一亿个字节)=1024*1024*1024*8bit1)给一个超过100G大小的log f原创 2017-04-29 14:35:35 · 615 阅读 · 0 评论 -
平衡二叉搜索树——红黑树
1.红黑树的简介 红黑树是一棵二叉搜索树,它在每个节点上增加了一个存储位_color来表示节点的颜色,可以是Red或Black。通过对任何一条从根到叶子简单 路径上的颜色来约束,红黑树保证最长路径不超过最短路径的两倍,因而近似于平衡。红黑树没有达到AVL树的高度平衡,换句话说,它的高度,并没有AVL树那么高的要求,但他的应用却更加的广泛,实践中是相当高效的,他可以在O(log2 n)的时间内做查原创 2017-04-12 16:07:57 · 334 阅读 · 0 评论 -
平衡二叉搜索树——AVL树
1.AVL树的定义 AVL树又称为高度平衡的二叉搜索树,是1962年有俄罗斯的数学家G.M.Adel’son-Vel’skii和E.M.Landis提出来的。它能保持二叉树的高度 平衡,尽量降低二叉树的高度,减少树的平均搜索长度。 2.AVL树的性质 (1) 左子树和右子树的高度之差的绝对值不超过1 (2)树中的每个左子树和右子树都是AVL树 (3)每个节点都有一个平衡因子(balanc原创 2017-04-12 11:42:08 · 456 阅读 · 0 评论 -
二叉搜索树
二叉搜索树满足以下性质: 1. 每个节点都有一个作为搜索依据的关键码(key),所有节点的关键码互不相同。 2. 左子树上所有节点的关键码(key)都小于根节点的关键码(key)。 3. 右子树上所有节点的关键码(key)都大于根节点的关键码(key)。 4. 左右子树都是二叉搜索树。二叉搜索树可以进行插入、查找、删除等操作,现在以非递归方法实现下列操作:#pragma once#inclu原创 2017-04-12 10:31:22 · 237 阅读 · 0 评论 -
树&&二叉树
1.树的基本概念 树是一种非线性的数据结构,是由n(n>=0)个有限个数据的元素集合,形状像一颗倒过来的树。就像是这样: 树是由唯一的根和若干互不相交的子树组成的。其中的每一颗子树又是一棵树,也是由唯一根节点和互不相交的子树构成。因此,树的定义是递归的。值得注意的是,当一颗树没有节点时,称这棵树为空树。 2.关于树的一些相关术语 (1)节点:结点包含数据和指向其它节点的指针。 (2)根节点原创 2017-04-12 10:04:42 · 338 阅读 · 0 评论 -
map应用-统计K个最喜欢的水果
一共写出了3种方案,都是用map实现的,方案三利用了[]的重载机制,统计出每个水果出现的次数之后,建堆,进行排序#include <iostream>#include <map>#include <vector>#include <algorithm>#include <string>using namespace std;//统计水果出现的次数struct Max{ boo原创 2017-04-11 16:35:41 · 345 阅读 · 0 评论 -
map,multimap,set,multiset
map和set我们之前介绍过了,现在通过对比说明一下map与multimap,set与multiset首先map的插入操作,不能插入已经存在的键值,若插入已经存在的键值,则插入无效,可应通过相应的办法来解决:void TestMap(){ map<string, string> dict; //[]能修改已存在键值的实值 dict["left"] = "左边"; d原创 2017-04-11 12:56:35 · 339 阅读 · 0 评论 -
STL中的set&&map
首先看一下set与map的介绍:set关联式容器,set作为一个容器也是用来存储同一数据类型的数据类型,并且能从一个数据集合中取出数据,在set中每个元素的值都唯一,而且系统能根据元素的值自动进行排序。应该注意的是set中数元素的值不能直接被改变。C++ STL中标准关联容器set, multiset, map, multimap内部采用的就是一种非常高效的平衡检索二叉树:红黑树,也成为RB树(Re原创 2017-02-16 15:12:56 · 313 阅读 · 0 评论 -
<STL>模拟实现List
STL可分为容器(containers)、迭代器(iterators)、空间配置器(allocator)、配接器(adaptors)、算法(algorithms)、仿函数(functors)六个部分。 1.库中list的使用方法#include <iostream>#include <list>#include <algorithm>#include <stdlib.h>using nam原创 2016-12-10 09:25:53 · 363 阅读 · 0 评论 -
求二叉树中两个节点的最近公共祖先
要求考虑以下三种种情况,给出解决方案,并解决: 1:二叉树是搜索二叉树。2: 二叉树每个节点有parent(三叉链) 3:就是普通二叉树。(尽可能实现时间复杂度为O(N)) 针对第一种情况,是一棵二叉搜索树,我们可以根据数据的大小来判断两个节点的位置,如果在根节点的2侧,则根节点为最近公共祖先,如果在根节点的同侧,继续寻找2个节点的位置TreeNode* PublicLowParent(TreeN原创 2017-08-02 22:25:41 · 877 阅读 · 0 评论