bitmap、Trie、数据库索引、倒排索引、外排序、Mapreduce

Bitmap

问题给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中?
方案1:用位图/Bitmap的方法,申请512M的内存,一个bit位代表一个unsigned int值。读入40亿个数,设置相应的bit位,读入要查询的数,查看相应bit位是否为1,为1表示存在,为0表示不存在。

还可以扩展成2-Bitmap.

Trie树

问题:有10个文件,每个文件1G,每个文件的每一行都存放的是用户的query,每个文件的query都可能重复。要你按照query的频度排序。

方案:其解决方法是:用trie树统计每个词出现的次数,时间复杂度是O(n*le)(le表示单词的平准长度),即所有字符的总长度。(Trie一次插入的时间是其长度,一次查找时间是树的高度)

也可以用来字符串去重、统计top K.

数据库索引

见另一篇 数据库索引

倒排索引(Inverted index)

适用范围:搜索引擎,关键字查询

基本原理及要点:为何叫倒排索引?一种索引方法,用来查找一个单词出现在哪些文档的一种映射。

以英文为例,下面是要被索引的文本:

T0 = "it is what it is"
T1 = "what is it"
T2 = "it is a banana"
我们就能得到下面的反向文件索引:
"a": {2}
"banana": {2}
"is": {0, 1, 2}
"it": {0, 1, 2}
"what": {0, 1}
如果要查找“what is it”,就是求"what","is"和"it"对应集合的交集。

外排序

问题:如何给磁盘文件排序

描述:给定一个文件,里面最多含有n个不重复的正整数(也就是说可能含有少于n个不重复正整数),且其中每个数都小于等于n,n=10^7。

输出:得到按从小到大升序排列的包含所有输入的整数的列表。
条件:最多有大约1MB的内存空间可用,但磁盘空间足够。且要求运行时间在5分钟以下,10秒为最佳结果。

方案一:外排序

外排序的一个例子是外归并排序(External merge sort),它读入一些能放在内存内的数据量,在内存中排序后输出为一个顺串(即是内部数据有序的临时文件),处理完所有的数据后再进行归并。比如,要对900 MB的数据进行排序,但机器上只有100 MB的可用内存时,外归并排序按如下方法操作:

  1. 读入100 MB的数据至内存中,用某种常规方式(如快速排序、堆排序等方法)在内存中完成排序。
  2. 将排序完成的数据写入磁盘。
  3. 重复步骤1和2直到所有的数据都存入了不同的100 MB的块(临时文件)中。在这个例子中,有900 MB数据,单个临时文件大小为100 MB,所以会产生9个临时文件。
  4. 读入每个临时文件(顺串)的前10 MB( = 100 MB / (9块 + 1))的数据放入内存中的输入缓冲区,最后的10 MB作为输出缓冲区。(实践中,将输入缓冲适当调小,而适当增大输出缓冲区能获得更好的效果。)
  5. 执行九路归并算法,将结果输出到输出缓冲区。一旦输出缓冲区满,将缓冲区中的数据写出至目标文件,清空缓冲区。一旦9个输入缓冲区中的一个变空,就从这个缓冲区关联的文件,读入下一个10M数据,除非这个文件已读完。这是“外归并排序”能在主存外完成排序的关键步骤 -- 因为“归并算法”(merge algorithm)对每一个大块只是顺序地做一轮访问(进行归并),每个大块不用完全载入主存。

方案二:位图

10^7需要10^7bit,记录是否出现过(其实就是bool  vis[1e7+5])

此问题用位图的方案分为以下三步进行解决:

  • 第一步,将所有的位都置为0,从而将集合初始化为空。
  • 第二步,通过读入文件中的每个整数来建立集合,将每个对应的位都置为1。
  • 第三步,检验每一位,如果该位为1,就输出对应的整数。

经过以上三步后,产生有序的输出文件。

分布式处理之MapReduce

MapReduce是一种计算模型,简单的说就是将大批量的工作(数据)分解(MAP)执行,然后再将结果合并成最终结果(REDUCE)。这样做的好处是可以在任务被分解后,可以通过大量机器进行并行计算,减少整个操作的时间。但如果你要我再通俗点介绍,那么,说白了,Mapreduce的原理就是一个归并排序。

例如,对于前面提到的倒排索引,

倒排索引:Map函数分析每个文档输出一个(词,文档号)的列表,Reduce函数的输入是一个给定词的所有(词,文档号),排序所有的文档号,输出(词,list(文档号))。所有的输出集合形成一个简单的倒排索引,它以一种简单的算法跟踪词在文档中的位置。

参考链接:

1.

2. 维基百科-外排序

3. CSDN_JULY-MapReduce技术的初步了解与学习

4.

原文地址:https://www.cnblogs.com/lfri/p/12422962.html

时间: 2024-08-30 05:25:31

bitmap、Trie、数据库索引、倒排索引、外排序、Mapreduce的相关文章

数据库索引设计的几个常用算法

参考:http://blog.csdn.net/yangbutao/article/details/8372511 B+.B- Tree(mysql,oracle,mongodb)      主要用在关系数据库的索引中,如oracle,mysql innodb:mongodb中的索引也是B-树实现的:还有HBase中HFile中的DataBlock的索引等等. 动态查找树主要有:二叉查找树(Binary Search Tree),平衡二叉查找树(Balanced Binary Search Tr

Oracle数据库索引

在关系数据库中,索引是一种与表有关的数据库结构,它可以使对应于表的SQL语句执行得更快.索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容. 对于数据库来说,索引是一个必选项,但对于现在的各种大型数据库来说,索引可以大大提高数据库的性能,以至于它变成了数据库不可缺少的一部分. 索引分类: 逻辑分类 single column or concatenated    对一列或多列建所引 unique or nonunique  唯一的和非唯一的所引,也就是对某一列或几列的键值(key

SQL Server和Oracle数据库索引介绍

SQL Server和Oracle数据库索引介绍 1 SQL Server中的索引 索引是与表或视图关联的磁盘上结构,可以加快从表或视图中检索行的速度.索引包含由表或视图中的一列或多列生成的键.这些键存储在一个结构(B 树)中,使 SQL Server 可以快速有效地查找与键值关联的行. 表或视图可以包含以下类型的索引: 聚集索引 聚集索引根据数据行的键值在表或视图中排序和存储这些数据行.索引定义中包含聚集索引列.每个表只能有一个聚集索引,因为数据行本身只能按一个顺序排序. 只有当表包含聚集索引

数据库索引到底是什么,是怎样工作的?

转自:https://blog.csdn.net/weiliangliang111/article/details/51333169 我们通过一个简单的例子来开始教程,解释为什么我们需要数据库索引.假设我们有一个数据库表 Employee, 这个表有三个字段(列)分别是 Employee_Name.Employee_Age 和Employee_Address.假设表Employee 有上千行数据. 现在假设我们要从这个表中查找出所有名字是'Jesus'的雇员信息.我们决定使用下面的查询语句: S

数据库索引(Oracle和MySql)

索引概念 索引是关系数据库中用于存放每一条记录的一种对象,主要目的是加快数据的读取速度和完整性检查.建立索引是一项技术性要求高的工作.一般在数据库设计阶段得与数据库结构一起考虑.应用系统的性能直接与索引的合理直接有关. 一.Oracle索引 1.索引类型 1)非唯一索引(最常用)UonUnique. 2)唯一索引Unique. 3)位图索引Bitmap 4)分区索引Partitioned 5)非分区索引NonPartitioned 6)正常型B树Normal 7)基于函数的索引Function-

优化你的数据库索引

一.二叉查找树 众所周知,二叉查找树是每个结点最多有两个子树的树结构,通常子树被称为左子树或者右子树.二叉查找树的重要知识:对于树中的每一个节点,其左子树任意节点的值均小于该节点,其右子树的任意节点的值均大于该节点.大致结构如下图: 该图为平衡二叉树,即任意节点的左子树和右子树的高度相差不超过1. 二叉查找树的查找用的是二分查找,比如查询结点6,从根节点开始查找,因为6>5,所以从右孩子开始查找,下一步7>6 ,找到7的左孩子,因此定位到6.其时间复杂度为O(logn),查询效率高. 下面讲一

达梦数据库索引实践

达梦数据库索引实践 达梦数据库支持二级索引,聚集索引,唯一索引,函数索引,位图索引,分区索引等. 默认的表是索引组织表,利用rowid创建一个默认的索引,所以我们创建的索引,称为二级索引.建索引的目的是加快表的查询,对数据库做DML操作的时候,数据库会自动维护索引.索引是一棵倒置的树,使用索引,就是对这个索引树进行遍历. 建立索引的规则:经常查询的列.连接条件列.谓词经常出现的列(where).查询是返回表的一小部分数据 不适合创建索引的情况:列上有大量的null.列上的数据有限(例如:性别)

数据库索引总结

一.为什么要创建索引呢(优点)? 这是因为,创建索引可以大大提高系统的性能. 第一,   通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性. 第二,   可以大大加快数据的检索速度,这也是创建索引的最主要的原因. 第三,   可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义. 第四,   在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间. 第五,   通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能. 二.建立方向索引的不利因

Mysql数据库索引

索引(Index)是帮助mysql高效获取数据的数据结构.对于高性能非常关键. 索引的重要性主要体现在数据量非常大的时候.规模小,负载轻的数据库即使没有索引也可以获到好的查询效果 例如: 1 mysql>select first_name from actor where actor_id=5; 改索引列位于actor_id列,因此mysql会使用索引找到actor_id为5的行. 索引有很多种类型,各自有各自的特点.索引实在存储引擎层实现的,而不是服务器层. (1).B-Tree索引 谈论引擎