分离链接法:
public class SeparateChainingHashTable<AnyType>{
private static final int DEFAULT_TABLE_SIZE=101;
private List<AnyType> []theLists;
private int currentSize;

public SeparateChainingHashTable()
{this(DEFAULT_TABLE_SIZE);}

public SeparateChainingHashTable(int size){
theLists=new LinkedList[nextPrime(size)];
for(int i=0;i<theLists.length;i++)
theLists[i]=new LinkedList<AnyType>();
}

public void makeEmpty(){
for(int i=0;i<theLists.length;i++)
theList[i].clear();
current=0;
}

public boolean contains(AnyType x){
List<AnyType> whichList=theLists[myhash(x)];
return whichList.contains(x);
}

public void insert(AnyType x){
List<AnyType> whichList=theLists[myhash(x)];
if(!whichList.contains(x)){
whichList.add(x);
if(++currentSize>theLists.length)
rehash();
}
}

public void remove(AnyType x){
List<AnyType> whichList=theLists[myhash(x)];
if(whichList.contains(x)){
whichList.remove(x);
currentSize--;
}
}

public void rehash(){
List<AnyType> [] oldLists=theLists;
theList=new List[nextPrime(2*theList.length)];
for(int j=0;i<theList.length;j++)
theList[i]=new LinkedList<AnyType>();
currentSize=0;
for(int i=0;i<oldLists.length;i++)
for(AnyType item:oldLists[i])
insert(item);
//这里调用的自己写的类的insert方法,而不是对oldList对象进行add
}
}

public int myhash(AnyType x){
int hashVal=x.hashCode();
hashVal=hashVal%theLists.length;
if(hashVal<0)
hashVal=hashVal+theLists.length;
return hashVal;
}
---------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------
平方探测:

public class QuadraticProbingHashTable<AnyType>{
private static final int DEFAULT_TABLE_SIZE=11;
private HashEntry<AnyType> [] array;
private int currentSize;

public static class HashEntry<AnyType>{
public AnyType element;
public boolean isActive;
public HashEntry(AnyType e)
{this(e,true);}
public HashEntry(AnyType e,boolean i)
{element=e;isActive=i;}
}

public QuadraticProbingHashTable()
{this(DEFAULT_TABLE_SIZE);}

public QuadraticProbingHashTable(int size)
{allocateArray(size);makeEmpty();}

public void allocateArray(int arraysize)
{array=new HashEntry(arraysize);}

public void makeEmpty(){
currentSize=0;
for(int i=0;i<array.length;i++)
array[i]=null;
}

public boolean contains(AnyType x){
int currentPos=findPos(x);
return isActive(currentPos);
}

public int findPos(AnyType x){
int offset=1;
int currentPos=myhash(x);
//使用平方探测法进行散列
while(array[currentPos]!=null&&
!array[currentPos].element.equal(x)){
currentPos=currentPos+offset;
offset=offset+2;
if(currentPos>array.length)
currentPos=currentPos-array.length;
}
return currentPos;
}

public boolean isActive(int currentPos){
return array[currentPos]!=null&&
array[currentPos].isActive;
}

public void insert(AnyType x){
int currentPos=findPos(x);
if(isActive(currentPos))
return;
array[currentPos]=new HashEntry<AnyType>(x,true);
if(++currentSize>array.length/2)
rehash();
}

private void rehash(){
HashEntry<AnyType> []oldArray=array;
allocateArray(nextPrime(2*oldArray.length))
currentSize=0;
for(int i=0;i<oldArray.length;i++)
if(oldArray[i]!=null&&oldArray[i].isActive)
insert(oldArray[i].element);
}

public void remove(AnyType x){
int currentPos=findPos(x);
if(isActive(currentPos))
array[currentPos].isActive=false;
}

}

关于hash冲突的解决的更多相关文章

  1. hash 冲突及解决办法。

    hash 冲突及解决办法. 关键字值不同的元素可能会映象到哈希表的同一地址上就会发生哈希冲突.解决办法: 1)开放定址法:当冲突发生时,使用某种探查(亦称探测)技术在散列表中形成一个探查(测)序列.沿 ...

  2. Hash冲突的解决--暴雪的Hash算法

    Hash冲突的解决--暴雪的Hash算法https://usench.iteye.com/blog/2199399https://www.bbsmax.com/A/kPzOO7a8zx/

  3. Cuckoo Hash——Hash冲突的解决办法

    参考文献: 1.Cuckoo Filter hash算法 2.cuckoo hash 用途: Cuckoo Hash(布谷鸟散列).问了解决哈希冲突的问题而提出,利用较少的计算换取较大的空间.占用空间 ...

  4. Hash冲突的解决方法

    虽然我们不希望发生冲突,但实际上发生冲突的可能性仍是存在的.当关键字值域远大于哈希表的长度,而且事先并不知道关键字的具体取值时.冲突就难免会发 生.另外,当关键字的实际取值大于哈希表的长度时,而且表中 ...

  5. Hash冲突以及解决

    哈希函数:它把一个大范围的数字哈希(转化)成一个小范围的数字,这个小范围的数对应着数组的下标.使用哈希函数向数组插入数据后,这个数组就是哈希表. 冲突 当冲突产生时,一个方法是通过系统的方法找到数组的 ...

  6. hash冲突解决和javahash冲突解决

    其实就是四种方法的演变 1.开放定址法 具体就是把数据的标志等的对长度取模 有三种不同的取模 线性探测再散列 给数据的标志加增量,取模 平方探测再散列 给数据的标志平方,取模 随机探测再散列 把数据的 ...

  7. Map之HashMap的get与put流程,及hash冲突解决方式

    在java中HashMap作为一种Map的实现,在程序中我们经常会用到,在此记录下其中get与put的执行过程,以及其hash冲突的解决方式: HashMap在存储数据的时候是key-value的键值 ...

  8. hash冲突随笔

    一:hash表 也叫散列表,以key-value的形式存储数据,就是将需要存储的关键码值通过hash函数映射到表中的位置,可加快访问速度. 二:hash冲突 如果两个相同的关键码值通过hash函数映射 ...

  9. 链表法解决hash冲突

    /* @链表法解决hash冲突 * 大单元数组,小单元链表 */ #pragma once #include <string> using namespace std; template& ...

随机推荐

  1. scanf函数(初学者)

    scanf函数称为格式输入函数,即按用户指定的格式从键盘上把数据输入到指定的变量之中. 1.scanf函数的一般形式:scanf函数是一个标准的库函数,它的函数原型在头文件“stdio.h”中,与pr ...

  2. golang中的init函数以及main函数

    首先我们看一个例子:init函数: init 函数可在package main中,可在其他package中,可在同一个package中出现多次. main函数 main 函数只能在package ma ...

  3. Sketch webView方式插件开发技术总结

    相信大家都对Sketch有一定的了解和认识.除了基础的矢量设计功能以外,插件更是让Sketch保持强大的独门秘籍.Sketch开放了第三方插件接口,设计师可以在几百种的插件中轻松找到适合自己工作方式的 ...

  4. Arduino IDE for ESP8266 项目(4)HTTP客户端+服务端

    Arduio for esp8266  官网API:http://arduino-esp8266.readthedocs.io/en/latest/esp8266wifi/readme.html 很有 ...

  5. 转载 SpringMVC详解(三)------基于注解的入门实例

    目录 1.在 web.xml 文件中配置前端处理器 2.在 springmvc.xml 文件中配置处理器映射器,处理器适配器,视图解析器 3.编写 Handler 4.编写 视图 index.jsp ...

  6. 单例模式和JDBC

    配置文件: driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/blog user=root user=1234 properti ...

  7. 关于Nginx理解

    由于微信小程序要使用Https,但是又不能修改已有线上的配置.所以最简单的方法就是使用nginx转发,在nginx上使用https,然后再转发到内部服务器.Nginx由于其优良的性能.一台4核16GB ...

  8. Linux命令——find/grep

    这两个命令写起来会很多,这里只简单的写一些东西,加深自己的印象. 一.find find命令主要作用是沿着文件层次结构向下遍历,匹配符合条件的文件,并执行相应的操作. 1)命令格式 find [参数] ...

  9. 9、链表 & 状态机 & 多线程

    链表的引入 从数组的缺陷说起 数组有2个缺陷:一个是数组中所有元素的类型必须一致:第二个是数组的元素个数必须事先制定并且一旦指定之后不能更改. 如何解决数组的2个缺陷:数组的第一个缺陷靠结构体去解决. ...

  10. php和js字符串的acsii码函数

    简单普及下编码知识: javascript中有charCodeAt(),根据字符查找ascii码. String.fromCharCode(),根据ascii码查找对应的字符. console.log ...