数据结构--解决散列冲突,平方探测法
来源:互联网 发布:巴西黑帮知乎 编辑:程序博客网 时间:2024/06/07 11:34
上代码:
package com.itany.quadraticprobing;import java.util.LinkedList;import java.util.List;//使用平方探测的散列表 来解决散列时的冲突问题public class QuadraticProbingHashTable<T>{ private static final int DEFAULT_TABLE_SIZE=11; private HashEntry<T>[] array; private int currentSize;//the number of occupied cells //这个类用来装数据 还有一些标记 来标记是否active 也就是被删除(不是真被删除)所以需要一个类来进行封装 private static class HashEntry<T> { private T element;//the element private boolean isActive;//false if marked deleted public HashEntry(T element) { this(element,true); } public HashEntry(T element,boolean i) { this.element=element; isActive=i; } } public QuadraticProbingHashTable() { this(DEFAULT_TABLE_SIZE); } public QuadraticProbingHashTable(int size) { allocateArray(size); makeEmpty(); } public void makeEmpty() { currentSize=0; for(int i=0;i<array.length;i++) { array[i]=null; } } //判断是否存在 必须先找到该元素位置 然后再通过位置判断是否懒惰删除了(标记为删除) public boolean contains(T t) { int curPosition=findPos(t); return isActive(curPosition); } public void insert(T t) { int curPosition=findPos(t); if(isActive(curPosition)) return; array[curPosition]=new HashEntry<T>(t); if(++currentSize>array.length/2)//探测法要保证空的位置>=一半空间 reHash(); } public void remove(T t) { int curPosition=findPos(t); if(array[curPosition].isActive) array[curPosition].isActive=false;//改变属性 } private void reHash() { HashEntry<T>[] oldArray=array;//复制一下一会要用 theLists在重新new一个 array=new HashEntry[nextPrime(2*array.length)]; currentSize=0; //把原来的元素复制到新的数组中 注意是把集合中的元素复制进去 for(int i=0;i<oldArray.length;i++) { if(oldArray[i]!=null && oldArray[i].isActive) insert(oldArray[i].element); } } private int findPos(T t) { int offset=1; int curPosition=myHash(t); //如果该位置里面有值 并且是这个hash没出现过的 那么就要继续寻找其他位置 如果出现了重复的 直接返回 while(array[curPosition]!=null && !array[curPosition].element.equals(t)) { //这是进行平方探测的快速方法 f(i)=f(i-1)+2i-1 curPosition+=offset; offset+=2; if(curPosition>array.length) curPosition-=array.length; } return curPosition; } private static boolean isPrime(int num) { int i=1; while((num%(i+1))!=0) { i++; } if(i==num-1) { return true; } else { return false; } } private static int nextPrime(int num) { while(!isPrime(num)) { num++; } return num; } private int myHash(T t) { int hashValue=t.hashCode(); hashValue%=array.length; return hashValue; } //把判断是否被删除合成一个方法 在做contains判断时会用到 private boolean isActive(int curPosition) { return array[curPosition]!=null && array[curPosition].isActive; } private void allocateArray(int arraySize) { array=new HashEntry[arraySize]; } }
package com.itany.quadraticprobing;public class Test{ public static void main(String[] args) { QuadraticProbingHashTable<Integer> sc=new QuadraticProbingHashTable<Integer>(); System.out.println(sc.contains(10)); sc.insert(10); System.out.println(sc.contains(10)); sc.remove(10); System.out.println(sc.contains(10)); } }结果:
false
true
false
0 0
- 数据结构--解决散列冲突,平方探测法
- 散列表(平方探测法解决冲突)
- 数据结构与算法之散列(线性/平方/双平方探测法)<八>
- hash解决冲突之---平方探测
- 平方探测和线性探测解决散列表冲突的区别(优点及缺点)
- 【除留余数法定义hash函数+平方探测法解决hash冲突】数据结构实验之查找五:平方之哈希表
- 数据结构:散列2(探测法)
- java 解决Hash(散列)冲突的四种方法--开放定址法(线性探测,二次探测,伪随机探测)、链地址法、再哈希、建立公共溢出区
- 数据结构--解决散列冲突,分离链接法
- SDUT 3377 数据结构实验之查找五:平方之哈希表(平方探测处理冲突)
- 数据结构实验之查找五:平方之哈希表(详解平方法解决哈希表冲突)
- 详细图解什么叫平方探查法即二次探测再散列和线性探测再散列(数据结构 哈希函数 哈希冲突)
- 散列表实现(平方探测法)
- 平方探测法hash
- SDUT 3379 数据结构实验之查找七:线性之哈希表(线性探测法解决冲突)
- 开放寻址法解决散列冲突
- 1023. 简单哈希2 哈希冲突的平方探测法
- 建立Hash表(散列表)(运用线性探测法解决冲突)
- C语言的学习方法
- 接口和抽象类有什么区别
- android攻城狮学习笔记3/19『个人笔记!非教程!慎入!』
- css01
- 【数位DP】 HDU 3652 B-number
- 数据结构--解决散列冲突,平方探测法
- Tomcat-安装-配置-主要目录介绍
- Spring学习_06_Spring中事物属性(XML方式)重要
- 在仿YP做火车下部弹框(可做公共控件)遇到的release问题
- JVM 各种内存参数设置
- Java并发编程实践(Java concurrency in practice)在线示例学习
- php自动加载+命名空间
- 获取服务器出口IP
- java设计模式之工厂模式