返回顶部
首页 > 资讯 > 精选 >Java实现跳跃表(skiplist)的简单实例
  • 123
分享到

Java实现跳跃表(skiplist)的简单实例

java跳跃表skiplist 2023-05-31 03:05:27 123人浏览 泡泡鱼
摘要

跳跃链表是一种随机化数据结构,基于并联的链表,其效率可比拟于二叉查找树(对于大多数操作需要O(log n)平均时间),并且对并发算法友好。基本上,跳跃列表是对有序的链表增加上附加的前进链接,增加是以随机化的方式进行的,所以在列表中的查找可以

跳跃链表是一种随机化数据结构,基于并联的链表,其效率可比拟于二叉查找树(对于大多数操作需要O(log n)平均时间),并且对并发算法友好。

基本上,跳跃列表是对有序的链表增加上附加的前进链接,增加是以随机化的方式进行的,所以在列表中的查找可以快速的跳过部分列表(因此得名)。所有操作都以对数随机化的时间进行。

实现原理:

跳跃表的结构是:假如底层有10个节点, 那么底层的上一层理论上就有5个节点,再上一层理论上就有2个或3个节点,再上一层理论上就有1个节点。所以从这里可以看出每一层的节点个数为其下一层的1/2个元素,以此类推。从这里我们可以看到,从插入时我们只要保证上一层的元素个数为下一层元素个数的1/2,我们的跳跃表就能成为理想的跳跃表。那么怎么才能保证我们插入时上层元素个数是下层元素个数的1/2呢,?很简单 抛硬币就可以解决了,假设元素X要插入跳跃表,最底层是肯定要插入X的,那么次低层要不要插入呢,我们希望上层元素个数是下层的1/2,那么我们有1/2的概率要插入到次低层,这样就来抛硬币吧,正面就插入,反面就不插入,次次底层相对于次低层,我们还是有1/2的概率插入,那么就继续抛硬币吧 , 以此类推元,素X插入第n层的概率是(1/2)的n次。这样,我们能在跳跃表中插入一个元素了。

第一次知道跳表这种数据结构的时间大概是在一年前(说这句话时候可能就被无数同胞鄙视了),但自己却不知道如何实现。当时印象最深的就是一篇跳跃表(Skip List)-实现(Java)的文章,因为这篇文章中的Skip List的实现方式最让人容易理解,我最初也是通过这篇文章对跳表有了更进一步的认识,所以,真的要在这里感谢这篇文章的主人。一年之后,我发现自己对跳表的认识又模糊不清了,所以最先想到的也是这篇文章。今天再次拜读此文,同时实现了其中未给出的删除方法。并增加了泛型,但泛型也只是对value采用了泛型,对Key依然采用原文中的String类型。所以依然比较简单和局限。之所以贴出来,是为了增进自己对Skip List的理解和作为备忘。原文的链接如之前所述,原文具体作者其实我也不知道是谁,只想在此默默的说声感谢。当然了,若原文作者觉得我有什么冒犯或侵权的行为,我会立马删帖。

关于跳表的定义和介绍,读者可以参考原文。这里就直接给出原码了,这里的原码与原文的唯一的一点区别就是,我这里给出了原文没给出的删除方法(原文其实参考的是一篇英文文章,英文文章给出了删除方法,我直到后来才发现,不过自己的实现和英文文章想比,代码略显多余,此处贴出来的是我自己实现的删除方法)。可能实现上比较糟糕,所以也恳请大家批评指正!!!

1 对跳表中各个元素(键值对)的封装类SkipListEntry.java

public class SkipListEntry<v>{ public String key; public V value; public int pos; // 主要为了打印 链表用 public SkipListEntry<v deep="6"> up, down, left, right; // 上下左右 四个指针 public static String negInf = new String("-oo"); // 负无穷 public static String posInf = new String("+oo"); // 正无穷 public SkipListEntry(String k, V v) {  key = k;  value = v;  up = down = left = right = null; } public V getValue() {  return value; } public String geTKEy() {  return key; } public V setValue(V val) {  V oldValue = value;  value = val;  return oldValue; } @SuppressWarnings("unchecked") public boolean equals(Object o) {  SkipListEntry<v> entry;  try  {   entry = (SkipListEntry<v>) o; // 检测类型  } catch (ClassCastException ex)  {   return false;  }  return (entry.getKey() == key) && (entry.getValue().equals(value)); } public String toString() {  return "(" + key + "," + value + ")"; }}

--结束END--

本文标题: Java实现跳跃表(skiplist)的简单实例

本文链接: https://lsjlt.com/news/223272.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java实现跳跃表(skiplist)的简单实例
    跳跃链表是一种随机化数据结构,基于并联的链表,其效率可比拟于二叉查找树(对于大多数操作需要O(log n)平均时间),并且对并发算法友好。基本上,跳跃列表是对有序的链表增加上附加的前进链接,增加是以随机化的方式进行的,所以在列表中的查找可以...
    99+
    2023-05-31
    java 跳跃表 skiplist
  • Java实现跳跃表的示例详解
    跳表全称叫做跳跃表,简称跳表,是一个随机化的数据结构,实质就是一种可以进行二分查找的有序链表。跳表在原有的有序列表上面增加多级索引,通过索引来实现快速查找。跳表不仅能提高搜索性能,同...
    99+
    2024-04-02
  • python实现跳表SkipList的示例代码
    跳表 跳表,又叫做跳跃表、跳跃列表,在有序链表的基础上增加了“跳跃”的功能,由William Pugh于1990年发布,设计的初衷是为了取代平衡树(比如红黑树)。 Redis、LevelDB 都是著名的 Key-Va...
    99+
    2022-06-02
    python 跳表SkipList python 跳表
  • GO实现跳跃表的示例详解
    目录跳跃表介绍跳跃表的实现跳跃表的结构创建跳跃表跳跃表的插入和删除跳跃表的排名操作跳跃表的区间操作完整实现跳跃表介绍 跳跃表(skiplist)是一种有序的数据结构,它通过建立多层&...
    99+
    2022-12-19
    GoLang跳跃表 GO跳跃表
  • 怎么设计实现跳表SkipList
    本篇内容介绍了“怎么设计实现跳表SkipList”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!快速了解跳表...
    99+
    2024-04-02
  • 详解Java中跳跃表的原理和实现
    目录一、跳跃表的引入二、算法分析1.时间复杂度2.空间复杂度三、跳跃表介绍四、跳跃表的实现1.数据结构定义2.查找3.插入4.删除五、实战1.代码2.测试结果一、跳跃表的引入 对有序...
    99+
    2022-12-27
    Java实现跳跃表 Java跳跃表原理 Java跳跃表
  • Redis跳跃表的基本原理和实现
    目录一、概述二、跳跃表的实现2.1 跳跃表节点的zskiplisNode结构定义2.2 zskiplist结构的定义三、结束一、概述 跳跃表(skiplist)是一种有序数...
    99+
    2024-04-02
  • Java程序单实例运行的简单实现
    目录需求实现方式代码实现第一种实现(端口控制)第二种实现(文件锁)第三种方式(端口+文件锁)需求 最近做了个java项目,功能完成后打包安装了,发现可以点开多个实例,因为桌面显示托盘...
    99+
    2024-04-02
  • Java实现九宫格的简单实例
     Java实现九宫格的简单实例九宫格:共有三行三列九个格子,从1到9共九个数字不重复地填入这九个格子中,条件是每行、每列、两个对角线上三个数字的和相等。下面用Java实现九宫格:public class NineTable { ...
    99+
    2023-05-31
    java 九宫格 ava
  • Java 链表的定义与简单实例
     Java 链表的定义与简单实例Java实现链表主要依靠引用传递,引用可以理解为地址,链表的遍历多使用递归,这里我存在一个疑问同一个类的不同对象的的相同方法的方法内调用算不算递归.这里我写的是单向链表;package com.ex...
    99+
    2023-05-31
    java 链表 ava
  • JavaScript实现简单表单验证案例
    本文实例为大家分享了JavaScript实现简单表单验证的具体代码,供大家参考,具体内容如下 一.需求分析 要实现的功能: 1.出现如下图所示的内容:(HTML和CSS完成) 2....
    99+
    2024-04-02
  • Java跳跃游戏实例真题解决思路详解
    目录变式题—跳跃游戏 I一、题目描述二、思路三、代码变式题—跳跃游戏 II一、题目描述二、思路三、代码变式题—跳跃游戏 I 一、题目描述 给定一个...
    99+
    2022-11-13
    Java跳跃游戏 Java跳跃游戏实例
  • java 实现音乐播放器的简单实例
    java 实现音乐播放器的简单实例实现效果图:代码如下package cn.hncu.games;import java.applet.Applet;import java.applet.AudioClip;import java.awt....
    99+
    2023-05-31
    java 音乐 播放器
  • java 实现MD5加密算法的简单实例
    java 实现MD5加密算法的简单实例实现代码:import java.security.NoSuchAlgorithmException; public class MD5HashUtil { private MessageDig...
    99+
    2023-05-31
    java md5 加密算法
  • Android Studio实现简单的页面跳转(简单教程)
                     项目实现:(实现Android Studio 基本有两种实现方式:一种为.MainActivity跳转;第二种是Relatelayout布局跳转。                   这里着重介绍第一种:(...
    99+
    2023-09-21
    android studio android ide java androidx
  • Java简单实现UDP和TCP的示例
    TCP实现TCP协议需要在双方之间建立连接,通过输入输出流来进行数据的交换,建立需要通过三次握手,断开需要四次挥手,保证了数据的完整性,但传输效率也会相应的降低。简单的TCP实现//服务端public class TcpServer { p...
    99+
    2023-05-30
    java udp tcp
  • Java编程实现springMVC简单登录实例
    Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,从而在使用Sp...
    99+
    2023-05-30
    springmvc 登录 ava
  • android studio实现简单的页面跳转
    运用intent组件实现简单的跳转 主页面 Button button1,button2,button3; //xml文件定义的id @Override protected void onCreate(Bundle savedI...
    99+
    2023-10-11
    android studio android java
  • Java WebService 简单实例(附实例代码)
    下面是一个简单的Java WebService实例,使用了JAX-WS标准:1. 编写WebService接口:```javaimp...
    99+
    2023-08-17
    Java
  • 实现的简单python例子
    尊重作者,本文转载自:http://blog.csdn.net/oMuYeJingFeng1/article/details/23822279 1、输入3个数字,从小到大输出:x = int(input('please input x:')...
    99+
    2023-01-31
    例子 简单 python
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作