文档结构:

1、代码结构

2、代码实现

1、代码结构

节点类:

String key 键值 对跳跃表的操作都是根据键值进行的

Int value  实际值

Node  up,down,left,right; 每个节点都有四个方向

String tou;

String wei; 每层链表的头和尾节点

跳跃表类:

Head 头节点

Tail 尾结点

H 层数

Size 元素个数

Random 随机数,用来确定需不需要增加层数 即:掷硬币

findF () 按从小到大的顺序找到应该插入的位置 插入排序法

Add () 添加节点函数,在最底层插入结点后,进行掷硬币来确定是否需要曾增加层数,直到掷硬币不能增加层数为止,增加层数的同事需要把增加之后的节点进行连接。

Find() 根据跳跃表进行查找并打印路线。查找从最上层开始然后找到被查找节点的前个节点小于被查找节点,然后被查找节点的后一个节点大于其被查找节点,则从被查找节点的前一个节点向下走down,然后继续向右查找,直到找到为止。

2、代码实现

  1. package 跳跃表;
  2. import java.util.*;
  3. public class SkipList {
  4. public Node head;   //头节点
  5. public Node tail;   //尾结点
  6. public int h;   //层数
  7. public int size;    //元素个数
  8. public Random rand; //每次的随机数用来确定需不需要增加层数
  9. public SkipList(){
  10. Node p1 = new Node(Node.tou,0);
  11. Node p2 = new Node(Node.wei, 0);
  12. head=p1;
  13. tail=p2;
  14. head.setRight(tail);
  15. tail.setLeft(head);
  16. h=0;
  17. size=0;
  18. rand = new Random();
  19. }
  20. public boolean isEmpty(){
  21. if(size==0){
  22. return true;
  23. }
  24. return false;
  25. }
  26. //找到需要插入位置的前一个节点
  27. public Node findF(String k){
  28. Node temp;
  29. temp=head;
  30. while(true){
  31. while(temp.getRight().key!=Node.wei&&temp.getRight().key.compareTo(k)<=0){
  32. /*
  33. * 当链表最底层不为空的时候,从当前层向尾部方向开始查找,直到查找temp.getRight的下一个值大于 当前k的值为止,此时temp小于或等于当前k的值
  34. *  要插入的位置即为temp之后的位置了
  35. */
  36. temp=temp.getRight();
  37. }
  38. if(temp.getDown()!=null){
  39. temp=temp.getDown();
  40. }else{
  41. break;
  42. }
  43. }
  44. return temp;    //找到节点并返回
  45. }
  46. public int add(String k, int v){
  47. Node temp, temp1;
  48. temp=findF(k);
  49. int i;  //当前层数
  50. if(k.equals(temp.getKey())){
  51. System.out.println("对象属性完全相同无法添加!");
  52. int a=temp.value;
  53. temp.value=v;
  54. return  a;
  55. }
  56. temp1=new Node(k,v);
  57. temp1.setLeft(temp);
  58. temp1.setRight(temp.getRight());
  59. temp.getRight().setLeft(temp1);
  60. temp.setRight(temp1);
  61. i=0;
  62. while(rand.nextDouble()<0.5){    //进行随机,是否需要 在上层添加
  63. if(i>=h){    //若当前层数超出了高度,则需要另建一层
  64. Node p1 ,p2 ;
  65. h=h+1;
  66. p1=new Node(Node.tou,0);
  67. p2=new Node(Node.wei,0);
  68. p1.setRight(p2);
  69. p1.setDown(head);
  70. p2.setLeft(p1);
  71. p2.setDown(tail);
  72. head.setUp(p1);
  73. tail.setUp(p2);
  74. head=p1;
  75. tail=p2;
  76. }
  77. while(temp.getUp() == null){
  78. temp=temp.getLeft();
  79. }
  80. temp=temp.getUp();
  81. Node node=new Node(k,v);
  82. node.setLeft(temp);
  83. node.setRight(temp.getRight());
  84. node.setDown(temp1);
  85. temp.getRight().setLeft(node);
  86. temp.setRight(node);
  87. temp1.setUp(node);
  88. temp1=node;
  89. i=i+1;
  90. }
  91. size=size+1;
  92. return  0;
  93. }
  94. //节点查找
  95. public Node find(String k){
  96. Node temp=head;
  97. Node node;
  98. node=temp;
  99. System.out.println("查找路线"); //用于测试
  100. while(temp!=null){
  101. while(node.getRight().key!=Node.wei&&node.getRight().getKey().compareTo(k)<=0){//&&node.getRight().getValue()!=v
  102. node=node.getRight();
  103. System.out.print("--->"+node.getKey());
  104. }
  105. if(node.getDown()!=null){
  106. node=node.getDown();
  107. System.out.print("--->"+node.getKey());
  108. }else{
  109. if(node.key.equals(k)){//&&node.getRight().value==v
  110. //node.setValue(111111111); //修改
  111. System.out.println("--->"+node.getKey());
  112. System.out.print("--->"+node.getValue());
  113. return node;
  114. }
  115. return null;
  116. }
  117. }
  118. return null;
  119. }
  120. //节点删除
  121. public void delNode(String k){  //调用查找函数,删除最底层的某个节点,并把其节点的左右相连,和链表操作一样,只是其上方若有则都需要调整
  122. Node temp=find(k);
  123. while(temp!=null){
  124. temp.getLeft().setRight(temp.getRight());
  125. temp.getRight().setLeft(temp.getLeft());
  126. temp=temp.getUp();
  127. }
  128. }
  129. public void print(){
  130. Node node;
  131. Node node1=head;
  132. while(node1!=null){
  133. int k=0;
  134. node=node1;
  135. while(node!=null){
  136. System.out.print(node.getKey()+"\t");
  137. k++;
  138. node=node.getRight();
  139. }
  140. System.out.print("\t");
  141. System.out.print("("+k+")");
  142. //System.out.print(node.getKey());
  143. System.out.println();
  144. //node=node1.getDown();
  145. node1=node1.getDown();
  146. }
  147. }
  148. }
  149. class Node{
  150. public String key;
  151. public int value;
  152. public Node up, down,left , right;
  153. public static String tou=new String("--头--");
  154. public static String wei=new String("--尾--");
  155. public Node(String k, int v){
  156. this.key=k;
  157. this.value=v;
  158. up=down=left=right=null;
  159. }
  160. public void setUp(Node up){
  161. this.up=up;
  162. }
  163. public Node getUp(){
  164. return up;
  165. }
  166. public void setDown(Node down){
  167. this.down=down;
  168. }
  169. public Node getDown(){
  170. return down;
  171. }
  172. public void setLeft(Node left){
  173. this.left=left;
  174. }
  175. public Node getLeft(){
  176. return left;
  177. }
  178. public void setRight(Node right){
  179. this.right=right;
  180. }
  181. public Node getRight(){
  182. return right;
  183. }
  184. public void setKey(String k){
  185. this.key=k;
  186. }
  187. public String getKey(){
  188. return key;
  189. }
  190. public void setValue(int v){
  191. this.value=v;
  192. }
  193. public int getValue(){
  194. return value;
  195. }
  196. }
  197. package 跳跃表;
  198. public class Test {
  199. public static void main(String[] args){
  200. SkipList s = new SkipList();
  201. //      s.add("AAA", 122);
  202. int i=0;
  203. for(;i<30;i++){  //随机数字进行测试
  204. s.add(String.valueOf(i), i);
  205. }
  206. s.print();
  207. System.out.println("\n\n----------\n\n\n");
  208. if(s.find("22")!=null){ //查找
  209. System.out.println("\nOK");
  210. }else{//找不到
  211. System.out.println("\nfalse");
  212. }
  213. s.delNode("0"); //删除
  214. s.print();
  215. }
  216. }

跳表的java实现,转载自网络,仅供自己学习使用的更多相关文章

  1. SQLyog试用到期的解决方法(仅供个人学习使用,禁止转载或用于商业盈利)

    作者:EzrealYi 本章链接:https://www.cnblogs.com/ezrealyi/p/12434105.html win+r->输入regedit->进入注册表 在计算机 ...

  2. Java队列工具类(程序仅供练习)

    public class QueueUtils<T> { public int defaultSize; public Object[] data; public int front = ...

  3. MySql提示:The server quit without updating PID file(…)失败之解决办法(来源网络仅供参考)

    1.可能是/usr/local/mysql/data/rekfan.pid文件没有写的权限 解决方法 :给予权限,执行 “chown -R mysql:mysql /var/data” “chmod ...

  4. [转载] 跳表SkipList

    原文: http://www.cnblogs.com/xuqiang/archive/2011/05/22/2053516.html leveldb中memtable的思想本质上是一个skiplist ...

  5. JAVA SkipList 跳表 的原理和使用例子

    跳跃表是一种随机化数据结构,基于并联的链表,其效率可比拟于二叉查找树(对于大多数操作需要O(log n)平均时间),并且对并发算法友好. 关于跳跃表的具体介绍可以参考MIT的公开课:跳跃表 跳跃表的应 ...

  6. skiplist(跳表)的原理及JAVA实现

    前记 最近在看Redis,之间就尝试用sortedSet用在实现排行榜的项目,那么sortedSet底层是什么结构呢? "Redis sorted set的内部使用HashMap和跳跃表(S ...

  7. java面试记录一:跳表、判断二叉树相同、冒泡排序、cookie和session的区别、设计模式(单例、工厂、模板方法、原型、代理、策略)、抽象类与接口的区别

    1.什么是跳表? 跳表实际上就是多层链表 跳表可用在让链表的元素查询接近线性时间 代码结构及java实现参考博客园随笔 2.判断两棵二叉树是否相同?(结构相同,内容相同) 思路:(1)先定义树节点Tr ...

  8. 自己动手实现java数据结构(九) 跳表

    1. 跳表介绍 在之前关于数据结构的博客中已经介绍过两种最基础的数据结构:基于连续内存空间的向量(线性表)和基于链式节点结构的链表. 有序的向量可以通过二分查找以logn对数复杂度完成随机查找,但由于 ...

  9. 跳表(SkipList)设计与实现(Java)

    微信搜一搜「bigsai」关注这个有趣的程序员 文章已收录在 我的Github bigsai-algorithm 欢迎star 前言 跳表是面试常问的一种数据结构,它在很多中间件和语言中得到应用,我们 ...

随机推荐

  1. Nginx之常用基本配置

    上一篇博客我们大概介绍了一下nginx,nginx的架构,nginx编译安装和nginx命令的用法,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/1236680 ...

  2. codewars--js--Happy numbers++无穷大判断

    问题描述: A happy number is a number defined by the following process: starting with any positive intege ...

  3. linux--解决celery消息中间件带来的一系列问题

    启动celery定时任务 1.celery -A OpsManage beat -l info -S django 2.celery -A OpsManage worker -l info 此时消息中 ...

  4. 常见Linux命令学习

    Linux命令学习 命令分类: 文件处理命令 权限管理命令 文件搜索命令 帮助命令 用户管理命令 压缩解压命令 网络命令 关机重启命令 1.文件处理命令 命令格式:命令 [-选项] [参数] 例:ls ...

  5. [MySQL] mysql索引的长度计算和联合索引

    1.所有的索引字段,如果没有设置not null,则需要加一个字节.2.定长字段,int占4个字节.date占3个字节.char(n)占n个字符.3.变长字段,varchar(n),则有n个字符+两个 ...

  6. 利用低代码优化人力资源配置,为软件开发降本提效 ZT

    低代码 是一种主要应用于企业信息化领域的快速开发技术.借助低代码,开发者无需编码即可生成企业应用的常见功能,少量编码能开发出更多扩展功能.有了低代码技术,IT团队甚至业务团队都可以参与到编写应用程序当 ...

  7. JN_0019:CMD命令窗口常用操作

    1,回到根目录下 cd\ 2,

  8. Visual Studio Code中C/C++的环境配置

    Visual Studio Code 的功能十分强大,但是对我这种小白不是很友好,它和其它的集成开发工具不同,Visual Studio Code (以下简称VS)自身其实仅仅是一个编辑器, 是不具备 ...

  9. servlet中使用request.getHeader("referer")获取页面从哪跳转过来的

    问题 servlet中使用request.getHeader("referer")获取页面从哪跳转过来的,利用这个方法可以判断网页是否正常登录.我做了一个javaweb小项目,其中 ...

  10. MySql优化之主从复制

    第一步: 配置节点信息(配置完毕重启mysql) 找到my.cnf配置文件,这个文件在etc目录下使用命令修改my.cnf文件 vi /etc/my.cnf 主节点配置: server-id =55 ...