文档结构:

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. python基础入门之四 —— 列表

    1.格式 [数据1,数据2,数据3,...] 列表可以一次性存多个数据,可以为不同的数据类型 2.下标 从0开始循序向下分配 3.常用函数 查找 index():返回指定数据所在位置下标,不存在就报错 ...

  2. 代理模式-jdk动态代理

    IDB package com.bjpowernode.proxy; /** * 代理类和目标类都必须使用同一个接口. */ public interface IDB { int insert(); ...

  3. SecureCRT的下载、安装( 过程非常详细!!值得查看)

    SecureCRT的下载.安装( 过程非常详细!!值得查看) 简单介绍下SecureCRT 一.SecureCRT的下载 二.SecureCRT的安装 简单介绍下SecureCRT SecureCRT ...

  4. hive中parquet存储格式数据类型timestamp的问题

    当存储格式为parquet 且 字段类型为 timestamp 且 数据用hive执行sql写入. 这样的字段在使用impala读取时会少8小时.建议存储为sequence格式或者将字段类型设置为st ...

  5. Markdown语法,及其在typora中的快捷键,学写博客吧!!!

    前言 Markdown (MD) 是现在最流行的一种文档书写语言格式.平常写笔记,写博客,写计划再好不过了.个人觉得使用很简单,右击鼠标,有你想要的操作. Typora是简洁.操作简单.功能强大.方便 ...

  6. IBM x3250m5安装redhat 6.5 加载raid卡驱动

    原文地址:http://www.i5i6.net/post/118.html 1. 下载对应raid卡驱动 for redhat6.5 x64(如本次x3250 m5 c100阵列卡驱动 lsi_dd ...

  7. php ip转换省市县

    http://www.cz88.net/ip/ http://www.ttlsa.com/php/php_cunzhen-ipdata/ # wget h http://6.scdx3.crsky.c ...

  8. Burp Suite 实战指南--说明书

       burp使用指南 网址:https://t0data.gitbooks.io/burpsuite/content/

  9. LeetCode刷题专题

    1. https://leetcode-cn.com/problems/container-with-most-water/ 思想:左右边界  i,j   向中间收敛 ,左右夹逼 方法一: 一维数组的 ...

  10. 牛客网剑指offer第13题——调整数组顺序使得奇数位于偶数前面

    题目来源:剑指offer 题目: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变 ...