- 1、本文档共4页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
invertedindex-倒排文件.doc
倒排文件实验
试验目的:熟悉倒排表原理与应用特点,用C++实现一个倒排表模型系统。
一、基本原理
一般的文件组织中,是先找记录,再找该记录所含的关键字;而倒排文件中,是先给定次关键字,然后查找含有该次关键字的各个记录,这种文件查找次序正好与一般文件的查找次序相反,因此称为倒排。
倒排文件中的次关键字索引称倒排表。倒排表和主文件一起就构成了倒排文件。
某次活动的学生报名登记表文件,部分信息如下:
SNO name sex age dept 001 张三 男 18 元培 002 李四 女 17 哲学 003 王五 男 19 生物 004 赵六 女 18 元培 设计倒排表如下:
001 003 17 002 元培 001 004 女 002 004 18 001 004 哲学 002 … … 19 003 生物 003 … … … … … … 性别倒排表 年龄倒排表 学院倒排表
根据主文件建立三个倒排表
如找院系为“元培”的所有学生(简单查询),可以在院系倒排表中,取出属性值为“元培”的那一行,所记录。又如年龄在18到20之间的所有学生(范围查询),我们可以把年龄倒排表中18,19和20这三行所对应的三个编号集合做并运算,最后结果就是我们要找的。而找出年龄在19岁以上的所有男生(逻辑查询),这个我们找出19岁以上的所有编号集合,用并运算合在一起,再同性别倒排表中的男生那一行的集合做与运算,最后就能得到正确结果。B+-tree形式。
二、设计与实现
根据主文件内容的更新,倒排表本身也是需要进行插、删、改维护,在数据规模较大时(例如搜索引擎中),也需要对倒排表本身进行组织(建立索引)。此处我们先讨论怎么建立倒排表,然后讨论怎么对倒排表进行有效组织或是建立索引。
倒排表的建立
若主文件不存在,首次向主文件中插入记录时,应创建倒排表文件;也可以针对已有主文件建立倒排表。
关于倒排表文件的划分,可以把各次关键字确立的倒排表存放于同一个文件中,也可以对每个次关键字单独建一个倒排表文件。
例如按照上面示例,主文件中的每条记录对应一个学生的相关信息,主文件记录结构如下
采用定长记录
struct record
{
union
{
unsigned long nextfreeitem;//若该项对应记录被删除,则插入空闲链表头,把下一个空闲项地址记录下
}
unsigned long sno;
char name[12];
bool sex;
unsigned int age;
char dept[8];
}
结构名 描述 大小 头部 空闲项指针 指向最新空闲单元
第一次删除操作之前保留不用 4B 数据区 记录项
记录/下一块空闲单元 sizeof(record)
此处为29B …. 【说明】空闲项指针主要目的一是降低文件重组织代价,每次删除,我们可将已删除项加入空闲列表,插入记录项时可以对这些空闲区加以利用,若插入主文件过程中发现已无空闲记录项可插入,则在文件尾部新开辟空闲区。
假定选定“学院”作为次关键字,在建立主文件过程中,可以同时建立索引表。
内存组织结构
针对“学院”属性列中出现的所有属性值,建立头节点数组,采用链表形式,每次扫描一个记录,按其出现顺序依次从头部插入链表。
template struct headnode typename AtrriType//头结点
{
AtrriType attribute;
struct keynode * next;
} head;
vectorstruct headnode index; //头结点数组
template struct keynode typename KeyType //关键字结点
{
KeyType key;
struct keynode * next;
};
……
磁盘组织形式
如果需要把倒排表文件写入磁盘,则按照头结点数组顺序扫描写入磁盘(这里先用最简单的顺序文件,后面讲介绍利用B+-tree的结构进行更有效的组织),文件结构如下
元培 004 元培 001 哲学 002 生物 003 …… 查找
在倒排表中根据关键字,采用顺序遍历,找到所有包含该关键字的元组号,存储到set容器,利用集合的并交可进行多条件查询。
删除
假设先将004号记录删除,再删除002,那么
偏移 记录号 记录 0 最近删除 +4 001 (……) +29
文档评论(0)