文档结构:

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. 刷题85. Maximal Rectangle

    一.题目说明 题目,85. Maximal Rectangle,计算只包含1的最大矩阵的面积.难度是Hard! 二.我的解答 看到这个题目,我首先想到的是dp,用dp[i][j]表示第i行第j列元素向 ...

  2. JavaScript-状态模式

    状态模式 一个对象有状态变化 每次状态变化都会触发一个逻辑 不能总是用 if...else 来控制 示例:交通信号灯的不同颜色变化 传统的 UML 类图 javascript 中的 UML 类图 cl ...

  3. 「Kafka」Kafka中offset偏移量提交

    在消费Kafka中分区的数据时,我们需要跟踪哪些消息是读取过的.哪些是没有读取过的.这是读取消息不丢失的关键所在. Kafka是通过offset顺序读取事件的.如果一个消费者退出,再重启的时候,它知道 ...

  4. 万科A顺利出局,布局一心堂

    万科的这两日的走势还不错,今日冲高回落,顺利出局. 那么有选中了一只 股票    一心堂 资金量W    12 建仓价格    22.2 加仓系数    1.5 加仓间隔    1.50% 总盈利比  ...

  5. 史上最全的Java高级技术点,全是Java高级进阶技术,几乎包含了Java后端的所有知识点

    史上最全的Java高级技术点,全是Java高级进阶技术,几乎包含了Java后端的所有知识点 1

  6. 【学习笔记】B站-2019-NLP(自然语言处理)之 BERT 课程 -- 相关课程笔记

    BERT 课程笔记 1. 传统方案遇到的问题 BERT的核心在于Transformer,Transformer就类似seq2seq网络输入输出之间的网络结构. 传统的RNN网络:最大的问题,因为不能并 ...

  7. 在腾讯云上配置.NetCoreWeb

    1.购买服务器 2.远程登录(账号密码在上图铃铛里的消息里) 3.安装iis 3.安装.NetCore相关 下载最新版本.NET Core Windows Server Hosting https:/ ...

  8. PAT甲级代码仓库

    大道至简,知易行难.希望能够坚持刷题. PAT甲级真题题库,附上我的代码. Label Title Score Code Level 1001 A+B Format 20 1001 * 1002 A+ ...

  9. eclipse 项目资源与 java 编译器级别不致总是;说明资源路径位置类型Java编译器级别不匹配t

    问题:Description Resource Path Location Type Java compiler level does not match t 今天在自己项目中整合HBase API的 ...

  10. CSS相对定位与绝对定位

    1.相对定位 Position : relative ; 特点: 1 如果没有定位偏移量,对元素本身没有任何影响: 2 不使元素脱离文档流,空间是会被保留: 3 不影响其他元素布局: 4 left.t ...