- 博客(21)
- 资源 (1)
- 收藏
- 关注
原创 B+树&B*树简介
一、B+树B+树是B树的变体,也是一种多路搜索树,它的定义如下:1、根节点要么是叶子结点,要么至少具有两个孩子2、一棵M路的B树M至少大于2,每个非根结点的孩子的个数有[M/2,M]3、所有叶子结点都在同一层4、非根结点的子树指针与关键字的个数是相等的,也就是说孩子的个数与关键字的个数是相等的。5、为所有孩子结点都增加了一个链指针,可以按照关键码排序的次序遍历全部记录。
2016-11-27 19:23:16 915
原创 海量数据排序
排序分为内部排序和外部排序两大类,若要排序的元素很多,整个序列的排序过程不可能在内存中完成,则此类排序就称为外部排序。针对外部排序这种问题,下面我们来介绍一种方法。 由于要排序的数据量很大,不可能一次性加载到内存,所以我们就采取"分而治之"的方法。先将大文件分割成若干的小文件,使得小文件中的数据能够完全加载到内存。然后分别将每个小文件加载到内存并使用快速排序使之有序,将有序的序列再放回到小文
2016-11-27 13:13:24 2176
原创 并查集
在一个有N个元素的集合问题中,我们通常是让每个元素构成一个单元素的集合,然后按一定顺序将属于同一集合的元素进行合并。在此过程中要不断的查询某个元素归属于哪个集合,适合于描述这类问题的抽象数据类型我们称之为并查集。例: 已知有n个人和m对好友关系,并且这些好友关系存储在r里面,如果两个人是直接或间接的好友,则认为他们属于同一个朋友圈。 n=5,m=3,r={{1,2},{2,3},{4
2016-11-26 13:05:08 720
原创 基数排序
基数排序的主要思想: 基数排序又称"桶子法",他从低位开始将待排序的数按照这一位的值放到相应的编号为0到9的桶中。等到低位排完之后得到一个序列,再将这个序列按照次低位的大小进入相应的桶中。以此类推,直到将所有的位都排完之后,这组数就已经有序了。例: 基数排序是一种非比较排序,它的时间复杂度是O(N*digit),其中digit是这组待排序中的最大的数的数量级,它
2016-11-25 23:10:48 870
原创 计数排序
计数排序主要思想: 给定一组要排序的序列,找出这组序列中的最大值,然后开辟一个最大值加1大小的数组,将这个数组里面的元素全部置零,然后用这个数组统计出要排序的序列中各个元素出现的次数。等到统计完成的时候,排序就已经完成了。例: 计数排序是一种非比较的排序方法,它的时间复杂度是O(N+K),空间复杂度是0(K),其中K是要排序的数组的范围。可以看出计数排序是一种以
2016-11-25 20:23:05 673
原创 排序——Merge
归并排序是一种基于分治法的一种排序方法。它将要排序的序列分成两个长度相等的子序列,为每一个子序列进行排序,然后再将子序列合并成一个有序的序列。实现:void _MergeSort(int *a,int begin,int end,int *tmp){ int mid = ((begin^end) >> 1) + (begin&end); if (m
2016-11-23 18:34:18 978
原创 排序——Quick
一、快速排序的过程快速排序: 快速排序是一种划分交换的方法,它采用分治法进行排序。其基本思想是取待排序元素序列中的某个元素作为基准值,按照这个元素的大小,将整个元素序列划分成两个左右两个子序列,使得左子序列的值都比这个元素小,右子序列中的值都比这个元素值要大于或等于,基准元素值则排在这两个序列中间,然后再对这两个子序列进行同样的方法,直到所有元素都排在相应的位置(即序列中只有一个元素或者
2016-11-23 13:12:28 1365
原创 线索化二叉树
线索化二叉树为我们提供了一种不需要递归和借助栈就能遍历一颗二叉树的方法,如果将二叉树写成STL的形式,那么线索化就可以为之提供迭代器,这也是线索化二叉树的最主要的用法。线索化二叉树有三种方式,前序线索化,中序线索化和后序线索化。一般只要掌握前序线索化和中序线索化就可以了。后序线索化遍历的时候要借助于三叉链表或者FindParent(寻找父亲结点的函数)。 将一颗搜索二叉树转换成有序双向链表
2016-11-20 22:26:03 837
原创 二叉树经典面试题
以下二叉树的结点类型如下:templatestruct BinaryTreeNode{ T _data; BinaryTreeNode *_left; BinaryTreeNode *_right; BinaryTreeNode(const T& data = T()) :_data(data) , _left(NULL) , _right(NULL){}};
2016-11-18 20:18:21 2191
原创 排序——Shell
希尔排序又称为缩小增量排序,它是插入排序的一种变形。希尔排序: 设待排序元素有n个,首先取一个整数gap例如:对{ 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 }进行升序排列。具体代码实现:void ShellSort(int *a, int len) //插入排序的变形,通过预排序使得元素大致有序,再通过插入排序使
2016-11-17 13:34:23 1275 1
原创 set与map用法简介
在介绍容器之前,我们先来介绍一下pair,pair是一种模板类型,每个pair可以存储两个值,这两个值的类型可以是任何类型的。它定义在#include 中。可以看到,pair的两个成员分别是first和second。一、set(集合): set是一种key结构,它的元素就是它的键值,set不允许有两个相同的键值,set中的所有元素的键值都会自动被排序。set和
2016-11-13 18:58:37 1084 1
原创 浅析B-树
B树是一种适合与外查找的的搜索树,他是一种平衡的多叉树。在B树的每个结点中包含一组指针recptr[M]指向实际记录的存放地址。key[i]与recptr[i]形成一个索引项,通过key[i]可以找到某个记录的存储地址recptr[i]。M阶的B树具有以下特点:1、根节点要么是叶子结点,要么具有两个孩子。2、非根结点(叶结点除外)都具有[M/2,M]个孩子。3、非根结点都具
2016-11-12 15:15:09 1484
原创 大数据——面试题总结(1)
1、给出一个超过100G的log file,log中存着ip地址,设计算法找到出现次数最多的ip地址?分析: 由于文件超过100G,所以我们必须先对文件进行切分,然后再利用数据结构的知识求解。关键是如何切分效率最高???解决方法: 我们可以使用哈希切分,将同一个ip都分割到同一个文件中,注意同一个ip经过同一个散列函数 一定会进入到同一个文件中,然后再统计每一个
2016-11-09 15:27:52 2903
原创 如何定义一个不能被继承的类
如何定义一个不能被继承的类??? 假设有一个类B,如果把B的构造函数声明为私有的,那么B这个类就不能被继承,但是这也引入了一个问题,不能在类外定义B类型的对象,那要怎么解决这个问题呢???方法1: 我们可以在类内创建一个对象并提供一个静态的接口,返回创建的这个对象。但是如果使用这种方法的话,在定义B的对象的时候感觉不是很完美。方法2:
2016-11-08 21:19:41 3922
原创 如何定义一个只能在栈上生成对象的类
如何定义定义一个只能在栈上生成对象的类??? 这种题主要考的是对C++语法的理解,以及对C++语法的运用。分析: 对象可以在栈上生成也可以由我们在堆上new出来。要想只在栈上生成对象而不能在堆上生成对象在类外是无法完成的,我们必须从类的内部入手。 我们知道类对象的构造是由构造函数完成的,如果我们把构造函数声明为保护的,使得不能在类外
2016-11-08 19:13:11 1048
原创 如何定义一个只能在堆上生成对象的类
如何定义定义一个只能在堆上生成对象的类???这种题主要考的是对C++语法的理解,以及对C++语法的运用。分析: 对象可以在栈上生成也可以由我们在堆上new出来。要想只在堆上生成对象而不能在栈上生成对象在类外是无法完成的,我们必须从类的内部入手。 我们知道类对象的构造是由构造函数完成的,如果我们把构造函数声明为保护的,使得不能在类外调用构造
2016-11-08 19:08:47 1249
原创 BloomFilter(布隆过滤器)
bloomfilter(布隆过滤器): 要判断一个元素是否在一个集合中出现,一般情况下就是将这个集合的元素保存下来,然后再到这个集合中一一比较即可,但是如果这个集合中的元素很多的话,不仅需要的内存很大,而且查找起来也比较慢。 为了提高效率我们可以采用hash表,并且将集合中的元素都映射到bitmap中的一个位上,这样的话就会节省空间和查找的时间。但是由于哈希冲突的原因,我们有可
2016-11-08 14:29:58 1705
原创 BitMap(位图)
1K=1024byte 1M=1024K=1024*1024byte(约100万个字节) 1G=1024M=1024*1024K=1024*1024*1024byte(约10亿个字节) 假设现在有40亿个不重复且无序的无符号整数,现在给你一个整数让你快速判断它是否在这40亿个数里面???(假设现在只有4G的内存) 这道题的解决办法很简单,就是用这个数到这40个数中去
2016-11-08 13:50:56 1454
原创 哈希表实现及解决冲突的方法
哈希表(散列表)通过将关键码映射到表中的某个位置上来存储元素,然后根据关键码来访问元素。 理想的的情况下,一次直接就能从哈希表中找到要搜索的元素。如果在元素的存储位置与它的关键码之间建立一个对应的函数关系式(散列函数),在插入时,依照这个函数所计算的存储位置存放。在搜索时对元素的关键码按照同样的函数计算,找到这个存储位置进行读取,若关键码相同则搜索成功。 通常关键码的集合比
2016-11-04 19:22:21 1806
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人