- 1、本文档共12页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
基于改进的AVL树的重复键值倒排索引的建立、使用(访问)与维护——以student.txt为例 冯峰2007年5月21日 问题描述及场景分析 对于给定的student.txt文件(一些学生的成绩信息),对其中任意一个关键码(比如id,成绩,姓名等)生成倒排索引,要求能对其中的记录进行各种查询,修改,删除等操作。 同时,尝试能否将算法使用与更加一般的情况。 所用数据结构 //存储学生记录信息的结构体 typedef struct { int ID; //学号 char * name;//姓名 int score1; //成绩 int score2; float ave; }Student; typedef struct Student * PStudent; //每条记录的格式:ID 姓名 成绩1 成绩2 平均分 //用顺序结构存储源文件中的记录信息 struct SeqList { int num; int MAXNUM; Student *element; } typedef struct SeqList * PSeqList; //用平衡二叉排序树记录倒排索引的信息 struct AVLNode; typedef struct AVLNode * PAVLNode; struct AVLNode //平衡二叉排序树的节点 { Student info; //关键码储存在Student结构中(也可略去) int bf; //节点的平衡因子 int position; //此节点对应在顺序结构中的位置 int snum; //与此节点关键码相同的数据的出现次数 int * same; //与此节点含有相同关键码的节点在顺序结构中的位置 }; typedef struct AVLNode * AVLTree; typedef struct AVLTree * PAVLTree; 算法介绍与代价分析 1、由源文件拷贝数据至顺序结构中 2、倒排索引(AVL树)的插入算法 3、倒排索引(AVL树)的删除算法 4、倒排索引的建立算法 5、导出倒排文件的算法 6、访问算法(完全查询、存在查询 、统计查询、逻辑查询 ) 7、修改算法 2、倒排索引(AVL树)的插入算法 int insertElement(PAVLTree ptree, Student a, int n); //n为关键码的代码,例如1为ID,2为姓名等 算法思路: 如果二叉排序树为空,则新节点为根节点,bf=0,position=0,snum=0(根据需要也可以将顺序结构中的节点信息拷贝至Student info中)。 若二叉排序树非空,则将新节点的关键码与根节点的关键码比较,若大于,则比较右子树;若小于,则比较左子树;直至左(右)子树为空或有节点的关键码与新节点的关键码相等。 若左(右)子树为空,则将新节点作为当前节点的左(右)子树,同时改写新节点和其父节点中的position,bf,snum等信息;然后更改其比较路径上各节点的bf信息(平衡因子),若插入破坏了树的平衡性,则调用相应的调整函数对子树进行调整。 调整函数: PAVLNode LL(PAVLNode a, PAVLNode b); PAVLNode RR(PAVLNode a, PAVLNode b); PAVLNode LR(PAVLNode a, PAVLNode b); PAVLNode RL(PAVLNode a, PAVLNode b); 若遇到关键码与之相等的节点,则这个节点的snum++,生成一个same数组(或连接表示),储存新节点在顺序结构中的下标。 代价分析: 时间代价: O(log2 n) 主要是比较关键码消耗的时间代价 空间代价:O(1) 3、倒排索引(AVL树)的删除算法 int deleteElement(PAVLTree ptree, Student a, int n); (与插入算法类似: 查找-删除-调整 此处略去) 4、倒排索引的建立算法 PAVLNode createAVL(PSeqList buffer, int(compare)(Student a, Student b) ); (对buffer中的记录不断进行插入算法) 5、导出倒排文件的算法 PSeqList outSeq (PAVLTree ptree, PSeqList buffer, int n); (中根次序周游,对于重复键值的节点特殊处理) 6、访问算法 根据访问的需要,选择使用AVL树还是生成的倒排文件 AVL树:完全查询、存在查询 、统计查询 倒排文件:逻辑查询 7、修改算法(单个元素
文档评论(0)