版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1-5确定性跳跃表java实现作者:云南大学软件学院09数字媒体技术 雒森/* * to change this template, choose tools | templates * and open the template in the editor. */package luosen.ds.ds;import java.io.serializable;/* * * author lenovo */*确定性跳跃表链的结点*/public class dsllinknode<s> implements serializable /*跳跃表链结点的层数*/ public int
2、 levelnum=1; /*跳跃表链结点的数据*/ public s data; /*顶部的链*/ public dslnode<s> top; /*构造函数*/ public dsllinknode() data=null; top=null; /*构造函数*/ public dsllinknode(s data,dslnode<s> top) this.data=data; this.top=top; /*构造函数*/ public dsllinknode(s data,dslnode<s> top,int i) this.data=data; thi
3、s.top=top; this.levelnum=i; /*判断节点是否相等*/ override public boolean equals(object o) if(this=o) return true; if(o=null|!(o instanceof dsllinknode) return false; dsllinknode<s> a=(dsllinknode<s>)o; if(data.equals(a.data) return true; return false; override public int hashcode() int hash = 7;
4、 hash = 41 * hash + this.levelnum; hash += 41 * hash + (this.data != null ? this.data.hashcode() : 0); return hash; override public string tostring() return ""+data; /* * to change this template, choose tools | templates * and open the template in the editor. */package luosen.ds.ds;import
5、java.io.serializable;/* * * author lenovo */*确定性跳跃表结点*/public class dslnode<s> implements serializable /*向右的链*/ public dslnode<s> right; /*向下的链*/ public dslnode<s> down; /*确定性跳跃表链的结点*/ public dsllinknode<s> link; /*默认构造函数*/ public dslnode() right=down=null; link=null; /*构造函数*
6、/ public dslnode(dslnode<s> right) this.right=right; this.down=null; link=null; /*构造函数*/ public dslnode(dslnode<s> right,dslnode<s> down) this.right=right; this.down=down; link=null; /*构造函数*/ public dslnode(dslnode<s> right,dslnode<s> down,dslnode<s> top,int i) th
7、is.right=right; this.down=down; link=new dsllinknode<s>(s)new object(),top,i); /*构造函数*/ public dslnode(dslnode<s> right,dslnode<s> down,dsllinknode<s> link) this.right=right; this.down=down; this.link=link; /*判断节点是否相等*/ override public boolean equals(object o) if(this=o) retu
8、rn true; if(o=null|!(o instanceof dslnode) return false; dslnode a=(dslnode)o; if(link=a.link|(link!=null&&link.equals(a.link) return true; return false; override public int hashcode() int hash = 7; hash = 47 * hash + (this.link != null ? this.link.hashcode() : 0); return hash; override publ
9、ic string tostring() if(link!=null) return link.tostring(); else return "" /* * to change this template, choose tools | templates * and open the template in the editor. */package luosen.ds.ds;import luosen.ds.alg.util.createcomparator;import luosen.ds.exceptions.illegalparameterexception;i
10、mport java.io.serializable;import java.util.collection;import java.util.comparator;import java.util.hashset;import java.util.iterator;import java.util.list;import java.util.set;import java.util.logging.level;import java.util.logging.logger;/* * * author 云大09数媒雒森 */*1-5确定性跳跃表*/public class dskiplist&
11、lt;s> implements serializable,iterable<s> /*头结点*/ protected dslnode<s> header; /*尾结点*/ protected dslnode<s> tailer=null; /*底结点*/ protected dslnode<s> bottom=null; /*表中元素的个数*/ protected int size=0; /*比较器*/ protected comparator<s> cp=null; /*构造函数*/ public dskiplist() b
12、ottom=null; tailer=null; header=new dslnode<s>(tailer,bottom,null, (byte)0); /*构造函数*/ public dskiplist(comparator<s> cp) bottom=null; tailer=null; header=new dslnode<s>(tailer,bottom,null,(byte)0); this.cp=cp; /*使用一个dskiplist跳表初始化,目的是将目标复制到当前表中*/ public boolean initial(dskiplist<
13、;s> dsl) if(dsl=null) return false; this.cp=dsl.cp; this.header=dsl.header; this.size=dsl.size; return true; /*返回跳跃表的头*/ public dslnode<s> getheader() return header; /*设置比较器*/ public void setcomparator(comparator<s> cp) this.cp=cp; /*返回比较器*/ public comparator<s> getcomparator()
14、return cp; /*判断表中是否有关键字对应值*/ public boolean contain(s data) return this.search(data)!=null; /*查找数据为data的数据比较关键字封装在data中*/ public s search(s data) if(data=null|size=0) return null; dslnode<s> cur=header; while(cur!=bottom) while(cur.right!=tailer&&pare(cur.right.link.data,data)<0) cu
15、r=cur.right; if(cur.right!=tailer&&pare(cur.right.link.data,data)=0) return cur.right.link.data; cur=cur.down; return null; /*查找数据为data的数据比较关键字封装在data中,若查不到则返回位于它之后的第一个(最底部)结点*/ public dslnode<s> searchstart(s data) if(data=null|size=0) return null; dslnode<s> cur=header; while(c
16、ur!=bottom) while(cur.right!=tailer&&pare(cur.right.link.data,data)<0) cur=cur.right; if(cur.down=bottom|(cur.right!=tailer&& pare(cur.right.link.data,data)=0) cur=cur.right; if(cur!=tailer) while(cur.down!=bottom) cur=cur.down; return cur; cur=cur.down; return null; /*查找数据为data的数
17、据比较关键字封装在data中,若查不到则返回位于它之前的第一个(最底部)结点*/ public dslnode<s> searchend(s data) if(data=null|size=0) return null; dslnode<s> cur=header; while(cur!=bottom) while(cur.right!=tailer&&pare(cur.right.link.data,data)<0) cur=cur.right; if(cur.down=bottom|(cur.right!=tailer&& pa
18、re(cur.right.link.data,data)=0) cur=cur.right; if(cur!=tailer) while(cur.down!=bottom) cur=cur.down; if(cur.right!=tailer&&pare(cur.right.link.data,data)=0) cur=cur.right; return cur; cur=cur.down; return null; /*插入数据data,若已存在返回数据链结点,并不插入数据,你可以在外面修改*/ public dsllinknode<s> insert(s dat
19、a) throws illegalparameterexception if(data=null) return null; if(cp=null) if(comparable.class.isassignablefrom(data.getclass() createcomparator<s> cc =new createcomparator<s>(); cp=cc.getcomparator(); else throw new illegalparameterexception("数据不可以比较,请先设置比较器!"); dslnode<s&g
20、t; cur=header; dslnode<s> newnode=null; while(cur!=bottom) while(cur.right!=tailer&&pare(cur.right.link.data,data)<0) cur=cur.right; if(cur.right!=tailer&&pare(cur.right.link.data,data)=0) newnode=cur.right; break; if(cur.down=bottom) newnode=new dslnode<s>(cur.right,b
21、ottom); newnode.link=new dsllinknode<s>(data,newnode); cur.right=newnode; size+; break; else if(cur.down.right!=tailer&&cur.down.right.right!=tailer &&cur.down.right.right.right!=tailer&& cur.down.right.right.right.right!=tailer&& cur.down.right.right.right.righ
22、t.right!=tailer&& (cur.right=tailer|pare(cur.down.right.right.right .right.right.link.data,cur.right.link.data)<0) cur.right=new dslnode<s>(cur.right,cur.down.right.right.right,cur.down.right.right.right.link); cur.right.link.top=cur.right; cur.right.link.levelnum+; cur=cur.down; if
23、(header.right!=tailer) header.link.levelnum+; header.link.top=header; header=new dslnode<s>(tailer,header,header.link); return newnode.link; /*删除数据data*/ public boolean remove(s data) throws illegalparameterexception if(data=null|size=0) return false; if(cp=null) if(comparable.class.isassignab
24、lefrom(data.getclass() createcomparator<s> cc =new createcomparator<s>(); cp=cc.getcomparator(); else throw new illegalparameterexception("数据不可以比较,请先设置比较器!"); dslnode<s> cur=header; dslnode<s> c=null,cc=null,top=null; while(cur!=bottom) while(cur.right!=tailer&&
25、amp;pare(cur.right.link.data,data)<0) cur=cur.right; if(cur.down=bottom&&cur.right!=tailer&&pare(cur.right.link.data,data)=0) if(size=1) header=new dslnode<s>(tailer,bottom,null,(byte)0); else if(cur.link.levelnum<cur.right.link.levelnum)/比较左右位置结点层数高低,待删除的右边结点 c=cur.right
26、.link.top; top=cur.right.link.top; cur.link.levelnum=cur.right.link.levelnum; while(c.down!=cur.link.top.right) c.link=cur.link; c=c.down; c.link=cur.link; c.down=cur.link.top; c=cur.link.top.right; cc=cur.link.top; while(c!=bottom&&cc!=bottom) cc.right=c.right; cc=cc.down; c=c.down; cur.lin
27、k.top=top; else cc=cur.link.top; while(cc.right!=cur.right.link.top) cc=cc.down; c=cur.right.link.top; while(c!=bottom&&cc!=bottom) cc.right=c.right; cc=cc.down; c=c.down; size-; while(header.down!=bottom&&header.down.right=tailer) header=header.down; header.link.levelnum-; header.li
28、nk.top=header.down; return true; cur=cur.down; return false; /*获取条件一维区间odr之间的元素集合,该函数主要服务于:kdskiplist<s>,用于检索一维区间*/ public collection<s> queryregion(odregion<s> odr) set<s> s=new hashset<s>(); if(odr.isnohascondition) dslnode<s> cur=header; while(cur.down!=bottom)
29、 cur=cur.down; cur=cur.right; while(cur!=tailer) if(cur.link.data instanceof kdslnode) s.addall(kdslnode)cur.link.data).set); else s.add(cur.link.data); cur=cur.right; else dslnode<s> cur=header; dslnode<s> end=null; if(odr.start!=null) cur=this.searchstart(odr.start); else while(cur.dow
30、n!=bottom) cur=cur.down; cur=cur.right; end=this.searchend(odr.end); if(cur=null|(cur!=null&&end!=null&&pare(cur.link.data, end.link.data)>0) return s; while(cur!=end) if(cur.link.data instanceof kdslnode) s.addall(kdslnode)cur.link.data).set); else s.add(cur.link.data); cur=cur.r
31、ight; return s; /*获取条件一维区间odr之间的元素满足多维条件的数据集合,index为odr在qc中的位置, * 该函数主要服务于:mldskiplist<s> 用于检索多位区间*/ public collection queryregion(collection s,odregion<s> odr,int index ,list<odregion<s>> qc,list<comparator<s>> cps) if(s=null) return s; if(odr.isnohascondition) d
32、slnode<s> cur=header; while(cur.down!=bottom) cur=cur.down; cur=cur.right; while(cur!=tailer) if(cur.link.data instanceof mldslnode) mldslnode a=(mldslnode) cur.link.data; if(a.dslsl=null) if(this.ismeetqc(cur.link.data, index, qc.size(), qc, cps,index,true) s.add(a.data); else a.dslsl.queryre
33、gion(s,qc.get(index+1), index+1, qc, cps); else if(this.ismeetqc(cur.link.data, 0, qc.size(), qc, cps,index,true) s.add(cur.link.data); cur=cur.right; else dslnode<s> cur=header; dslnode<s> end=null; if(odr.start!=null) cur=this.searchstart(odr.start); else while(cur.down!=bottom) cur=cu
34、r.down; cur=cur.right; end=this.searchend(odr.end); if(cur=null|(cur!=null&&end!=null&&pare(cur.link.data, end.link.data)>0) return s; while(cur!=end) if(cur.link.data instanceof mldslnode) mldslnode a=(mldslnode) cur.link.data; if(a.dslsl=null) if(this.ismeetqc(cur.link.data, ind
35、ex, qc.size(), qc, cps,index,true) s.add(a.data); else a.dslsl.queryregion(s,qc.get(index+1), index+1, qc, cps); else if(this.ismeetqc(cur.link.data, 0, qc.size(), qc, cps,index,true) s.add(cur.link.data); cur=cur.right; return s; /*检测元素o是否满足多位区间条件qc,start为数组偏移索引,end为结束索引, * isfiltercondition表示是否忽略f
36、ilterindex标识的位置的一维区间条件*/ protected boolean ismeetqc(s o,int start,int end,list<odregion<s>> qc,list<comparator<s>> cps,int filterindex, boolean isfiltercondition) for(int i=start;i<end;i+) if(qc.get(i).isnohascondition|(isfiltercondition&& i=filterindex)|(qc.get(i)
37、.start=null&&qc.get(i).end=null) continue; if(qc.get(i).start!=null&&cps.get(i).compare(o, qc.get(i).start)<0)|(qc.get(i).end!=null&& cps.get(i).compare(o, qc.get(i).end)>0) return false; return true; /*返回表中元素的个数*/ public int size() return size; /*返回确定性跳跃表的层数*/ public i
38、nt getlevel() return header.down = null ? 0:header.down.link.levelnum; /*转化为数组,若表中有0个元素返回null*/ public object toarray() if(size=0) return null; object o=new objectsize; int i=0; dslnode<s> cur=header; while(cur.down!=bottom) cur=cur.down; cur=cur.right; while(cur!=tailer) oi=cur.link.data; cur
39、=cur.right; i+; return o; /*当划分跳表后更新跳表元素个数*/ public void updatesize() int i=0; dslnode<s> cur=header; while(cur.down!=bottom) cur=cur.down; cur=cur.right; while(cur!=tailer) cur=cur.right; i+; size=i; /*返回最小的元素,若不存在返回null*/ public s mindata() if(size=0) return null; dslnode<s> cur=header; while(cur.down!=bottom) cur=cur.down; cur=cur.right; return cur=null ? null:cur.link.data; /*返
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 煤矿机电运输安全培训
- 焊工试卷及答案
- 2025 高中信息技术数据与计算之数据在电商促销规则优化分析中的应用课件
- 2026年装配式装修集成厨卫架空隔墙缩短工期更新维护指南
- 2026年多维触觉传感器1mm空间分辨率0.01N力识别应用
- 中国干细胞市场规模2030年达375亿元预测分析
- 2026年数据完整性评价与定价规范
- 2026年CCUS项目温室气体减排量核算边界流程方法新国标要点
- 2026年无人机作业事故责任划分与快速处理流程指南
- 2026年社区公共服务用房“四同步”原则:规划 建设 验收 移交全流程
- (完整)WORD-版本核心高考高频688词汇(高考高频词汇)
- MCS-51单片机技术项目驱动教程C语言第二版牛军课后参考答案
- 大连周水子国际机场
- 第二章护理伦理学的理论基础课件
- 闽教版小学英语五年级下册校本作业
- 拜仁慕尼黑足球俱乐部
- 晚归检讨书阅读
- 结构化面试答题套路90结构化面试题型及答题套路
- GB/T 24218.1-2009纺织品非织造布试验方法第1部分:单位面积质量的测定
- FZ/T 43008-2012和服绸
- 初中英语名师工作室工作总结
评论
0/150
提交评论