
数据结构
逆风的方向我在飞翔
这个作者很懒,什么都没留下…
展开
-
二叉树前中后序遍历(递归)
中途对于递归总是理不清,后来看了代码和书才想通:递归==递+归:必须要有递归结束条件,可以不是返回值,若调用一个递归的主算法为第0层算法,则从主算法调用递归算法为进入第1层调用,从第i层递归调用本算法为进入第i+1层,反之,退出第i层递归调用,则返回至第i-1层调用,简单讲:就是当第i+1层达到了递归结束条件,就会回到第i层递归(当时一直认为直接执行到第i+1层,就不再返回了。呵呵),为了保证递归调原创 2016-04-26 09:36:20 · 1345 阅读 · 0 评论 -
STL源码——特殊的空间配置器
源代码展示:https://github.com/uagvdu/Memory/blob/STL-MyAllocate/MyAllocator.hSTL标准的空间配置器 就是将new和delete进行了简单的封装,这里不是重点,就懒得说了。而且这个标准的空间配置器也没被进行使用。SGI特殊的空间配置器: 一级配置器的实现: 就是正常的malloc和free,但在此的基础上添加了一个事件处理:即原创 2016-12-14 11:57:55 · 373 阅读 · 0 评论 -
排序算法之快排
希尔排序相当于直接插入排序的升级《插入排序类》,堆排序相当于简单选择排序的升级《选择排序类》,快排则是冒泡排序的升级,同属于交换排序类。 快排定义:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序的目的。 简单的说:先找到该数组的key,然后大于key的放红点的右边,小于key的放另一边。原创 2016-11-24 17:14:24 · 433 阅读 · 0 评论 -
B-Tree
1970年,R.Bayer和E.mccreight提出了一种适合外查找的树,它是一种平衡的多叉树,称为B树。(有些地方写的是B-树,注意不要误读 成”B减树”) 一棵M阶(M>2)的B树,是一棵平衡的M路平衡搜索树,可以是空树或者满足一下性质: 1. 根节点至少有两个孩子 2. 每个非根节点有[M/2 ,M]个孩子 3. 每个非根节点有[ M/2-1,M-1]个关键字,原创 2016-11-14 16:23:37 · 432 阅读 · 0 评论 -
布隆过滤器
如果想判断一个元素是不是在一个集合里,一般想到的是将集合中所有元素保存起来,然后通过比较确定。链表、树、散列表(又叫哈希表,Hash table)等等数据结构都是这种思路。但是随着集合中元素的增加,我们需要的存储空间越来越大。同时检索速度也越来越慢。Bloom Filter 是一种空间效率很高的随机数据结构,Bloom filter 可以看做是对 bit-map 的扩展, 它的原理是:`>**布隆过原创 2016-11-11 00:22:03 · 924 阅读 · 0 评论 -
BitMap的实现
#pragma once #include<iostream>#include<vector>using namespace std;//哈希 -》 位图 -》布隆过滤器//位图:类似于哈希表的直接定址法插入数据,但位图只能用来表示数据的存在状态。//本来由一个或多个字节表示的数,此时将有一个位来表示其 是否存在,,适合于大数据查找某个数的存在状态class BitMap{pub原创 2016-11-11 00:26:11 · 474 阅读 · 0 评论 -
递归实现搜索二叉树《引用的好处》
#include<iostream>using namespace std;template<class K>struct RBinarySearchTreeNode//递归{ RBinarySearchTreeNode<K>* _left; RBinarySearchTreeNode<K>* _right; K _key; RBinarySearchTreeN原创 2016-10-22 11:07:24 · 527 阅读 · 0 评论 -
非递归实现搜索二叉树
#include<iostream>using namespace std;template<class K>struct BinarySearchTreeNode{ BinarySearchTreeNode<K>* _left; BinarySearchTreeNode<K>* _right; K _key; BinarySearchTreeNode(cons原创 2016-10-22 09:10:59 · 325 阅读 · 0 评论 -
一个数组实现两个栈
一个数组实现两个栈用一个数组实现两个栈,有多种方法,但基本思路就下面三种方法,几种算法的实现区别不大,主要在与扩容时的条件, 第一种:以中间向两边压栈: 可以采用两个栈底分别在数组中间,栈顶向两边移动,当两个栈顶任意一个到达数组的两边时,数组扩容。 此种算法有两个扩容条件,二者满足其一便扩容:即只要有一边栈顶到达终端的时候就扩容。 第二种:两边向中间压栈 两个栈的栈底分别在数组的两边,压栈原创 2016-09-17 11:32:56 · 1583 阅读 · 0 评论 -
数据结构之迷宫求通路《回溯法与栈》
关于回溯与栈的最初的迷茫之处:刚开始听完迷宫问题求通路的时候,我就有一个疑问:将文件的内容传递给数组,再进行压栈,这两个(数组与栈空间)明明不是同一块空间,为什么当我释放栈的时候,当前路径的尾节点能够变为上一个节点,从而使得上一个节点成为了新路径的尾节点 ?《希望你们能看懂我说的什么意思,嘿嘿》,如果就这么用文字描述答案虽然能说通但是印象并不会太深刻,所以不说废话了。直接上代码。//Stack.h原创 2016-09-10 14:45:13 · 1251 阅读 · 0 评论 -
稀疏矩阵的压缩存储和转置
稀疏矩阵的特点:零元多,非零元远少于零元,存储数据没什么规律 因此可以采用只存储非零元素的方法来进行压缩存储(为了节省空间)。所以在进行压缩存储的时侯需要存储非零元素值的同时还要存储非零元素在矩阵中的位置,即非零元素所在的行号和列号,也就是在存储某个元素比如aij的值的同时,还需要存储该元素所在的行号i和它的列号j,这样就构成了一个三元组(row,col,value)的线性表。 也可以用原创 2016-04-19 13:16:06 · 761 阅读 · 0 评论 -
堆排序
#pragma once#include<iostream>#include<assert.h>#include<vector>using namespace std;class _Heap{public: _Heap() { } _Heap(int *a,int n) { //建大堆 for(int i = (n-原创 2016-05-12 00:46:30 · 468 阅读 · 0 评论 -
堆的实现
//头文件:景.h#pragma once#include<iostream>#include<assert.h>#include<vector> /* 堆实际上是一棵完全二叉树 对于数组来说它的数据存放位置是随意的,实现堆,实际上就是实现一个具有特殊结构的数组, 目的就是将数组的数据变得有序或者有优先级,一个数组,既可以看作一行原创 2016-05-11 20:44:01 · 421 阅读 · 0 评论 -
pair & make_pair
1 make_pair创建的是一个pair对象。 2 pair是单个数据对的操作,pair是一struct类型,有两个成员变量,通过first,second来访问,用的是“.”访问, 3 make_pair是一个函数,pair是一个类 pair使用例子: make_pair使用例子: 总结: pair: C++标准程序库中凡是“必须返回两个值”的函数, 也都会利用pair对象 。pa原创 2016-12-13 10:14:13 · 571 阅读 · 0 评论