详解如何使用java实现Open Addressing

 更新时间:2020年12月17日 11:51:35   作者:weixin_43146543  
这篇文章主要介绍了详解如何使用java实现Open Addressing,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

你好! 我们这里总共向您提供三种open addression的方法,分别为linear probing、quadratic probing和double hashing。

Linear Probing

Linear probing是计算机程序解决散列表冲突时所采取的一种策略。散列表这种数据结构用于保存键值对,并且能通过给出的键来查找表中对应的值。Linear probing这种策略是在1954年由Gene Amdahl, Elaine M. McGraw,和 Arthur Samuel 所发明,并且最早于1963年由Donald Knuth对其进行分析。

  • 假设A是哈希表的一个容量N为15的数组;
  • 将Keys(5、9、12、24、31、40、47、53、62、71)使用linear probing按照顺序依次插入到数组中。
public static void main(String[] args) {
 int N = 15; 
 int[] A = new int [N];
 int[] Keys = {5, 9, 12, 24, 31, 40, 47, 53, 62, 71};
 
 for (int i = 0; i < Keys.length; i++) {
  int j = 0;
  int Position = Keys[i] % N;
  while (A[Position] != 0) {
  j = j + 1;
  Position = Keys[i] % N + j;
  }
  A[Position] = Keys[i];  
 }
 for (int i = 0; i < A.length; i++) {
  System.out.println(A[i]);
 } 
 }

Quadratic Probing

Quadratic probing是计算机程序解决散列表冲突时所采取的另一种策略,用于解决散列表中的冲突。Quadratic probing通过获取原始哈希索引并将任意二次多项式的连续值相加,直到找到一个空槽来进行操作。

  • 假设A是哈希表的一个容量N为15的数组;
  • 将Keys(5、9、12、24、31、40、47、53、62、71)使用quadratic probing按照顺序依次插入到数组中。
public static void main(String[] args) {
 int N = 15; 
 int[] A = new int [N];
 int[] Keys = {5, 9, 12, 24, 31, 40, 47, 53, 62, 71};
 
 for (int i = 0; i < Keys.length; i++) {
  int j = 0;
  int Position = Keys[i] % N;
  while (A[Position] != 0) {
  j = j + 1;
  Position = (Keys[i] % N + j*j) % N;
  }
  A[Position] = Keys[i];  
 }
 for (int i = 0; i < A.length; i++) {
  System.out.println(A[i]);
 } 
 }

Double Hashing

Double hashing是计算机程序解决散列表冲突时所采取的另一种策略,与散列表中的开放寻址结合使用,通过使用密钥的辅助哈希作为冲突发生时的偏移来解决哈希冲突。具有open addressing的double hashing是表上的经典数据结构。

  • 假设A是哈希表的一个容量N为15的数组;
  • 将Keys(5、9、12、24、31、40、47、53、62、71)使用double hashing(我们假设h'(k)为13 - (k mod 13))按照顺序依次插入到数组中。
public static void main(String[] args) {
 int N = 15; 
 int[] A = new int [N];
 int[] Keys = {5, 9, 12, 24, 31, 40, 47, 53, 62, 71};
 
 for (int i = 0; i < Keys.length; i++) {
  int j = 0;
  int Position = (Keys[i] % N + (13 - (Keys[i] % 13)) * j) % N;
  while (A[Position] != 0) {
  j = j + 1;
  Position = (Keys[i] % N + (13 - (Keys[i] % 13)) * j) % N;
  }
  A[Position] = Keys[i];  
 }
 for (int i = 0; i < A.length; i++) {
  System.out.println(A[i]);
 } 
 }

到此这篇关于详解如何使用java实现Open Addressing的文章就介绍到这了,更多相关java实现Open Addressing内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot集成P6Spy实现SQL日志的记录详解

    SpringBoot集成P6Spy实现SQL日志的记录详解

    P6Spy是一个框架,它可以无缝地拦截和记录数据库活动,而无需更改现有应用程序的代码。一般我们使用的比较多的是使用p6spy打印我们最后执行的sql语句
    2022-11-11
  • Spring MVC返回的json去除根节点名称的方法

    Spring MVC返回的json去除根节点名称的方法

    这篇文章主要介绍了Spring MVC返回的json去除根节点名称的方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-09-09
  • Java并发编程示例(三):线程中断

    Java并发编程示例(三):线程中断

    这篇文章主要介绍了Java并发编程示例(三):线程中断,在本节,我们所开发的示例程序将会创建一个线程,五秒钟后,利用中断机制强制中止这个线程,需要的朋友可以参考下
    2014-12-12
  • Java面向对象基础教学(三)

    Java面向对象基础教学(三)

    这篇文章主要介绍了Java的面相对象编程思想,包括类对象方法和封装继承多态等各个方面的OOP基本要素,非常推荐,需要的朋友可以参考下,希望可以对你有所帮助
    2021-07-07
  • Java 基础语法之解析 Java 的包和继承

    Java 基础语法之解析 Java 的包和继承

    包是组织类的一种方式,继承顾名思义,比如谁继承了长辈的产业,其实这里的继承和我们生活中的继承很类似,下面文字将为大家详细介绍Java的包和继承
    2021-09-09
  • Java Stream 流中 Collectors.toMap 的用法详解

    Java Stream 流中 Collectors.toMap 的用法详解

    这篇文章主要介绍了Stream 流中 Collectors.toMap 的用法,Collectors.toMap()方法是把List转Map的操作,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2024-01-01
  • IDEA强制清除Maven缓存的实现示例

    IDEA强制清除Maven缓存的实现示例

    清除项目缓存是一个常见的操作,本文主要介绍了IDEA强制清除Maven缓存的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-07-07
  • 解决java.util.NoSuchElementException异常正确方法

    解决java.util.NoSuchElementException异常正确方法

    java.util.NoSuchElementException是Java中的一种异常,表示在迭代器或枚举中找不到元素,这篇文章主要给大家介绍了关于解决java.util.NoSuchElementException异常的相关资料,需要的朋友可以参考下
    2023-11-11
  • Java线程池的分析和使用详解

    Java线程池的分析和使用详解

    本篇文章主要介绍了Java线程池的分析和使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2021-11-11
  • Java中的日期时间类实例详解(Date、Calendar、DateFormat)

    Java中的日期时间类实例详解(Date、Calendar、DateFormat)

    在JDK1.0中,Date类是唯一的一个代表时间的类,但是由于Date类不便于实现国际化,所以从JDK1.1版本开始,推荐使用Calendar类进行时间和日期处理,这篇文章主要介绍了Java中的日期时间类详解(Date、Calendar、DateFormat),需要的朋友可以参考下
    2023-11-11

最新评论