海量数据处理-字典树和倒排索引

Posted xiaoranone

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了海量数据处理-字典树和倒排索引相关的知识,希望对你有一定的参考价值。

海量数据处理-字典树和倒排索引

海量数据处理我们已经提到过分而治之mapreduce,和排序相关的专题,今天我们来看一下之前也有简单介绍过的字典树和倒排索引。

倒排索引

倒排索引是一种索引方法,常用在搜索引擎中,这个数据结构是根据属性值来确定记录的位置。对于一批文档,我们的属性值就是关键字,对应值是包含该属性的文档的ID或者文化的位置。

例如:


T0 = a,b,c
T1 = a,d
T2 = a,b,c,e

构建倒排索引

a: 0,1,2
b: 0,2
c: 0,2
d: 1
e: 2

检索的时候可以根据关键字的交集或者并集进行检索,可以看出,倒排索引就是正向索引的相反。原理其实很简单,可以通过学习或者问题的性质,来发现什么时候使用倒排碎索引,最重要的倒排索引怎么优化,在内存中和文件上如何分配,才能满足快速的检索。倒排索引的构建可以根据自己的业务,决定需要存储什么信息,但是属性值是确定的,对应的集合中可以保留出现的次数等信息。

字典树

字典树,Trie树是一种前缀树,我们之前也有介绍过,一般应用在快速查询中,例如搜索提示,当你输入前半部分,会提示后半部分的内容。字典树用一句话表示就是根据字符串的前缀构成的树结构。
格式定义

template<typename T>
struct TreeNode 
    int flag; // 1,01:表示存在,0:表示不存在
    int count: // 表示这个字符串出现的次数
    struct TreeNode **childs; // 索引的孩子节点
    T value;
;

搜索字典项目的方法为:(来自百度百科)

  1. 从根结点开始一次搜索;
  2. 取得要查找关键词的第一个字母,并根据该字母选择对应的子树并转到该子树继续进行检索;
  3. 在相应的子树上,取得要查找关键词的第二个字母,并进一步选择对应的子树进行检索。
  4. 迭代过程……
  5. 在某个结点处,关键词的所有字母已被取出,则读取附在该结点上的信息,即完成查找。

应用实例

  1. 串的快速检索

    给出N个单词组成的熟词表,以及一篇全用小写英文书写的文章,请你按最早出现的顺序写出所有不在熟词表中的生词。在这道题中,我们可以用数组枚举,用哈希,用字典树,先把熟词建一棵树,然后读入文章进行比较,这种方法效率是比较高的。

  2. “串”排序

    给定N个互不相同的仅由一个单词构成的英文名,让你将他们按字典序从小到大输出
    用字典树进行排序,采用数组的方式创建字典树,这棵树的每个结点的所有儿子很显然地按照其字母大小排序。对这棵树进行先序遍历即可。

  3. 最长公共前缀

    对所有串建立字典树,对于两个串的最长公共前缀的长度即他们所在的结点的公共祖先个数,于是,问题就转化为当时公共祖先问题。

  4. 搜索引擎

    一个搜索引擎执行的目标就是优化查询的速度:找到某个单词在文档中出现的地方。以前,正向索引开发出来用来存储每个文档的单词的列表,接着掉头来开发了一种反向索引。 正向索引的查询往往满足每个文档有序频繁的全文查询和每个单词在校验文档中的验证这样的查询。实际上,时间、内存、处理器等等资源的限制,技术上正向索引是不能实现的。为了替代正向索引的每个文档的单词列表,能列出每个查询的单词所有所在文档的列表的反向索引数据结构开发了出来。随着反向索引的创建,如今的查询能通过立即的单词标示迅速获取结果(经过随机存储)。随机存储也通常被认为快于顺序存储。

总结

这里并没有详细介绍,各个数据结构的原理,而且很多的内容都来自百度百科,海量数据的处理技术的背后是需要用到很多算法技术的,虽然现在我们有很多好的分布式计算构架,搜索引擎框架,但是了解其中原理,会帮助我们走的更远。当然这只是开始,要走的路还很长。

生活如此,问题不大。喵~

以上是关于海量数据处理-字典树和倒排索引的主要内容,如果未能解决你的问题,请参考以下文章

倒排索引

海量数据处理(上)

B-树和B+树的应用:数据搜索和数据库索引

Elasticsearch的TF-IDF算法和倒排索引

转:基于B-树和B+树的使用:数据搜索和数据库索引的详细介绍

手写简版倒排索引(Inverted Index)