`
文章列表
上接《索引创建(3):DocumentWriter 处理流程二 》   1.3.3 第三车间—— TermsHashPerField & FreqProxTermsWriterPerField   TermsHashPerField和FreqProxTermsWriterPerField负责将token信息(字符串内容termTest,所在文档编号docID,所在文档中的位置position,所在文档中的词频frequence)添加到索引的Hash表结构(postingsHash)中。事实上,这些信息并不是直接存放在Hash表中的,而是存放 ...
(1) 简单选择排序 O(N^2) 一趟简单选择排序的操作为:通过n-i 次关键字间的比较,从n-i+1 个记录中选择出关键字最小的记录,并和第 i (i<=i<=n)个记录交换之。 #include<iostream.h> /*************************************** * 简单选择排序 Simple Selection Sort * ***************************************/ class SimpleSelectSort{ public: //递增排序 ...
1、起泡排序  O(N^2)   起泡排序的过程很简单,首先将第一个关键字和第二个关键字比较,若为逆序,则将两个记录交换。然后再用第二个关键字和第三个关键字比较,以此类推,知道第n-1个关键字和第n个比较完,这样最大 ...
1、基本概念介绍   (1) 如果待排序列中有两个相同的关键字 Ki = Kj,其顺序是Ki在Kj之前。如果经过排序之后,Ki 和 Kj的顺序颠倒了,则说明这个排序方法是不稳定 的。否则则是稳定 排序。   (2) 在内存中就可以完成的排序过程,称为内部排序 。如果待排数据量很大,内存不够容纳全部数据,在排序过程中必须对外存进行访问,则叫做外部排序 。      实际上,由于数据量级别不同。排序的方法会有很大的改变,思考排序效率的角度也不一样。这个专题系列未经特殊注明,都属于内部排序方法。     2、直接插入排序  O(N^2)         将一 ...
上接《索引创建 (2):DocumentWriter处理流程三 》   1.4 索引数据池存储细节   倒排索引(token->posting list)表的数据信息在内存中并不是直接存储在postingsHash中的,而是存放在三大数据缓冲池中——CharBlockPool,ByteBlockPool,IntBlockPool 。 这三个池均都由若干个固定长度的buffer数组构成。DocumentsWriter对它们进行管理和维护(包括分配新的块或者回收不用的块的操作),以达到节省内存和提高效率的作用。   ◆ 三大索引数据池   1 ...
  上接《索引创建(2):DocumentWriter处理流程一 》   1.3.2 第二车间——DocInverterPerField   DocInverterPerField 负责对DocFieldProcessorPerThread对象的Fieldable[]数组的内容建立倒排索引,也就是处理同名字的所有Field。但实际上这个类主要解决的是前期工作,比如分词,统计位置信息等。倒排索引结构的核心的工作由TermsHashPerField和 FreqProxTermsWriterPerField (第三车间 ) 来完成。这两个类将在后面的专题中再提及。 ...
上接《索引创建(1): IndexWriter索引器》   1.3   索引创建过程   DocumentsWriter是由IndexWriter调用来负责对多个document建立索引的核心类,但整个索引过程并不是由一个对象来完成的。而是有一系列的对象组成的处理链(IndexingChain)来完成的(这个过程就像流水线生产汽车)。 下面是DocumentWriter开始建立索引的源代码。 //由IndexWriter调用的方法 boolean addDocument(Document doc, Analyzer analyzer){ return ...
《Lucene索引创建》系列文章将从源代码出发,详细揭示Lucene两大功能之一的索引创建过程。并阐述其中所用到的信息检索的相关技术。由于Lucene是基于多线程的,为了能够简洁明了的说明Lucene索引创建的过程,我们尽量会绕开Lucene多线程机制的处理细节。   1.1 准备工作  我们对content目录中1.txt、2.txt、3.txt这三个英文文档的文件名,路径,内容建立索引。代码如下: //索引文件存放的位置 File indexDir=new File(".\index"); //需要建立索引的文档集合的位置 File doc ...
在检索数据的时候,我们很希望可以检索出数据源的各种信息。就比如检索磁盘文件,可以检索出文件的路径,名字, 内容,修改时间等等。再比如检索图书的书号、书名、作者、出版时间....  Lucene是如何组织这些数据源的不同属性信息呢?   Lucene 数据源组织结构   org.apache.lucene.document包中有两个很重要的类:Document 和 Field。这两个类将杂乱无章的数据形式组织成可以被Lucene使用的内存数据结构。   Field类的作用主要是用来表示当前数据源的各种属性。 数据源的每种属性信息都可以组织 ...
一个优秀的IR system要做好的第一件事就是利用自然语言处理技术(NLP)对文本进行分析。其中分词是最基本的,其性能直接决定IR system的搜索精度和速度。因此,大型Web搜索引擎都有自己的分词工具。   Lucene3.0 的分析器由三个包组成: (1) org.apache.lucene.analysis 是Lucene分析器的基本结构包。包含了分析器最底层的结构(Analyzer、Tokenizer、TokenFilter接口和抽象类),一些简单分析器的具体实现类(如SimpleAnayzer, StopAnalyzer),一些常用的分词器和过滤器(如Lowe ...
该系列文章是《An Introduce to Information Retrieval》Chapter 4 的读书笔记。   对于大规模数据的信息检索,倒排索引的建立其实并没有想象中的那么简单。在实际应用中,倒排索引的建立算法必须考虑到硬件的约束。可以这样说:计算机硬件的参数性能是促动IR系统的设计发展的决定因素。     索引创建(Index construction)   要点:(1) 介绍 BSBI 算法建立大规模数据的倒排索引          (2) 分布式索引的建立算法   4.1 硬件基础介绍   下图是2007 ...
计算机存储设备一般分为两种——内存储器(main memory)和外存储器。 内存存取速度快,但容量小,价格昂贵。而且不能长期保存数据(在不通电情况下数据会消失)。   外存储器——磁盘   磁盘时一种直接存取的存储设备(DASD)。它是以存取时间变化不大为特征的。可以直接存取任何字符组,且容量大、速度较其它外存设备更快。   磁盘的构造   磁盘时一个扁平的圆盘(与电唱机的唱片类似)。盘面 上有许多称为磁道 的圆圈,数据就记录在这些磁道上。磁盘可以是单片的,也可以是由若干盘片 组成的盘组 ,每一盘片上有两个面。如下图6片盘组为例,除去最顶端和最底端的外侧面不存储数据之外,一 ...
题目:有一个江洋大盗,他每次写信都是从一张报纸上剪下单词,再把单词贴在信上。假如某张报纸的单词保存在vector<string>paper 中,而信的单词保存在vector<string>letter 中,写一个算法程序判别该报纸可不可以生成该信?   对比一些方法: 这里假设paper:(m个单词,每个单词平均d个字母),letter:(n个单词,每个单词平均d个字母)。对于中文词语而言,一般2~4个字左右,对于英文单词,d就要大一点,但基本上也是常数。因此d远远小于m,下面比较的时候就不考虑单词中每个字符间的比较了。 (1) 蛮力匹配:     把n中 ...
LIS: 给定一个字符串序列S={x0,x1,x2,...,x(n-1)},找出其中的最长子序列,而且这个序列必须递增存在。   下面给出解决这个问题的几种方法:   (1) 转化为LCS问题         思想: 将原序列S递增排序成序列T,然后利用动态规划算法取得S与T的公共最长子序列。具体算法详见《LCS最长公共子序列 》。         效率: 这个方法排序最好的是时间复杂度是O(n*logn),动态规划解决LCS的时间复杂度是O(n^2)。因此总体时间复杂度是O(n*logn)+O(n^2)=O(n^2) 级别。 (2) 分治 ...
问题描述 :设T是长为n的文本串。描述一个找出T的最长前缀的O(n)时间的方法,该前缀也是T的逆串的一个子串。 (来自《Algorithm Design》(中文版:算法分析与设计) - Chapter9 - 文本处理 - 创新题C-9.12)   分析:既然要在O(n)时间内完成,KMP算法是可以考虑的。根据题目要求我们发现要让T的前缀匹配到T的逆串。那么我们可以把T的逆串作为主串,T作为模式串。对KMP算法做如下修改:   (1) 在匹配逻辑中,主串指针 i 从T逆向开始查找,即i=(T.length-1) ——> 0。模式串指针 j 从T正向开始查找, ...
Global site tag (gtag.js) - Google Analytics